彩票分析与预测

Создано: 2 декабря 2024 г.

Отвечено с использованием O1 Preview от Chat01

Вопрос

import pandas as pd
import numpy as np
from collections import Counter, defaultdict
import random
import time
import datetime
from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import StandardScaler
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
import warnings
import openpyxl # 确保已安装 openpyxl 库

warnings.filterwarnings('ignore')

class LotteryAnalyzer:
def init(self):
self.front_range = range(1, 36) # 前区号码范围1-35
self.back_range = range(1, 13) # 后区号码范围1-12
self.front_columns = ['前区1', '前区2', '前区3', '前区4', '前区5']
self.back_columns = ['后区1', '后区2']

text
def read_excel_file(self, file_path): """读取Excel文件并进行基础处理""" try: print(f"开始读取Excel文件: {file_path}") start_time = time.time() df = pd.read_excel(file_path) # 确保所有列都是数值类型 for col in self.front_columns + self.back_columns: df[col] = pd.to_numeric(df[col], errors='coerce') end_time = time.time() print(f"Excel文件读取完成,耗时 {end_time - start_time:.2f} 秒") return df except Exception as e: print(f"读取Excel文件时发生错误: {e}") return None def calculate_missing_values(self, df): """计算每个号码的遗漏值""" missing_values = { 'front': defaultdict(int), 'back': defaultdict(int) } # 初始化遗漏值计数器 for num in self.front_range: missing_values['front'][num] = 0 for num in self.back_range: missing_values['back'][num] = 0 # 计算每期之间的遗漏值 latest_appearances = { 'front': defaultdict(int), 'back': defaultdict(int) } for idx, row in df.iterrows(): front_numbers = [row[col] for col in self.front_columns] back_numbers = [row[col] for col in self.back_columns] # 更新前区遗漏值 for num in self.front_range: if num in front_numbers: missing_values['front'][num] = idx - latest_appearances['front'][num] latest_appearances['front'][num] = idx # 更新后区遗漏值 for num in self.back_range: if num in back_numbers: missing_values['back'][num] = idx - latest_appearances['back'][num] latest_appearances['back'][num] = idx return missing_values def analyze_hot_cold_numbers(self, df, periods=30): """分析冷热号""" recent_df = df.tail(periods) # 统计前区号码频率 front_numbers = [] for col in self.front_columns: front_numbers.extend(recent_df[col].tolist()) front_freq = Counter(front_numbers) # 统计后区号码频率 back_numbers = [] for col in self.back_columns: back_numbers.extend(recent_df[col].tolist()) back_freq = Counter(back_numbers) # 定义冷热号的阈值 front_threshold = np.mean(list(front_freq.values())) back_threshold = np.mean(list(back_freq.values())) # 将号码分类为冷号和热号 hot_cold = { 'front': {'hot': [], 'cold': []}, 'back': {'hot': [], 'cold': []} } for num in self.front_range: if front_freq.get(num, 0) > front_threshold: hot_cold['front']['hot'].append(num) else: hot_cold['front']['cold'].append(num) for num in self.back_range: if back_freq.get(num, 0) > back_threshold: hot_cold['back']['hot'].append(num) else: hot_cold['back']['cold'].append(num) return hot_cold, front_freq, back_freq def analyze_winning_trends(self, df, periods=10): """分析最近中奖号码的走势热度""" recent_df = df.tail(periods) # 计算近期号码出现频率 front_numbers = [] back_numbers = [] for col in self.front_columns: front_numbers.extend(recent_df[col].tolist()) for col in self.back_columns: back_numbers.extend(recent_df[col].tolist()) front_freq = Counter(front_numbers) back_freq = Counter(back_numbers) # 计算号码的连续出现情况 front_consecutive = defaultdict(int) back_consecutive = defaultdict(int) for i in range(len(recent_df) - 1): current_front = set(recent_df.iloc[i][self.front_columns]) next_front = set(recent_df.iloc[i + 1][self.front_columns]) for num in current_front & next_front: front_consecutive[num] += 1 current_back = set(recent_df.iloc[i][self.back_columns]) next_back = set(recent_df.iloc[i + 1][self.back_columns]) for num in current_back & next_back: back_consecutive[num] += 1 # 计算综合热度分数 front_heat_score = {} for num in self.front_range: freq_score = front_freq.get(num, 0) / periods consec_score = front_consecutive.get(num, 0) / (periods - 1) front_heat_score[num] = (freq_score * 0.7) + (consec_score * 0.3) back_heat_score = {} for num in self.back_range: freq_score = back_freq.get(num, 0) / periods consec_score = back_consecutive.get(num, 0) / (periods - 1) back_heat_score[num] = (freq_score * 0.7) + (consec_score * 0.3) return front_heat_score, back_heat_score def generate_trend_based_combination(self, df): """基于走势热度生成号码组合""" front_heat_score, back_heat_score = self.analyze_winning_trends(df) # 选择热度最高的号码 sorted_front = sorted(front_heat_score.items(), key=lambda x: x[1], reverse=True) sorted_back = sorted(back_heat_score.items(), key=lambda x: x[1], reverse=True) # 从热度最高的号码中随机选择,保持一定随机性 front_pool = [num for num, _ in sorted_front[:10]] # 从前10个热门号码中选择 back_pool = [num for num, _ in sorted_back[:5]] # 从前5个热门号码中选择 front_numbers = sorted(random.sample(front_pool, 5)) back_numbers = sorted(random.sample(back_pool, 2)) return front_numbers + back_numbers def generate_optimized_combinations(self, df, num_combinations=5): """生成优化后的号码组合,确保高中奖概率""" missing_values = self.calculate_missing_values(df) hot_cold, front_freq, back_freq = self.analyze_hot_cold_numbers(df) combinations = [] # 1. 热号+冷号组合 try: front_hot = random.sample(hot_cold['front']['hot'], min(3, len(hot_cold['front']['hot']))) front_cold = random.sample(hot_cold['front']['cold'], min(2, len(hot_cold['front']['cold']))) back_numbers = sorted(random.sample(hot_cold['back']['hot'], min(2, len(hot_cold['back']['hot'])))) combinations.append(sorted(front_hot + front_cold) + back_numbers) except: # 如果热号或冷号数量不足,使用随机选择 front_numbers = sorted(random.sample(list(self.front_range), 5)) back_numbers = sorted(random.sample(list(self.back_range), 2)) combinations.append(front_numbers + back_numbers) # 2. 遗漏值优先组合 front_missing = sorted(missing_values['front'].items(), key=lambda x: x[1], reverse=True) back_missing = sorted(missing_values['back'].items(), key=lambda x: x[1], reverse=True) front_numbers = sorted([num for num, _ in front_missing[:5]]) back_numbers = sorted([num for num, _ in back_missing[:2]]) combinations.append(front_numbers + back_numbers) # 3. 机器学习模型预测组合 try: lstm_pred = self.build_lstm_model(df) front_numbers = sorted([int(round(x)) for x in lstm_pred[:5]]) back_numbers = sorted([int(round(x)) for x in lstm_pred[5:7]]) # 确保数字在有效范围内 front_numbers = [max(1, min(35, x)) for x in front_numbers] back_numbers = [max(1, min(12, x)) for x in back_numbers] # 确保没有重复数字 front_numbers = list(dict.fromkeys(front_numbers)) while len(front_numbers) < 5: new_num = random.randint(1, 35) if new_num not in front_numbers: front_numbers.append(new_num) front_numbers = sorted(front_numbers)[:5] back_numbers = list(dict.fromkeys(back_numbers)) while len(back_numbers) < 2: new_num = random.randint(1, 12) if new_num not in back_numbers: back_numbers.append(new_num) back_numbers = sorted(back_numbers)[:2] combinations.append(front_numbers + back_numbers) except: try: tree_pred = self.build_decision_tree(df) combinations.append(tree_pred) except: # 如果机器学习预测失败,使用随机组合代替 front_numbers = sorted(random.sample(list(self.front_range), 5)) back_numbers = sorted(random.sample(list(self.back_range), 2)) combinations.append(front_numbers + back_numbers) # 4. 走势热度组合 trend_combination = self.generate_trend_based_combination(df) combinations.append(trend_combination) # 5. 随机生成组合 front_numbers = sorted(random.sample(list(self.front_range), 5)) back_numbers = sorted(random.sample(list(self.back_range), 2)) combinations.append(front_numbers + back_numbers) return combinations def save_recommendations(self, combinations, output_file): """保存推荐号码到Excel文件""" valid_combinations = [] for combo in combinations: if len(combo) == 7: # 5前区 + 2后区 front = sorted(combo[:5]) back = sorted(combo[5:]) if (all(1 <= x <= 35 for x in front) and all(1 <= x <= 12 for x in back) and len(set(front)) == 5 and len(set(back)) == 2): valid_combinations.append(front + back) if not valid_combinations: print("没有生成有效的号码组合") return # 创建DataFrame并保存 df_recommendations = pd.DataFrame(valid_combinations, columns=self.front_columns + self.back_columns) current_time = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") sheet_name = f"推荐_{current_time}" try: with pd.ExcelWriter(output_file, engine='openpyxl', mode='a' if openpyxl.__version__ >= '3.0' else 'w') as writer: df_recommendations.to_excel(writer, sheet_name=sheet_name, index=False) print(f"\n推荐号码已保存到 {output_file} 的 {sheet_name} 工作表中") # 打印推荐号码 print("\n推荐号码组合:") for i, combo in enumerate(valid_combinations, 1): front = ' '.join(map(str, combo[:5])) back = ' '.join(map(str, combo[5:])) print(f"组合{i}: 前区: {front} | 后区: {back}") except Exception as e: print(f"保存推荐号码时发生错误: {e}") def calculate_trends(self, df): """分析号码走势""" front_numbers = df[self.front_columns] # 计算和值 trends_sum_values = front_numbers.sum(axis=1) # 计算跨度 trends_span_values = front_numbers.max(axis=1) - front_numbers.min(axis=1) # 计算奇偶比 odd_counts = front_numbers.apply(lambda x: (x % 2 != 0).sum(), axis=1) trends_odd_even_ratio = odd_counts / len(self.front_columns) # 计算大小比 big_counts = front_numbers.apply(lambda x: (x > 17).sum(), axis=1) trends_big_small_ratio = big_counts / len(self.front_columns) return { 'sum': trends_sum_values, 'span': trends_span_values, 'odd_even_ratio': trends_odd_even_ratio, 'big_small_ratio': trends_big_small_ratio } def build_lstm_model(self, df): """使用LSTM模型进行号码预测""" try: # 准备数据 data = df[self.front_columns + self.back_columns].values scaler = StandardScaler() scaled_data = scaler.fit_transform(data) # 重塑数据为LSTM所需的格式 X = scaled_data[:-1] y = scaled_data[1:] X = X.reshape((X.shape[0], 1, X.shape[1])) # 构建模型 model = Sequential([ LSTM(64, input_shape=(1, X.shape[2]), return_sequences=True), Dropout(0.2), LSTM(32), Dropout(0.2), Dense(y.shape[1]) ]) model.compile(optimizer='adam', loss='mse') # 训练模型 model.fit(X, y, epochs=50, batch_size=32, verbose=0) # 预测下一期号码 last_data = scaled_data[-1].reshape(1, 1, -1) prediction = model.predict(last_data) # 转换回原始比例 prediction = scaler.inverse_transform(prediction) return prediction[0] except Exception as e: print(f"LSTM模型预测失败: {e}") raise def build_decision_tree(self, df): """使用决策树进行号码预测""" try: # 准备数据 X = df[self.front_columns + self.back_columns].values y = np.roll(X, -1, axis=0)[:-1] # 使用下一期的数据作为目标 X = X[:-1] # 移除最后一行,因为它没有对应的下一期数据 # 训练模型 model = DecisionTreeClassifier(max_depth=5, random_state=42) model.fit(X, y) # 预测下一期号码 last_data = X[-1].reshape(1, -1) prediction = model.predict(last_data) # 确保预测结果在有效范围内 front_pred = [max(1, min(35, int(x))) for x in prediction[0][:5]] back_pred = [max(1, min(12, int(x))) for x in prediction[0][5:]] # 确保没有重复数字 front_pred = list(dict.fromkeys(front_pred)) while len(front_pred) < 5: new_num = random.randint(1, 35) if new_num not in front_pred: front_pred.append(new_num) back_pred = list(dict.fromkeys(back_pred)) while len(back_pred) < 2: new_num = random.randint(1, 12) if new_num not in back_pred: back_pred.append(new_num) return sorted(front_pred)[:5] + sorted(back_pred)[:2] except Exception as e: print(f"决策树模型预测失败: {e}") raise def validate_combination(self, combination): """验证号码组合是否有效""" if len(combination) != 7: return False front = combination[:5] back = combination[5:] # 检查号码范围和唯一性 if not (all(1 <= x <= 35 for x in front) and all(1 <= x <= 12 for x in back) and len(set(front)) == 5 and len(set(back)) == 2): return False return True def format_combination(self, combination): """格式化号码组合输出""" front = ' '.join(map(str, sorted(combination[:5]))) back = ' '.join(map(str, sorted(combination[5:]))) return f"前区: {front} | 后区: {back}"

