Skip to content

Chương 2_Trang 8_Tối ưu hóa hàm python với Data input và Tensorflow models Power 7 Ball 55

PhD Le Toan Thang edited this page Apr 11, 2024 · 3 revisions

Tối ưu hóa hàm python với Data input và Tensorflow models Power 7 Ball 55

Cấu trúc và nội dung dữ liệu file csv: power7b55.csv:

2;4;19;32;35;39;49
9;13;28;33;50;53;47
6;9;26;27;34;47;41
6;7;16;21;34;50;31
1;12;23;43;48;52;30
13;15;21;26;34;35;45
11;14;15;24;34;53;18
9;31;39;41;47;48;3
22;32;39;46;48;49;43
10;14;17;27;29;40;25
20;28;30;40;45;52;32

Các đoạn code python dùng tensorflow models để tối ứu input file data csv:

import numpy as np
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Input

# Đọc dữ liệu từ tệp CSV
lottery_data = pd.read_csv(r"C:\Python311\workspaces\power7b55.csv", sep=';').values

# Chuẩn hóa dữ liệu về khoảng [0, 1]
normalized_data = lottery_data / 55.0

# Tạo dữ liệu huấn luyện và mục tiêu huấn luyện
previous_draws = normalized_data[:-1]
next_draws = normalized_data[1:]

# Xây dựng mô hình mạng neural
model = Sequential()
model.add(Dense(16, activation='relu', input_shape=(7,)))
model.add(Dense(16, activation='relu'))
model.add(Dense(7, activation='sigmoid'))

# Biên dịch mô hình
model.compile(optimizer='adam', loss='mse')

# Huấn luyện mô hình
model.fit(previous_draws, next_draws, epochs=100)

# Dự đoán kỳ quay thưởng tiếp theo
last_draw = normalized_data[-1:]
predicted_next_draw = model.predict(last_draw)

# Chuyển đổi dự đoán về dạng ban đầu
predicted_next_draw = predicted_next_draw * 55.0

rounded_predictions = np.round(predicted_next_draw)
print("Dự đoán kỳ quay thưởng tiếp theo (làm tròn):")
print(rounded_predictions)

Và khi chạy chúng ta gặp cảnh báo:

