From cb3ca055ee3ed57c7050b52f15ede2ae6e036fe2 Mon Sep 17 00:00:00 2001
From: leon <916117771@qq.com>
Date: Fri, 1 May 2026 15:25:11 +0800
Subject: [PATCH] =?UTF-8?q?feat(11-03):=20=E5=89=8D=E7=AB=AF=E5=B1=95?=
=?UTF-8?q?=E7=A4=BA=E7=BD=AE=E4=BF=A1=E5=BA=A6=E5=92=8C=E6=89=A9=E5=B1=95?=
=?UTF-8?q?=E5=9B=9E=E6=B5=8B=E6=8C=87=E6=A0=87?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 新增置信度评估展示区域(V2和V3版本)
- 添加整体置信度和各排名置信度卡片展示
- 添加数据不足时的警告提示(confidence.data_warning)
- 扩展回测指标:NDCG@5、MRR、命中分布柱状图
- 添加回测数据警告提示(backtest.data_warning)
- 显示转移概率阶数(analysis.transition_order)
- 预测号码卡片中显示置信度等级和百分比(V3版本)
---
public/assets/js/backend/history.js | 440 ++++++++++++++++++++++++++++
1 file changed, 440 insertions(+)
diff --git a/public/assets/js/backend/history.js b/public/assets/js/backend/history.js
index 43b9be8..e62fa52 100644
--- a/public/assets/js/backend/history.js
+++ b/public/assets/js/backend/history.js
@@ -102,6 +102,11 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
$(document).off('click', '.btn-numberfilter').on('click', '.btn-numberfilter', function () {
Controller.api.showNumberFilterDialog();
});
+
+ // 预测号码按钮事件
+ $(document).off('click', '.btn-predict').on('click', '.btn-predict', function () {
+ Controller.api.showPredictDialog();
+ });
},
add: function () {
Controller.api.bindevent();
@@ -1520,6 +1525,441 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
html += '';
$('#dash-result', layero).html(html);
+ },
+
+ /**
+ * 预测号码弹窗
+ */
+ showPredictDialog: function () {
+ var html = '
' +
+ '
' +
+ '
预测算法说明
' +
+ '
' +
+ ' V1版本:基于转移概率分析(区域、生肖、尾号、首号、波色转移 + 冷热系数)
' +
+ ' V2版本:基于统计回归分析(遗漏回归、频率回归、区域平衡、波色平衡等)+ 历史回测验证
' +
+ ' V3版本(推荐):多维度综合预测,新增转移概率(马尔可夫链)、单双规律、大小规律、走势方向分析' +
+ '
' +
+ '
' +
+ '
' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ '
' +
+ '
' +
+ ' ' +
+ ' ' +
+ ' 留空则预测下一期' +
+ '
' +
+ '
' +
+ ' ' +
+ ' ' +
+ ' 建议200期以上' +
+ '
' +
+ // V3权重配置
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ // V2权重配置
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ // V1权重配置
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ ' ' +
+ '
' +
+ '
' +
+ '
';
+
+ Layer.open({
+ type: 1,
+ title: '🎯 智能预测号码',
+ area: ['850px', '750px'],
+ content: html,
+ shadeClose: true,
+ success: function (layero, index) {
+ // 切换版本时显示对应权重配置
+ $('input[name="predict-version"]', layero).on('change', function () {
+ var val = $(this).val();
+ $('#predict-v3-weights', layero).hide();
+ $('#predict-v2-weights', layero).hide();
+ $('#predict-v1-weights', layero).hide();
+ if (val === 'v3') {
+ $('#predict-v3-weights', layero).show();
+ $('#predict-periods', layero).val(200);
+ } else if (val === 'v2') {
+ $('#predict-v2-weights', layero).show();
+ $('#predict-periods', layero).val(200);
+ } else {
+ $('#predict-v1-weights', layero).show();
+ $('#predict-periods', layero).val(100);
+ }
+ });
+ $('#btn-predict-query', layero).on('click', function () {
+ Controller.api.queryPredict(layero);
+ });
+ }
+ });
+ },
+
+ /**
+ * 查询预测结果
+ */
+ queryPredict: function (layero) {
+ var $btn = $('#btn-predict-query', layero);
+ $btn.prop('disabled', true);
+ $('#predict-result', layero).html('';
+
+ // 基准期号标题
+ html += '
基于期号 ' + lastExpect + '(特码 ' + lastSpecial + ')进行预测 | 算法版本: ' + versionNames[version] + '
';
+
+ // 置信度评估展示(V2和V3版本)
+ if (confidence && (version === 'v2' || version === 'v3')) {
+ html += '
';
+ html += '
预测置信度评估
';
+
+ // 数据警告提示(数据不足时显示)
+ if (confidence.data_warning) {
+ html += '
' + confidence.data_warning + '
';
+ }
+
+ html += '
';
+ html += '
' + confidence.overall_confidence + '%
整体置信度
';
+
+ // 各排名置信度(使用得分集中度维度)
+ if (confidence.confidence_scores && confidence.confidence_scores.length > 0) {
+ html += '
';
+ for (var i = 0; i < confidence.confidence_scores.length; i++) {
+ var cs = confidence.confidence_scores[i];
+ // 阈值定义:>=70%高(绿)、50-70%中(橙)、<50%低(红)
+ var confLevel = cs.confidence >= 70 ? '高' : (cs.confidence >= 50 ? '中' : '低');
+ var confColor = cs.confidence >= 70 ? '#4caf50' : (cs.confidence >= 50 ? '#ff9800' : '#f44336');
+ html += '
';
+ html += '
' + cs.confidence + '%
';
+ html += '
#' + cs.rank + '
';
+ html += '
';
+ }
+ html += '
';
+ }
+ html += '
';
+ }
+
+ // 回测验证结果(V2和V3版本)
+ if (backtest && (version === 'v2' || version === 'v3')) {
+ html += '
';
+ html += '
历史回测验证(最近' + backtest.total_tests + '期)
';
+
+ // 回测数据警告提示
+ if (backtest.data_warning) {
+ html += '
' + backtest.data_warning + '
';
+ }
+
+ html += '
';
+ html += '
' + backtest.hit_rate + '%
命中率(Top5)
';
+ html += '
' + backtest.total_hits + '/' + backtest.total_tests + '
命中次数
';
+ html += '
' + (backtest.avg_rank || '—') + '
平均排名
';
+
+ // 新增指标:NDCG@5 和 MRR(百分比展示)
+ if (backtest.ndcg_5 !== undefined) {
+ html += '
' + (backtest.ndcg_5 * 100).toFixed(1) + '%
NDCG@5
';
+ }
+ if (backtest.mrr !== undefined) {
+ html += '
' + (backtest.mrr * 100).toFixed(1) + '%
MRR
';
+ }
+
+ // 转移概率阶数显示(来自analysis.transition_order字段)
+ if (analysis && analysis.transition_order !== undefined) {
+ html += '
' + analysis.transition_order + '阶
转移概率
';
+ }
+ html += '
';
+
+ // 命中分布柱状图(使用rank_1..rank_5键名)
+ if (backtest.hit_distribution && Object.keys(backtest.hit_distribution).length > 0) {
+ var distribution = backtest.hit_distribution;
+ var maxHit = 0;
+ // 找最大值用于计算柱状图高度比例
+ for (var r = 1; r <= 5; r++) {
+ var key = 'rank_' + r;
+ if (distribution[key] > maxHit) {
+ maxHit = distribution[key];
+ }
+ }
+
+ html += '
命中分布(各排名命中次数):
';
+ html += '
';
+ for (var r = 1; r <= 5; r++) {
+ var key = 'rank_' + r;
+ var hitCount = distribution[key] || 0;
+ var barHeight = maxHit > 0 ? (hitCount / maxHit * 45) : 0;
+ var barColor = hitCount > 0 ? '#4caf50' : '#e0e0e0';
+ html += '
';
+ html += '
';
+ html += '
#' + r + '
';
+ html += '
' + hitCount + '
';
+ html += '
';
+ }
+ html += '
';
+ }
+
+ // 回测详情
+ if (backtest.details && backtest.details.length > 0) {
+ html += '
最近' + backtest.details.length + '期验证详情:
';
+ html += '
';
+ for (var i = 0; i < backtest.details.length; i++) {
+ var bd = backtest.details[i];
+ var hitTag = bd.hit ? '
✓' : '
✗';
+ html += '
期号' + bd.expect + ': 实际' + bd.actual + ' ' + hitTag + ' 预测[' + bd.predictions.join(',') + ']
';
+ }
+ html += '
';
+ }
+ html += '
';
+ }
+
+ // V3版本特有的分析信息
+ if (version === 'v3' && analysis) {
+ html += '
';
+ html += '
V3多维度分析
';
+
+ // 单双统计
+ if (analysis.oddeven_stats) {
+ var oe = analysis.oddeven_stats;
+ html += '
单双规律: 单号' + oe.odd_pct + '% / 双号' + oe.even_pct + '%';
+ if (oe.recent_streak >= 2) {
+ html += ' | 近期连续' + (oe.recent_type === 'odd' ? '单号' : '双号') + oe.recent_streak + '期';
+ html += '(平均连续' + (oe.recent_type === 'odd' ? oe.avg_odd_streak : oe.avg_even_streak) + '期)';
+ }
+ html += '
';
+ }
+
+ // 大小统计
+ if (analysis.bigsmall_stats) {
+ var bs = analysis.bigsmall_stats;
+ html += '
大小规律: 大号' + bs.big_pct + '% / 小号' + bs.small_pct + '%';
+ if (bs.recent_streak >= 2) {
+ html += ' | 近期连续' + (bs.recent_type === 'big' ? '大号' : '小号') + bs.recent_streak + '期';
+ html += '(平均连续' + (bs.recent_type === 'big' ? bs.avg_big_streak : bs.avg_small_streak) + '期)';
+ }
+ html += '
';
+ }
+
+ // 走势方向
+ if (analysis.trend_direction) {
+ var td = analysis.trend_direction;
+ var trendNames = { 'ascending': '上升(号码减小)', 'descending': '下降(号码增大)', 'jump': '跳跃震荡' };
+ html += '
走势方向: ' + trendNames[td.trend_type];
+ html += ' | 强度' + (td.trend_strength * 100).toFixed(0) + '% | 平均变化' + td.avg_change + '
';
+ }
+
+ // 上期属性
+ html += '
上期属性: 区域[' + (analysis.last_zone || '') + '] 尾数[' + (analysis.last_tail || '') + '] 首号[' + (analysis.last_head || '') + ']
';
+ html += '
';
+ }
+
+ // 遗漏统计信息(V2和V3版本)
+ if (analysis.omit_stats && (version === 'v2' || version === 'v3')) {
+ html += '
';
+ html += '遗漏值统计: 平均遗漏 ' + (analysis.omit_stats.avg || 0).toFixed(1) + ' 期 | 最大遗漏 ' + (analysis.omit_stats.max || 0) + ' 期 | 期望频率 ' + analysis.expected_freq + '';
+ html += '
';
+ }
+
+ // 命中结果(验证模式下显示)
+ if (hitInfo && actualResult) {
+ var hitBgColor = hitInfo.hit ? '#d4edda' : '#f8d7da';
+ var hitBorderColor = hitInfo.hit ? '#28a745' : '#dc3545';
+ var hitTitleColor = hitInfo.hit ? '#155724' : '#721c24';
+ var actualColorHex = Controller.api.getColorByNum(hitInfo.actual_num);
+
+ html += '
';
+ html += '
';
+ if (hitInfo.hit) {
+ html += ' 预测命中!排名第 ' + hitInfo.rank + ' 位';
+ } else {
+ html += ' 未命中(实际号码不在预测Top' + predictions.length + '中)';
+ }
+ html += '
';
+ html += '
';
+ html += '
期号 ' + hitInfo.actual_expect + ' 实际开奖:
';
+ html += '
' + hitInfo.actual_num + '';
+ html += '
' + hitInfo.actual_animal + ' / ' + hitInfo.actual_color + '
';
+ html += '
';
+ }
+
+ // 预测号码列表
+ var topCount = predictions.length;
+ html += '
';
+ html += '
预测推荐号码(Top ' + topCount + ')
';
+ html += '
';
+
+ for (var i = 0; i < predictions.length; i++) {
+ var p = predictions[i];
+ var colorHex = Controller.api.getColorByNum(p.num);
+ var animal = Controller.api.getAnimalByNum(p.num);
+ // 验证模式下,命中号码高亮
+ var isHit = hitInfo && hitInfo.hit && p.num === hitInfo.actual_num;
+ var cardBg = isHit ? '#fffacd' : '#fff';
+ var cardBorder = isHit ? '2px solid #f39c12' : 'none';
+ var rankBadge = i < 3 ? '
' + (i + 1) + '' : '';
+
+ // 根据版本显示不同的详情信息
+ var detailInfo = '';
+ if (p.detail) {
+ if (version === 'v3') {
+ // V3版本显示更多维度信息
+ var omitInfo = p.detail.omit || 0;
+ var transScore = p.detail.trans_score || 0;
+ var oddevenScore = p.detail.oddeven_score || 0;
+ var bigsmallScore = p.detail.bigsmall_score || 0;
+ var trendScore = p.detail.trend_score || 0;
+ detailInfo = '
';
+ detailInfo += '遗漏:' + omitInfo + '期 | ';
+ detailInfo += '转移:' + transScore + ' | ';
+ detailInfo += (p.detail.is_odd ? '单' : '双') + ':' + oddevenScore + ' | ';
+ detailInfo += (p.detail.is_big ? '大' : '小') + ':' + bigsmallScore;
+ detailInfo += '
';
+ } else if (version === 'v2') {
+ var omitInfo = p.detail.omit || 0;
+ detailInfo = '
遗漏:' + omitInfo + '期
';
+ }
+ }
+
+ html += '
' + rankBadge;
+ html += '
' + p.num + '';
+ html += '
' + animal + '
';
+ html += '
得分:' + p.score + '
';
+
+ // 显示置信度(V3版本)
+ if (version === 'v3' && confidence && confidence.confidence_scores) {
+ var csForNum = confidence.confidence_scores.find(function(c) { return c.num === p.num; });
+ if (csForNum) {
+ // 阈值定义:>=70%高(绿)、50-70%中(橙)、<50%低(红)
+ var confLevel = csForNum.confidence >= 70 ? '高' : (csForNum.confidence >= 50 ? '中' : '低');
+ var confColor = csForNum.confidence >= 70 ? '#4caf50' : (csForNum.confidence >= 50 ? '#ff9800' : '#f44336');
+ html += '
置信度:' + confLevel + ' (' + csForNum.confidence + '%)
';
+ }
+ }
+
+ html += detailInfo;
+ html += '
';
+ }
+ html += '
';
+
+ html += '
';
+ $('#predict-result', layero).html(html);
}
}
};