def main():
"""主程序入口"""
try:
# 创建分析器实例
analyzer = LotteryAnalyzer()

text
# 设置文件路径 input_file = 'C:/Users/Administrator/Desktop/新建文件夹/pythonProject1/DLD.xlsx' # 输入文件路径 output_file = 'C:/Users/Administrator/Desktop/新建文件夹/pythonProject1/幸运七.xlsx' # 输出文件路径 print("开始运行大乐透号码分析...") # 读取历史数据 df = analyzer.read_excel_file(input_file) if df is not None: print("\n开始生成号码组合...") # 生成推荐号码组合 combinations = analyzer.generate_optimized_combinations(df) # 保存并显示结果 analyzer.save_recommendations(combinations, output_file) print("\n号码生成说明:") print("1. 组合1: 热号+冷号平衡组合") print("2. 组合2: 基于遗漏值分析") print("3. 组合3: 机器学习模型预测") print("4. 组合4: 走势热度分析组合") print("5. 组合5: 随机平衡组合") print("\n分析完成!请在输出文件中查看详细结果。") else: print("无法读取历史数据,程序终止。") except Exception as e: print(f"程序运行出错: {e}") finally: print("\n程序运行结束。")

if name == 'main':
main()帮你优化一下并提高预测准确度1. 历史数据分析
频率分析:统计过去中奖号码的出现频率,找出哪些号码出现得最多(热号)或最少(冷号)。
号码组合模式:分析中奖号码的模式,比如奇偶比例、高低分布等。
趋势分析:通过时间序列图表观察号码的出现趋势,试图预测未来的可能性。
2. 随机性模拟
蒙特卡洛模拟:通过大量模拟,随机生成可能的号码组合并评估其覆盖面。
覆盖优化:设计组合方式,最大化中奖范围(例如,使用数学中的组合学来减少投注总数而覆盖更多号码)。
3. 机器学习(仅适用于有足够历史数据的情况)
回归分析:尝试建立一个模型来预测号码的出现概率(虽然难以有效,因为彩票是独立随机事件)。
分类算法:根据历史数据训练模型,尝试分类哪些号码组合可能中奖。
深度学习:用神经网络从历史中奖号码中寻找复杂模式,尽管这可能导致过拟合。
4. 数学优化
轮盘算法:设计彩票投注策略,比如分层选号法(将号码分区,每区挑选一部分)。
概率覆盖策略:选择特定的号码组合,以确保覆盖更多可能的结果。

