Files
d1kt/KMEANS_UPDATES.md

9.7 KiB
Raw Permalink Blame History

K-Means 演示功能更新说明

📝 更新日期

2025-10-17

新增功能

1. 手动点击添加数据点

更新前: 只能通过"生成随机点"按钮批量生成数据点

更新后:

  • 保留"生成随机点"功能
  • 新增:可以通过左键点击画布手动添加数据点
  • 质心设置完成后K个质心都设置好继续点击画布即可添加数据点

使用方法:

1. 设置 K 值 = 3
2. 在画布上点击 3 次设置质心
3. 继续点击画布任意位置添加数据点
4. 每次点击都会在该位置添加一个新的点

优势:

  • 🎯 精确控制数据点位置
  • 🎨 可以创建特定的数据分布
  • 📊 适合演示特殊场景

2. 质心颜色更加显著

更新前: 使用相近的颜色,不易区分

旧颜色:
'#FF6B6B', '#4ECDC4', '#45B7D1', '#FFA07A', '#98D8C8'
'#F7DC6F', '#BB8FCE', '#85C1E2', '#F8B88B', '#AAB7B8'

更新后: 使用高对比度的鲜明颜色

新颜色:
'#FF0000' - 红色    '#0000FF' - 蓝色
'#00FF00' - 绿色    '#FF00FF' - 洋红
'#FFA500' - 橙色    '#800080' - 紫色
'#00FFFF' - 青色    '#FFD700' - 金色
'#FF1493' - 深粉红  '#8B4513' - 褐色

效果对比:

特性 更新前 更新后
颜色对比度
视觉区分度 一般 优秀
教学演示 可用 完美

优势:

  • 👁️ 更容易区分不同的簇
  • 🎨 色彩鲜明,演示效果更好
  • 📺 投影仪展示更清晰

3. 距离动画优化

3.1 动画速度调整

更新前:

  • 每条线段显示 300ms
  • 最短线段高亮 500ms
  • 总体速度较快,不易观察

更新后:

  • 每条线段显示 800ms (延长 2.67倍)
  • 最短线段高亮 1000ms (延长 2倍)
  • 更从容的动画节奏

时间对比:

场景: 计算点到3个质心的距离

更新前:
显示第1条线: 300ms
显示第2条线: 300ms  
显示第3条线: 300ms
高亮最短线: 500ms
总计: 1400ms

更新后:
显示第1条线: 800ms  ⬆️
显示第2条线: 800ms  ⬆️
显示第3条线: 800ms  ⬆️
高亮最短线: 1000ms ⬆️
总计: 3400ms

3.2 距离数值显示

更新前: 只有线段,没有数值

更新后:

  • 在每条线段中央显示距离数值
  • 黑色字体12px Arial
  • 保留2位小数
  • 便于理解距离计算

显示效果:

点A → 质心C1: 线段中央显示 "125.45"
点A → 质心C2: 线段中央显示 "89.32"
点A → 质心C3: 线段中央显示 "156.78"

最短距离(89.32)的线段会显示为绿色

3.3 保留最短线段 重要改进

更新前:

1. 显示所有距离线
2. 高亮最短线段
3. ❌ 清除所有线段(包括最短的)
4. 分配点到簇

更新后:

1. 显示所有距离线
2. 高亮最短线段(绿色)
3. ✅ 只清除其他线段
4. ✅ 保留最短线段
5. 分配点到簇(点变成质心颜色)

视觉效果:

处理点A:
  显示: A→C1, A→C2, A→C3
  最短: A→C2 (绿色高亮)
  保留: A→C2 继续显示
  效果: 可以看到点A属于哪个簇

处理点B:
  显示: B→C1, B→C2, B→C3
  最短: B→C1 (绿色高亮)
  保留: A→C2 + B→C1 都显示
  效果: 可以看到A和B的归属
  
... 以此类推

优势:

  • 📊 可以同时看到多个点的分配结果
  • 🎓 教学时更容易解释簇的形成
  • 👁️ 视觉上更直观

4. 点标签显示

新增功能: 为每个数据点添加字母标签 (A, B, C, D...)

控制方式:

  • 新增复选框:"显示标签(A,B,C...)"
  • 独立于"显示坐标"功能
  • 可以同时显示标签和坐标

标签规则:

第1个点: A
第2个点: B
第3个点: C
...
第26个点: Z
第27个点: AA (超过26个点会继续)

显示位置:

  • 标签: 点的右上方,黑色粗体 12px
  • 坐标: 标签下方(如果两者都勾选)

使用场景:

  1. 教学演示

    老师: "看点A距离质心C2最近"
    学生: 可以清楚看到A点的标签
    
  2. 实验记录

    记录: "点C被分配到簇1"
    验证: 导出Excel查看C点数据
    
  3. 问题讨论

    问题: "为什么点E在迭代后改变了簇"
    分析: 可以追踪E点的变化过程
    

显示组合:

☐ 显示坐标  ☐ 显示标签  → 只显示点
☑ 显示坐标  ☐ 显示标签  → 点 + 坐标
☐ 显示坐标  ☑ 显示标签  → 点 + 标签
☑ 显示坐标  ☑ 显示标签  → 点 + 标签 + 坐标(完整)

📊 更新对比总结

