Files
amlhc/analysis_history.php
916117771 8b2590c5b5 docs(predictV3): 添加predictV3算法优化研究文档和前端功能实现
- 完成Phase 11: predictV3算法优化研究文档,涵盖6个优化方向的技术分析
- 实现置信度评估功能,提供历史命中率、得分分布、多维度一致性置信度指标
- 扩展回测指标体系,新增NDCG@K、MRR、命中率分布等排名质量评估指标
- 优化转移概率算法,引入二阶马尔可夫链和多属性联合转移增强预测准确性
- 设计权重训练机制,支持网格搜索和遗传算法进行数据驱动的参数优化
- 集成组合特征挖掘功能,采用关联规则和序列模式发现号码间潜在关联
- 实现完整的前端交互界面,支持预测结果显示、置信度展示和回测验证功能
- 建立性能优化策略,包括预计算缓存、批量计算和降级策略保障响应速度
2026-05-01 23:17:24 +08:00

395 lines
12 KiB
PHP

<?php
/**
* 正码与特码关联规律统计分析脚本
*
* 分析维度:
* 1. 正码平均值与特码差值分布
* 2. 特码是否在正码范围内
* 3. 特码与最近正码的距离分布
* 4. 和值尾数关系
* 5. 区间覆盖分析
* 6. 波色/生肖关联
*/
// 波色映射表 (从fa_num表提取)
$colorMap = [
1 => '红', 2 => '红', 3 => '蓝', 4 => '蓝', 5 => '绿', 6 => '绿',
7 => '红', 8 => '红', 9 => '蓝', 10 => '蓝', 11 => '绿', 12 => '红',
13 => '红', 14 => '蓝', 15 => '蓝', 16 => '绿', 17 => '绿', 18 => '红',
19 => '红', 20 => '蓝', 21 => '绿', 22 => '绿', 23 => '红', 24 => '红',
25 => '蓝', 26 => '蓝', 27 => '绿', 28 => '绿', 29 => '红', 30 => '红',
31 => '蓝', 32 => '绿', 33 => '绿', 34 => '红', 35 => '红', 36 => '蓝',
37 => '蓝', 38 => '绿', 39 => '绿', 40 => '红', 41 => '蓝', 42 => '蓝',
43 => '绿', 44 => '绿', 45 => '红', 46 => '红', 47 => '蓝', 48 => '蓝',
49 => '绿'
];
// 生肖映射表
$animalMap = [
1 => '马', 2 => '蛇', 3 => '龙', 4 => '兔', 5 => '虎', 6 => '牛',
7 => '鼠', 8 => '猪', 9 => '狗', 10 => '鸡', 11 => '猴', 12 => '羊',
13 => '马', 14 => '蛇', 15 => '龙', 16 => '兔', 17 => '虎', 18 => '牛',
19 => '鼠', 20 => '猪', 21 => '狗', 22 => '鸡', 23 => '猴', 24 => '羊',
25 => '马', 26 => '蛇', 27 => '龙', 28 => '兔', 29 => '虎', 30 => '牛',
31 => '鼠', 32 => '猪', 33 => '狗', 34 => '鸡', 35 => '猴', 36 => '羊',
37 => '马', 38 => '蛇', 39 => '龙', 40 => '兔', 41 => '虎', 42 => '牛',
43 => '鼠', 44 => '猪', 45 => '狗', 46 => '鸡', 47 => '猴', 48 => '羊',
49 => '马'
];
/**
* 获取数字所在的区间 (1-10, 11-20, 21-30, 31-40, 41-49)
*/
function getZone($num) {
if ($num >= 1 && $num <= 10) return 1;
if ($num >= 11 && $num <= 20) return 2;
if ($num >= 21 && $num <= 30) return 3;
if ($num >= 31 && $num <= 40) return 4;
if ($num >= 41 && $num <= 49) return 5;
return 0;
}
/**
* 计算特码到最近正码的距离
*/
function getMinDistance($sortedNums, $num7) {
$minDist = 49;
foreach ($sortedNums as $num) {
$dist = abs($num7 - $num);
if ($dist < $minDist) {
$minDist = $dist;
}
}
return $minDist;
}
// 解析SQL文件中的数据
$sqlFile = 'C:\Users\91611\Desktop\fa_history.sql';
$content = file_get_contents($sqlFile);
// 提取INSERT语句中的数据
$pattern = '/INSERT INTO `fa_history` VALUES \((\d+), (\d+), (\d+), (\d+), (\d+), (\d+), (\d+), (\d+), \'([^\']+)\'\);/';
preg_match_all($pattern, $content, $matches);
$data = [];
for ($i = 0; $i < count($matches[0]); $i++) {
$data[] = [
'expect' => (int)$matches[1][$i],
'num1' => (int)$matches[2][$i],
'num2' => (int)$matches[3][$i],
'num3' => (int)$matches[4][$i],
'num4' => (int)$matches[5][$i],
'num5' => (int)$matches[6][$i],
'num6' => (int)$matches[7][$i],
'num7' => (int)$matches[8][$i],
'openTime' => $matches[9][$i]
];
}
$total = count($data);
echo "==================== 正码与特码关联规律统计分析 ====================\n";
echo "数据总量: {$total} 期 (从 {$data[0]['expect']}{$data[$total-1]['expect']})\n\n";
// ==================== 1. 正码平均值与特码差值分布 ====================
echo "==================== 1. 正码平均值与特码差值分布 ====================\n";
$diffCounts = [];
$inRange5 = 0;
foreach ($data as $row) {
$avg = ($row['num1'] + $row['num2'] + $row['num3'] + $row['num4'] + $row['num5'] + $row['num6']) / 6;
$diff = round($row['num7'] - $avg); // 四舍五入
$diffKey = $diff;
if (!isset($diffCounts[$diffKey])) {
$diffCounts[$diffKey] = 0;
}
$diffCounts[$diffKey]++;
if ($diff >= -5 && $diff <= 5) {
$inRange5++;
}
}
// 按差值排序
ksort($diffCounts);
echo "差值分布统计:\n";
foreach ($diffCounts as $diff => $count) {
$pct = round($count / $total * 100, 2);
echo " 差值 {$diff}: {$count} 次 ({$pct}%)\n";
}
echo "\n差值在 [-5, +5] 范围内的概率: " . round($inRange5 / $total * 100, 2) . "% ($inRange5/$total)\n";
// 找出高频差值区间 (>5%)
echo "\n高频差值区间 (>5%):\n";
foreach ($diffCounts as $diff => $count) {
$pct = round($count / $total * 100, 2);
if ($pct > 5) {
echo " 差值 {$diff}: {$pct}%\n";
}
}
// ==================== 2. 特码是否在正码范围内 ====================
echo "\n==================== 2. 特码是否在正码范围内 ====================\n";
$inRange = 0;
$outRange = 0;
foreach ($data as $row) {
$nums = [$row['num1'], $row['num2'], $row['num3'], $row['num4'], $row['num5'], $row['num6']];
$min = min($nums);
$max = max($nums);
if ($row['num7'] >= $min && $row['num7'] <= $max) {
$inRange++;
} else {
$outRange++;
}
}
echo "特码在正码范围内 [min(num1-6), max(num1-6)]:\n";
echo " 是: {$inRange} 次 (" . round($inRange / $total * 100, 2) . "%)\n";
echo " 否: {$outRange} 次 (" . round($outRange / $total * 100, 2) . "%)\n";
// ==================== 3. 特码与最近正码的距离分布 ====================
echo "\n==================== 3. 特码与最近正码的距离分布 ====================\n";
$distCounts = [];
$equalCount = 0; // 特码等于某正码
foreach ($data as $row) {
$nums = [$row['num1'], $row['num2'], $row['num3'], $row['num4'], $row['num5'], $row['num6']];
sort($nums);
$minDist = getMinDistance($nums, $row['num7']);
if (!isset($distCounts[$minDist])) {
$distCounts[$minDist] = 0;
}
$distCounts[$minDist]++;
if ($minDist == 0) {
$equalCount++;
}
}
ksort($distCounts);
echo "距离分布统计:\n";
foreach ($distCounts as $dist => $count) {
$pct = round($count / $total * 100, 2);
echo " 距离 {$dist}: {$count} 次 ({$pct}%)\n";
}
echo "\n特码等于某正码 (距离=0) 的概率: " . round($equalCount / $total * 100, 2) . "% ($equalCount/$total)\n";
// 距离<=5的概率
$distLE5 = 0;
for ($i = 0; $i <= 5; $i++) {
if (isset($distCounts[$i])) {
$distLE5 += $distCounts[$i];
}
}
echo "距离 <= 5 的概率: " . round($distLE5 / $total * 100, 2) . "% ($distLE5/$total)\n";
// ==================== 4. 和值尾数关系 ====================
echo "\n==================== 4. 和值尾数关系 ====================\n";
$sameTail = 0;
$tailDiffCounts = [];
foreach ($data as $row) {
$sum = $row['num1'] + $row['num2'] + $row['num3'] + $row['num4'] + $row['num5'] + $row['num6'];
$sumTail = $sum % 10;
$num7Tail = $row['num7'] % 10;
$tailDiff = abs($sumTail - $num7Tail);
if (!isset($tailDiffCounts[$tailDiff])) {
$tailDiffCounts[$tailDiff] = 0;
}
$tailDiffCounts[$tailDiff]++;
if ($sumTail == $num7Tail) {
$sameTail++;
}
}
ksort($tailDiffCounts);
echo "和值尾数与特码尾数同尾概率: " . round($sameTail / $total * 100, 2) . "% ($sameTail/$total)\n";
echo "\n尾数差值分布:\n";
foreach ($tailDiffCounts as $diff => $count) {
$pct = round($count / $total * 100, 2);
echo " 尾数差 {$diff}: {$count} 次 ({$pct}%)\n";
}
// 尾数差 <= 3 的概率
$tailDiffLE3 = 0;
for ($i = 0; $i <= 3; $i++) {
if (isset($tailDiffCounts[$i])) {
$tailDiffLE3 += $tailDiffCounts[$i];
}
}
echo "\n尾数差 <= 3 的概率: " . round($tailDiffLE3 / $total * 100, 2) . "% ($tailDiffLE3/$total)\n";
// ==================== 5. 区间覆盖分析 ====================
echo "\n==================== 5. 区间覆盖分析 ====================\n";
$zoneCoveredCounts = [0, 0, 0, 0, 0, 0]; // 覆盖0-5个区间
$zone7Covered = 0; // 特码所在区间被正码覆盖
foreach ($data as $row) {
$nums = [$row['num1'], $row['num2'], $row['num3'], $row['num4'], $row['num5'], $row['num6']];
$zones = [];
foreach ($nums as $num) {
$zone = getZone($num);
$zones[$zone] = true;
}
$coverCount = count($zones);
$zoneCoveredCounts[$coverCount]++;
$zone7 = getZone($row['num7']);
if (isset($zones[$zone7])) {
$zone7Covered++;
}
}
echo "正码覆盖区间数量分布:\n";
for ($i = 0; $i <= 5; $i++) {
$count = $zoneCoveredCounts[$i];
$pct = round($count / $total * 100, 2);
echo " 覆盖 {$i} 个区间: {$count} 次 ({$pct}%)\n";
}
echo "\n特码所在区间被正码覆盖的概率: " . round($zone7Covered / $total * 100, 2) . "% ($zone7Covered/$total)\n";
// ==================== 6. 波色/生肖关联 ====================
echo "\n==================== 6. 波色/生肖关联 ====================\n";
$color7InNums = 0; // 特码波色在正码中出现过
$animal7InNums = 0; // 特码生肖在正码中出现过
$colorMatchCounts = []; // 正码中某波色数量与特码波色匹配情况
$color7Counts = ['红' => 0, '蓝' => 0, '绿' => 0]; // 特码波色分布
foreach ($data as $row) {
$nums = [$row['num1'], $row['num2'], $row['num3'], $row['num4'], $row['num5'], $row['num6']];
$numColors = [];
$numAnimals = [];
$colorCounts = ['红' => 0, '蓝' => 0, '绿' => 0];
foreach ($nums as $num) {
$color = $colorMap[$num];
$animal = $animalMap[$num];
$numColors[$color] = true;
$numAnimals[$animal] = true;
$colorCounts[$color]++;
}
$color7 = $colorMap[$row['num7']];
$animal7 = $animalMap[$row['num7']];
$color7Counts[$color7]++;
// 特码波色是否在正码中出现过
if (isset($numColors[$color7])) {
$color7InNums++;
}
// 特码生肖是否在正码中出现过
if (isset($numAnimals[$animal7])) {
$animal7InNums++;
}
// 正码中某波色数量与特码波色
$key = $colorCounts[$color7] . '_' . $color7;
if (!isset($colorMatchCounts[$key])) {
$colorMatchCounts[$key] = 0;
}
$colorMatchCounts[$key]++;
}
echo "特码波色分布:\n";
foreach ($color7Counts as $color => $count) {
$pct = round($count / $total * 100, 2);
echo " {$color}: {$count} 次 ({$pct}%)\n";
}
echo "\n特码波色在正码中出现的概率: " . round($color7InNums / $total * 100, 2) . "% ($color7InNums/$total)\n";
echo "特码生肖在正码中出现的概率: " . round($animal7InNums / $total * 100, 2) . "% ($animal7InNums/$total)\n";
echo "\n正码中特码同波色数量分布:\n";
ksort($colorMatchCounts);
foreach ($colorMatchCounts as $key => $count) {
$pct = round($count / $total * 100, 2);
echo " {$key}: {$count} 次 ({$pct}%)\n";
}
// ==================== 总结: 高命中率规律 ====================
echo "\n==================== 总结: 可能达到40%命中率以上的规律 ====================\n";
$highHitRules = [];
// 检查各规律
if ($inRange5 / $total >= 0.4) {
$highHitRules[] = "差值在[-5,+5]: " . round($inRange5 / $total * 100, 2) . "%";
}
if ($distLE5 / $total >= 0.4) {
$highHitRules[] = "距离<=5: " . round($distLE5 / $total * 100, 2) . "%";
}
if ($zone7Covered / $total >= 0.4) {
$highHitRules[] = "特码区间被正码覆盖: " . round($zone7Covered / $total * 100, 2) . "%";
}
if ($color7InNums / $total >= 0.4) {
$highHitRules[] = "特码波色在正码中出现: " . round($color7InNums / $total * 100, 2) . "%";
}
if ($animal7InNums / $total >= 0.4) {
$highHitRules[] = "特码生肖在正码中出现: " . round($animal7InNums / $total * 100, 2) . "%";
}
if ($tailDiffLE3 / $total >= 0.4) {
$highHitRules[] = "尾数差<=3: " . round($tailDiffLE3 / $total * 100, 2) . "%";
}
if (count($highHitRules) > 0) {
foreach ($highHitRules as $rule) {
echo "- {$rule}\n";
}
} else {
echo "没有发现明显超过40%命中率的规律,以下是接近40%的规律:\n";
$allRules = [
"差值在[-5,+5]" => $inRange5 / $total,
"距离<=5" => $distLE5 / $total,
"距离<=10" => 0,
"特码区间被正码覆盖" => $zone7Covered / $total,
"特码波色在正码中出现" => $color7InNums / $total,
"特码生肖在正码中出现" => $animal7InNums / $total,
"尾数差<=3" => $tailDiffLE3 / $total,
];
// 计算距离<=10
$distLE10 = 0;
for ($i = 0; $i <= 10; $i++) {
if (isset($distCounts[$i])) {
$distLE10 += $distCounts[$i];
}
}
$allRules["距离<=10"] = $distLE10 / $total;
arsort($allRules);
foreach ($allRules as $rule => $rate) {
echo "- {$rule}: " . round($rate * 100, 2) . "%\n";
}
}
echo "\n==================== 分析完成 ====================\n";