Мысль

分析历史数据

我正在分析Python代码以优化预测准确度,特别做频率分析、组合模式和趋势分析,逐渐提升对未来趋势的预测能力。

研究关联性

考虑使用机器学习和数学优化方法来改进预测准确性,比如回归分析和分类算法,以及利用神经网络发现复杂模式。

分析彩票号码

审视彩票分析器脚本,探讨生成号码组合的可能性,并寻找可以提高预测准确度的优化方法。

确保代码优化并提升预

分析和优化

我正在解析代码以优化性能和准确度,可能会加入频率分析、趋势分析和机器学习方法等。

רוצה לשפר את הקוד.

思考,持续 12 秒

Ответ

您好,我很高兴能帮助您优化代码并提高预测准确度。以下是针对您提供的代码和提出的方法的优化建议和实现。

总体优化思路

  1. 代码结构优化:提高代码的可读性和效率,使用更高效的数据结构和算法。
  2. 方法改进:根据您提供的策略,增加新的分析方法和预测模型。
  3. 预测准确度提高:通过更先进的机器学习模型和数学方法,尝试提高预测的准确度。

接下来,我将逐一说明如何在代码中实现您提到的各个方法。


1. 历史数据分析

1.1 频率分析

实现思路

  • 统计每个号码在历史数据中出现的频率。
  • 找出高频(热号)和低频(冷号)号码。
  • 在生成号码组合时,适当增加热号的权重。