C:\Python311\Lib\site-packages\keras\src\layers\core\dense.py:88: UserWarning: Do not pass an input_shape/input_dim argument to a layer. When using Sequential models, prefer using an Input(shape) object as the first layer in the model instead. super().init(activity_regularizer=activity_regularizer, **kwargs

Đó chỉ là một cảnh báo nhắc nhở từ thư viện Keras. Để khắc phục cảnh báo này, chúng ta có thể sử dụng lớp Input từ tensorflow.keras.layers như là lớp đầu tiên trong mô hình thay vì sử dụng Dense với đối số input_shape. Điều này sẽ giúp bạn tránh cảnh báo và tiếp tục chạy mô hình mạng neural của bạn.

Chúng ta thay code sau:

import numpy as np
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Input

# Đọc dữ liệu từ tệp CSV
lottery_data = pd.read_csv(r"C:\Python311\workspaces\power7b55.csv", sep=';').values

# Chuẩn hóa dữ liệu về khoảng [0, 1]
normalized_data = lottery_data / 55.0

# Tạo dữ liệu huấn luyện và mục tiêu huấn luyện
previous_draws = normalized_data[:-1]
next_draws = normalized_data[1:]

# Xây dựng mô hình mạng neural
model = Sequential()
model.add(Input(shape=(7,)))  # Sử dụng lớp Input thay vì Dense với input_shape
model.add(Dense(16, activation='relu'))
model.add(Dense(16, activation='relu'))
model.add(Dense(7, activation='sigmoid'))

# Biên dịch mô hình
model.compile(optimizer='adam', loss='mse')

# Huấn luyện mô hình
model.fit(previous_draws, next_draws, epochs=100)

# Dự đoán kỳ quay thưởng tiếp theo
last_draw = normalized_data[-1:]
predicted_next_draw = model.predict(last_draw)

# Chuyển đổi dự đoán về dạng ban đầu
predicted_next_draw = predicted_next_draw * 55.0

rounded_predictions = np.round(predicted_next_draw)
print("Dự đoán kỳ quay thưởng tiếp theo (làm tròn):")
print(rounded_predictions)

image

Bài toán tam xuất truyền thống ứng dụng trong Python AI xử lý dự báo điểu chỉnh như thế nào?

Sau khi chạy python tensoflow của ngày 7/4/2024 tôi ra được 2 giá trị 6 số như sau:
Số dự báo 7/4/2024: gọi tắt pre1 là 4, 5, 7, 24, 27, 30; còn kết quả thực tế 7/4/2024: gọi tắt là res1 là 3, 11, 15, 17, 24, 35;
Tiếp theo, hôm nay ngày 10/4/2024 tôi chạy lại hàm python tensorflow predict và ra được 1 cụm giá trị 6 số như sau:
Số dự báo 10/4/2024: gọi tắt pre2 là 4, 5, 13, 19, 27, 37; còn kết quả thực tế 10/4/2024 là chưa xác định tạm gọi là res2;
Vậy, nếu tôi muốn tính ra res2 luôn bằng cách tính hàm tam xuất nghĩa là: res2 = (pre2 x res1) / pre1, bạn có thể giúp tôi viết hàm python thuật toán tam xuất trên áp dụng Trị tuyệt đối, giá trị trung bình và những thuật toán liên quan khác để tính ra 6 giá trị của res2?
Để tính giá trị res2 dựa trên pre2, res1, và pre1, bạn có thể sử dụng hàm Python sau:
import numpy as np

def tam_xuat(pre2, res1, pre1):
    # Tính giá trị trung bình của pre2 và res1
    mean_pre2 = np.mean(pre2)
    mean_res1 = np.mean(res1)
    
    # Tính giá trị truyền thống tam xuất
    res2 = (mean_pre2 * mean_res1) / pre1
    
    # Áp dụng giá trị trung bình và trị tuyệt đối cho res2
    res2 = np.abs(res2)
    
    # Làm tròn giá trị res2 thành số nguyên
    res2 = np.round(res2).astype(int)
    
    return res2

Bạn có thể sử dụng hàm này bằng cách gọi nó và truyền các tham số pre2, res1 và pre1 vào:

pre2 = [4, 5, 13, 19, 27, 37]
res1 = [3, 11, 15, 17, 24, 35]
pre1 = [4, 5, 7, 24, 27, 30]

res2 = tam_xuat(pre2, res1, pre1)
print("Giá trị res2:", res2)

Hàm tam_xuat sẽ tính giá trị res2 dựa trên pre2, res1 và pre1 bằng cách áp dụng giá trị trung bình và trị tuyệt đối. Kết quả sẽ được làm tròn thành số nguyên và trả về giá trị res2.

Tư duy mở rộng

Hãy giải thích và tìm ra sai số sau khi tôi dùng hàm của bạn viết:
import numpy as np

def tam_xuat(pre2, res1, pre1):
    # Tính giá trị trung bình của pre2 và res1
    mean_pre2 = np.mean(pre2)
    mean_res1 = np.mean(res1)
    
    # Tính giá trị truyền thống tam xuất
    res2 = (mean_pre2 * mean_res1) / pre1
    
    # Áp dụng giá trị trung bình và trị tuyệt đối cho res2
    res2 = np.abs(res2)
    
    # Làm tròn giá trị res2 thành số nguyên
    res2 = np.round(res2).astype(int)
    
    return res2

pre2 = [4, 5, 13, 19, 27, 37]
res1 = [3, 11, 15, 17, 24, 35]
pre1 = [4, 5, 7, 24, 27, 30]

res2 = tam_xuat(pre2, res1, pre1)
print("Giá trị res2:", res2)
kết quả tính ra là: Giá trị res2: [77 61 44 13 11 10]   
; nhưng tôi làm thủ công từng con số thì lại phải ra là: Giá trị res2: [4, 5, 28, 13, 24, 43] ?
Xin lỗi vì sự nhầm lẫn. Tôi đã hiểu vấn đề gây ra sự không chính xác trong kết quả tính toán của hàm tam_xuat.

Có một số điểm cần được sửa đổi trong hàm tam_xuat để đạt được kết quả như bạn mong muốn. 
Hãy sử dụng phiên bản cập nhật của hàm tam_xuat dưới đây:

import numpy as np

def tam_xuat(pre2, res1, pre1):
    # Tính giá trị trung bình của pre2 và res1
    mean_pre2 = np.mean(pre2)
    mean_res1 = np.mean(res1)

    # Tính mảng res2 dựa trên từng phần tử của pre2, res1 và pre1
    res2 = [(pre2[i] * mean_res1) / pre1[i] for i in range(len(pre2))]
    
    # Áp dụng giá trị trung bình và trị tuyệt đối cho từng phần tử của res2
    res2 = [np.abs(np.round(val).astype(int)) for val in res2]
    
    return res2

pre2 = [4, 5, 13, 19, 27, 37]
res1 = [3, 11, 15, 17, 24, 35]
pre1 = [4, 5, 7, 24, 27, 30]

res2 = tam_xuat(pre2, res1, pre1)
print("Giá trị res2:", res2)
  • Business Analyst (BA) là một nghề tồn tại từ lâu trên toàn cầu, nhưng ở Việt Nam thì vẫn còn khá mới (xuất hiện khoảng hơn 27 năm).
  • Tôi thực sự đánh giá cao nghề này và trong quá trình làm việc, tôi đã gặp phải nhiều thách thức, từ đó tôi đã hiểu rõ những điểm mạnh và điểm yếu của bản thân. Tôi nhận thấy rằng trong lĩnh vực này có nhiều vấn đề phức tạp và khó khăn, nhưng khi chúng được giải quyết, thì cảm giác thật tuyệt vời.
  • BA xuất hiện với mục tiêu giải quyết vấn đề. Đó có thể là biến một điều không tốt thành điều tốt hơn, hoặc cải thiện những điều đã tốt để trở nên tốt hơn. Việc mang lại ý nghĩa cho người khác thực sự là một điều mà tôi khó lòng tranh cãi hay bỏ qua.
Clone this wiki locally