9.7 KiB
9.7 KiB
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
- 坐标: 标签下方(如果两者都勾选)
使用场景:
-
教学演示
老师: "看,点A距离质心C2最近" 学生: 可以清楚看到A点的标签 -
实验记录
记录: "点C被分配到簇1" 验证: 导出Excel查看C点数据 -
问题讨论
问题: "为什么点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个质心点
(使用明显区分的颜色) ← 更新描述
✨ 质心设置完成后,可继续左键点击添加更多数据点
🎓 教学建议
使用新功能的最佳实践
-
颜色对比
- 投影演示时效果更好
- 色盲友好(红、蓝、绿三色容易区分)
-
慢速动画
- 给学生充分时间理解每一步
- 便于记笔记和提问
-
保留线段
- 暂停时可以看到整体聚类结果
- 便于讨论和分析
-
点标签
- 讲解时引用具体点更清晰
- 学生可以准确记录和复现
🚀 未来可能的扩展
基于这次更新的成功经验,未来可以考虑:
- 点标签自定义(允许用户命名)
- 动画速度可调节(滑块控制)
- 历史记录(回退到上一步)
- 自动播放模式(无需手动点击)
- 更多颜色方案(护眼模式、高对比模式)
✅ 测试确认
所有更新功能已通过测试:
- 手动添加点 - 正常工作
- 质心颜色区分 - 效果显著
- 动画速度 - 节奏合适
- 距离数值显示 - 清晰可见
- 保留最短线段 - 符合预期
- 点标签显示 - 功能完善
- 组合使用 - 无冲突
📞 问题反馈
如发现任何问题或有改进建议,欢迎反馈!
更新版本: v1.1.0
更新日期: 2025-10-17
兼容性: 完全向后兼容 v1.0.0