代码实现

LotteryAnalyzer 类中添加 frequency_analysis 方法:

python
def frequency_analysis(self, df): """统计号码出现频率""" # 统计前区号码频率 front_numbers = df[self.front_columns].values.flatten() front_freq = Counter(front_numbers) # 统计后区号码频率 back_numbers = df[self.back_columns].values.flatten() back_freq = Counter(back_numbers) return front_freq, back_freq

1.2 号码组合模式

实现思路

  • 计算奇偶比、高低比等指标。
  • 分析常见的组合模式,如奇偶分布、连号情况等。
  • 在生成号码时,遵循这些常见模式。

代码实现

修改 calculate_trends 方法,增加对组合模式的分析:

python
def calculate_trends(self, df): """分析号码走势和组合模式""" front_numbers = df[self.front_columns] # 计算和值 trends_sum_values = front_numbers.sum(axis=1) # 计算跨度 trends_span_values = front_numbers.max(axis=1) - front_numbers.min(axis=1) # 计算奇偶比 odd_counts = front_numbers.apply(lambda x: (x % 2 != 0).sum(), axis=1) trends_odd_even_ratio = odd_counts / len(self.front_columns) # 计算大小比(假设17为界限) big_counts = front_numbers.apply(lambda x: (x > 17).sum(), axis=1) trends_big_small_ratio = big_counts / len(self.front_columns) # 计算连号个数 consecutive_counts = front_numbers.apply( lambda x: sum(np.diff(sorted(x)) == 1), axis=1) return { 'sum': trends_sum_values, 'span': trends_span_values, 'odd_even_ratio': trends_odd_even_ratio, 'big_small_ratio': trends_big_small_ratio, 'consecutive_counts': consecutive_counts }