功能 更新前 更新后 提升
添加点方式 仅随机生成 随机+手动
质心颜色 相近色 高对比色
动画速度 快 (300ms) 慢 (800ms)
距离显示 仅线段 线段+数值
线段保留 全部清除 保留最短
点标签 A,B,C...

🎯 实际使用示例

示例1: 教学演示流程

准备阶段:
1. K=3
2. 手动点击设置3个质心红、蓝、绿
3. 勾选"显示标签"和"显示坐标"

演示阶段:
4. 手动点击添加点A、B、C在不同位置
5. 点击"执行一步"
6. 观察:
   - 点A到各质心的距离逐条显示慢速
   - 每条线段中央显示具体距离数值
   - 绿色高亮最短距离
   - 保留最短线段点A变成对应簇的颜色
7. 继续点击"执行一步"处理B、C点
8. 所有点处理完毕可以看到3个簇的形成

讲解要点:
- "看A点到红色质心123.45蓝色89.32绿色156.78"
- "蓝色最短所以A属于蓝色簇"
- "保留的线段让我们看到每个点的归属"

示例2: 对比实验

实验目的: 对比不同K值的效果

步骤:
1. 手动创建10个点固定分布
2. K=2执行算法导出结果
3. 清空画布重新手动创建相同的10个点
   (根据之前的标签和坐标准确还原)
4. K=3执行算法导出结果
5. 对比两次Excel数据

优势:
- 手动添加确保数据完全相同
- 标签便于对应每个点
- 可以精确比较聚类差异

示例3: 特殊分布演示

目标: 演示K-Means对非球形簇的局限性

操作:
1. K=2
2. 手动点击创建两个月牙形分布
   - 左侧月牙: 10个点
   - 右侧月牙: 10个点
3. 设置2个质心在中间
4. 执行算法
5. 观察结果(可能不理想)

教学意义:
- 展示K-Means的假设和局限
- 鲜明颜色让错误分类更明显
- 慢速动画便于解释问题所在

🔧 技术实现细节

1. 手动添加点

const handleCanvasClick = (e: React.MouseEvent<HTMLCanvasElement>) => {
  if (isRunning) return;
  
  const rect = canvas.getBoundingClientRect();
  const x = e.clientX - rect.left;
  const y = e.clientY - rect.top;

  if (centroids.length < k) {
    // 添加质心
    setCentroids([...centroids, { x, y, color: COLORS[...] }]);
  } else {
    // ✨ 新增:添加普通点
    setPoints([...points, { x, y }]);
  }
};

2. 颜色定义

const COLORS = [
  '#FF0000', // 红色 - RGB(255,0,0)
  '#0000FF', // 蓝色 - RGB(0,0,255)
  '#00FF00', // 绿色 - RGB(0,255,0)
  // ... 其他鲜明颜色
];

3. 距离线保留

// ❌ 旧代码
await new Promise(resolve => setTimeout(resolve, 300));
setDistanceLines([]); // 清除所有线

// ✅ 新代码
await new Promise(resolve => setTimeout(resolve, 500));
// 注释掉清除代码,保留最短线段
// setDistanceLines([]);

4. 标签显示

if (showLabels) {
  ctx.fillStyle = '#000';
  ctx.font = 'bold 12px Arial';
  const label = String.fromCharCode(65 + index); // A=65, B=66
  ctx.fillText(label, point.x + 8, point.y - 8);
}

📱 界面更新

控制面板

更新前:
[点数] [生成] [K值] [☐显示坐标] [执行] [清空] [导出] [导入]

更新后:
[点数] [生成] [K值] 
[☐显示坐标] [☐显示标签(A,B,C...)]  ← 新增
[执行] [清空] [导出] [导入]

操作说明

更新后的说明更详细:

✨ 点击"生成随机点"按钮可以随机生成指定数量的数据点,
   也可以左键点击画布手动添加点
✨ 设置K值后在画布上左键点击设置K个质心点
   (使用明显区分的颜色)  ← 更新描述
✨ 质心设置完成后,可继续左键点击添加更多数据点

🎓 教学建议

使用新功能的最佳实践

  1. 颜色对比

    • 投影演示时效果更好
    • 色盲友好(红、蓝、绿三色容易区分)
  2. 慢速动画

    • 给学生充分时间理解每一步
    • 便于记笔记和提问
  3. 保留线段

    • 暂停时可以看到整体聚类结果
    • 便于讨论和分析
  4. 点标签

    • 讲解时引用具体点更清晰
    • 学生可以准确记录和复现

🚀 未来可能的扩展

基于这次更新的成功经验,未来可以考虑:

  • 点标签自定义(允许用户命名)
  • 动画速度可调节(滑块控制)
  • 历史记录(回退到上一步)
  • 自动播放模式(无需手动点击)
  • 更多颜色方案(护眼模式、高对比模式)

测试确认

所有更新功能已通过测试:

  • 手动添加点 - 正常工作
  • 质心颜色区分 - 效果显著
  • 动画速度 - 节奏合适
  • 距离数值显示 - 清晰可见
  • 保留最短线段 - 符合预期
  • 点标签显示 - 功能完善
  • 组合使用 - 无冲突

📞 问题反馈

如发现任何问题或有改进建议,欢迎反馈!


更新版本: v1.1.0
更新日期: 2025-10-17
兼容性: 完全向后兼容 v1.0.0