1.3 趋势分析

实现思路

  • 使用时间序列分析,观察号码出现的趋势。
  • 使用滑动窗口计算号码的移动平均值。
  • 在预测时,考虑这些趋势。

代码实现

添加 trend_analysis 方法:

python
def trend_analysis(self, df, window_size=10): """时间序列趋势分析""" trends = {} for num in self.front_range: num_series = df[self.front_columns].apply(lambda row: num in row.values, axis=1).astype(int) trends[num] = num_series.rolling(window=window_size).mean() return trends

2. 随机性模拟

2.1 蒙特卡洛模拟

实现思路

  • 进行大量随机抽样,生成可能的号码组合。
  • 统计这些组合中符合特定条件(如历史频率、趋势)的比例。
  • 从中选取符合条件的组合。

代码实现

添加 monte_carlo_simulation 方法:

python
def monte_carlo_simulation(self, df, simulations=10000): """蒙特卡洛模拟生成号码组合""" front_freq, back_freq = self.frequency_analysis(df) # 将号码按频率排序 front_numbers = [num for num, _ in front_freq.most_common()] back_numbers = [num for num, _ in back_freq.most_common()] valid_combinations = [] for _ in range(simulations): front_combination = sorted(random.sample(front_numbers, 5)) back_combination = sorted(random.sample(back_numbers, 2)) combination = front_combination + back_combination # 验证组合是否符合特定条件 if self.validate_combination(combination): valid_combinations.append(combination) return valid_combinations

2.2 覆盖优化

实现思路

  • 使用数学组合学,设计号码组合方案,减少投注数量但覆盖更多号码。
  • 可以使用缩水过滤等方法,筛选出最优的组合。

代码实现

由于覆盖优化需要复杂的算法,这里提供一个简单的示例,使用轮盘算法:

python
def coverage_optimization(self, df): """使用概率覆盖策略生成号码组合""" front_freq, back_freq = self.frequency_analysis(df) # 计算前区号码的累积分布函数(CDF) total_front = sum(front_freq.values()) front_cdf = [] cumulative = 0 for num in self.front_range: cumulative += front_freq.get(num, 0) / total_front front_cdf.append((num, cumulative)) # 计算后区号码的累积分布函数(CDF) total_back = sum(back_freq.values()) back_cdf = [] cumulative = 0 for num in self.back_range: cumulative += back_freq.get(num, 0) / total_back back_cdf.append((num, cumulative)) # 使用轮盘算法生成号码组合 front_numbers = [] for _ in range(5): r = random.random() for num, cdf in front_cdf: if r <= cdf: if num not in front_numbers: front_numbers.append(num) break back_numbers = [] for _ in range(2): r = random.random() for num, cdf in back_cdf: if r <= cdf: if num not in back_numbers: back_numbers.append(num) break return sorted(front_numbers) + sorted(back_numbers)

3. 机器学习

3.1 回归分析

实现思路

  • 使用回归模型预测号码出现的概率。
  • 由于彩票号码是独立随机的,回归模型的效果可能有限。

代码实现

build_regression_model 方法中,使用线性回归:

python
from sklearn.linear_model import LinearRegression def build_regression_model(self, df): """使用线性回归预测号码""" try: # 准备数据 X = df.index.values.reshape(-1, 1) # 时间序列 y = df[self.front_columns + self.back_columns].values # 训练模型 model = LinearRegression() model.fit(X, y) # 预测下一期号码 next_index = np.array([[df.index.values[-1] + 1]]) prediction = model.predict(next_index) # 取整数并确保范围 prediction = np.round(prediction).astype(int) front_numbers = [max(1, min(35, num)) for num in prediction[0][:5]] back_numbers = [max(1, min(12, num)) for num in prediction[0][5:7]] # 确保号码唯一 front_numbers = list(set(front_numbers)) while len(front_numbers) < 5: num = random.randint(1, 35) if num not in front_numbers: front_numbers.append(num) back_numbers = list(set(back_numbers)) while len(back_numbers) < 2: num = random.randint(1, 12) if num not in back_numbers: back_numbers.append(num) return sorted(front_numbers) + sorted(back_numbers) except Exception as e: print(f"回归模型预测失败: {e}") raise

3.2 分类算法

实现思路

  • 将号码组合视为分类标签,训练分类模型。
  • 由于类别数量巨大,直接分类困难。
  • 可以考虑将号码出现与否作为多标签分类问题。

代码实现

使用多标签二元分类:

python
from sklearn.multioutput import MultiOutputClassifier from sklearn.ensemble import RandomForestClassifier def build_classification_model(self, df): """使用分类算法预测号码""" try: # 准备数据 X = df.index.values.reshape(-1, 1) # 时间序列 y_front = df[self.front_columns].apply(lambda x: [1 if i in x.values else 0 for i in self.front_range], axis=1) y_back = df[self.back_columns].apply(lambda x: [1 if i in x.values else 0 for i in self.back_range], axis=1) y = pd.concat([y_front, y_back], axis=1).values # 训练模型 model = MultiOutputClassifier(RandomForestClassifier(n_estimators=100, random_state=42)) model.fit(X, y) # 预测下一期号码 next_index = np.array([[df.index.values[-1] + 1]]) prediction = model.predict(next_index) # 获取预测的号码 front_numbers = [i for i, val in enumerate(prediction[0][:35], 1) if val == 1] back_numbers = [i for i, val in enumerate(prediction[0][35:], 1) if val == 1] # 如果号码不足,随机补充 while len(front_numbers) < 5: num = random.randint(1, 35) if num not in front_numbers: front_numbers.append(num) while len(back_numbers) < 2: num = random.randint(1, 12) if num not in back_numbers: back_numbers.append(num) return sorted(front_numbers)[:5] + sorted(back_numbers)[:2] except Exception as e: print(f"分类模型预测失败: {e}") raise

3.3 深度学习

实现思路

  • 使用更复杂的神经网络模型,如LSTM或GRU。
  • 注意防止过拟合,使用正则化和交叉验证。

代码实现

build_lstm_model 方法中,增加模型的复杂性和正则化:

python
def build_lstm_model(self, df): """使用改进的LSTM模型进行号码预测""" try: # 准备数据 data = df[self.front_columns + self.back_columns].values scaler = StandardScaler() scaled_data = scaler.fit_transform(data) # 创建时间序列数据 X = [] y = [] sequence_length = 5 for i in range(len(scaled_data) - sequence_length): X.append(scaled_data[i:i + sequence_length]) y.append(scaled_data[i + sequence_length]) X = np.array(X) y = np.array(y) # 构建模型 model = Sequential([ LSTM(128, input_shape=(X.shape[1], X.shape[2]), return_sequences=True), Dropout(0.2), LSTM(64), Dropout(0.2), Dense(y.shape[1]) ]) model.compile(optimizer='adam', loss='mse') # 训练模型 model.fit(X, y, epochs=100, batch_size=16, verbose=0) # 预测下一期号码 last_sequence = scaled_data[-sequence_length:].reshape(1, sequence_length, -1) prediction = model.predict(last_sequence) # 转换回原始比例 prediction = scaler.inverse_transform(prediction) prediction = np.round(prediction).astype(int)[0] # 分别处理前区和后区号码 front_numbers = [max(1, min(35, num)) for num in prediction[:5]] back_numbers = [max(1, min(12, num)) for num in prediction[5:7]] # 确保号码唯一 front_numbers = list(set(front_numbers)) while len(front_numbers) < 5: num = random.randint(1, 35) if num not in front_numbers: front_numbers.append(num) back_numbers = list(set(back_numbers)) while len(back_numbers) < 2: num = random.randint(1, 12) if num not in back_numbers: back_numbers.append(num) return sorted(front_numbers)[:5] + sorted(back_numbers)[:2] except Exception as e: print(f"LSTM模型预测失败: {e}") raise

4. 数学优化

4.1 轮盘算法

实现思路

  • 使用号码的历史频率,计算每个号码的选择概率。
  • 按照概率分布随机选择号码。

代码实现

已在 2.2 覆盖优化中实现。

4.2 概率覆盖策略

实现思路

  • 设计一种策略,选择号码组合,确保在一定投注数量下,覆盖更多的可能结果。
  • 可以使用数学中的组合算法,优化号码选择。

代码实现

由于复杂性较高,这里提供一个简单的示例,使用分区选号法:

python
def probability_coverage_strategy(self): """使用分区选号法生成号码组合""" # 将前区号码分为五个区间 zones = [ range(1, 8), # 1-7 range(8, 15), # 8-14 range(15, 22), # 15-21 range(22, 29), # 22-28 range(29, 36) # 29-35 ] front_numbers = [] for zone in zones: num = random.choice(list(zone)) front_numbers.append(num) # 后区号码随机选择 back_numbers = sorted(random.sample(list(self.back_range), 2)) return sorted(front_numbers) + back_numbers

整合优化后的代码

generate_optimized_combinations 方法中,整合以上方法:

python
def generate_optimized_combinations(self, df, num_combinations=5): """生成优化后的号码组合,确保高中奖概率""" combinations = [] # 1. 热号+冷号组合 front_freq, back_freq = self.frequency_analysis(df) front_hot = [num for num, freq in front_freq.most_common(17)] front_cold = [num for num in self.front_range if num not in front_hot] front_numbers = sorted(random.sample(front_hot, 3) + random.sample(front_cold, 2)) back_numbers = sorted(random.sample(self.back_range, 2)) combinations.append(front_numbers + back_numbers) # 2. 蒙特卡洛模拟组合 monte_carlo_combinations = self.monte_carlo_simulation(df, simulations=1000) if monte_carlo_combinations: combinations.append(random.choice(monte_carlo_combinations)) else: combinations.append(front_numbers + back_numbers) # 3. 机器学习模型预测组合 try: lstm_pred = self.build_lstm_model(df) combinations.append(lstm_pred) except: try: regression_pred = self.build_regression_model(df) combinations.append(regression_pred) except: front_numbers = sorted(random.sample(list(self.front_range), 5)) back_numbers = sorted(random.sample(list(self.back_range), 2)) combinations.append(front_numbers + back_numbers) # 4. 概率覆盖策略组合 coverage_combination = self.coverage_optimization(df) combinations.append(coverage_combination) # 5. 随机生成组合 random_combination = self.probability_coverage_strategy() combinations.append(random_combination) return combinations

总结和建议

  • 验证模型效果:在引入新的预测模型后,建议使用历史数据进行验证,评估模型的准确度。
  • 注意随机性:彩票号码的开出具有独立随机性,模型预测的准确度有限,应理性看待。
  • 优化代码性能:对于大规模数据和复杂模型,可以考虑优化代码性能,如使用多线程或更高效的算法。

希望以上优化能够帮助您提高代码的性能和预测的准确度。如果您有任何疑问或需要进一步的帮助,请随时告诉我。

Поделиться этим Q&A