尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

机器学习复习Day7——K-means

机器学习复习Day7——K-means ---type: notetitle: K-means 编程作业date: 2026-08-28description: C3W1 用两步循环把数据自动分堆①每个点找最近质心 find_closest_centroidsargmin 住几号房②每根质心挪到名下均值 compute_centroidsnp.mean 必须 axis0。循环到质心不动。可用于图像压缩几千色归成16色≈6倍。坑axis0 不写会全局平均乱套、初始质心影响结果axis默认是None。辨析比距离和距离平方选谁一样平方单调不改顺序np.linalg.norm 内部本就先平方。---# 2026-08-28 学习笔记## 笔记区学的时候随手记### 核心观点**K-means 就干一件事把一堆数据自动分成几堆。** 机器自己认哪些点是一伙的。靠的就两件事来回做循环到不再动为止1. **分堆**每根柱子质心 centroids先在数据里随便站然后每个点看离哪根柱子最近就归给它。2. **挪柱子**每根柱子把它那堆点的**平均位置**当成新位置挪过去。 打个比方教室 3 位老师随便站 3 个位每个学生走靠最近的老师老师挪到跟前来这群学生的正中间学生再重新选最近的老师……来回几回自然分成 3 群。### 关键方法/流程- **find_closest_centroids(X, centroids)** → 对每个样本算到各质心的距离取**最近那个质心的下标**np.argmin。- **compute_centroids(X, idx, K)** → 对每根质心挑它名下的所有点 X[idx k]算它们的**平均位置** np.mean(points, axis0)。- **run_kMeans** → 把上面两函数放进 for 循环里反复跑分堆 → 挪 → 分堆 → 挪……直到收敛。- **初始质心的影响**随机初始化不同 → 收敛结果可能不同K-means 会掉进**局部最优**。所以实践里**多跑几次、选代价最小的那次**。- **应用 - 图像压缩**几万种颜色聚成 K 色如 16 色每个像素只存是第几色。128×128 从 393216 bit 压到 65920 bit ≈ **6 倍**。### 实战记录**① argmin 返回的是下标不是值本身** argmin 返回下标找最小值住几号房不是最小值本身 **② axis0 一定要写** axis0 一定要写否则会算出全局平均就乱套了不写默认是 None⚠️**③ 平方——近的比较起来更近远的更远** 平方后近的比较起来更近远的更远我是这样想的**④ 关于为什么要开根号/要不要平方的澄清** np.linalg.norm(X[i] - centroids[j]) 算的就是欧氏距离 √(Σ(xᵢ−μᵢ)²)它**内部就是先各维平方 → 求和 → 再开根号**。所以你用 norm 时**并没有避开平方**——平方早就在里面做过了只是最后顺手开了根号拿到距离。 那么比**距离**和比**距离平方 ‖x−μ‖²**选出来的质心**一样**吗**一样。** 因为从 0 往大做平方是**单调递增**数越大平方涨得越猛但**从不会让原来小的平方后变成比大的还大**——先后顺序被锁死。比大小看的是**排名**排名没动选谁就不动。 感觉平方更清晰、区分度更大近的更近、远的更远——**对**平方确实放大了差距看起来更明显。但明显是**数值差距变大**跟排名顺序不变是两回事平方不改排名所以谁最小永远一样。 而公式里爱写 ‖x−μ‖²是因为它是 K-means 的**优化目标**最小化各点到质心的平方距离之和求导/累加更干净用 np.linalg.norm 只是因为现成一行给距离、顺手。两者等价**不是一个更对、一个为了省速度**。## 代码逐段展开### Ex1 find_closest_centroids(X, centroids) — 每个点找最近质心分堆pythondef find_closest_centroids(X, centroids):K centroids.shape[0] # 几个质心idx np.zeros(X.shape[0], dtypeint) # 每个样本存归哪个质心for i in range(X.shape[0]): # 遍历每个样本distance []for j in range(K): # 跟每个质心比一遍norm_ij np.linalg.norm(X[i] - centroids[j]) # 算这个样本到该质心的距离distance.append(norm_ij)idx[i] np.argmin(distance) # 谁的距间最小就归谁记下标return idx- K centroids.shape[0]质心矩阵有 K 行 K 个质心。- np.linalg.norm(X[i] - centroids[j])向量差的欧氏长度 到该质心的距离。**内部先平方再开根号**。- np.argmin(distance)**返回最小值的下标**就是住几号房不是那个最小值本身。- idx 存的是每样本归到第几号质心长度 样本数。### Ex2 compute_centroids(X, idx, K) — 每根质心挪到名下均值pythondef compute_centroids(X, idx, K):m, n X.shapecentroids np.zeros((K, n)) # K 个质心每个 n 维for k in range(K): # 逐个质心points X[idx k] # 挑出归给质心 k的所有点centroids[k] np.mean(points, axis0) # 求它们 x 和 y 的平均 新位置return centroids- X[idx k]idx k 选出归质心 k 的所有样本下标再用它把 X 里这些行挑出来。- np.mean(points, axis0)**axis0 一定写**。X 是 (m, n)每行一个样本x、y 两维axis0 是**沿行方向**求各列特征的平均 → 得到这群点的重心一个 n 维向量。- 不写 axis0 时 np.mean 默认把所有数加总平均成**一个标量**全局平均质心就乱套了。### 组合起来run_kMeanspythondef run_kMeans(X, initial_centroids, max_iters10, plot_progressFalse):centroids initial_centroidsfor i in range(max_iters):idx find_closest_centroids(X, centroids) # ① 分堆centroids compute_centroids(X, idx, K) # ② 挪柱子return centroids, idx- 就是把你写的两个函数**放进循环**反复分堆 → 挪柱子。## 线索区学完后合上材料自问自答**Q: 找最近质心时比距离和比距离平方选出来的质心一样吗为什么**A: 一样。从 0 往大做平方是**单调递增**只会把差距放大近的更近、远的更远但**不会改变大小顺序**。比大小看的是排名排名没动谁最小就不动。所以用 np.linalg.norm开根号的距离或直接比平方都一样。**Q: np.linalg.norm 是不是为了省速度/避开平方才用**A: 不是。它内部**就是先各维平方 → 求和 → 再开根号**平方早做了只是顺手开根号给距离。公式爱写平方是优化目标求导更干净。两者等价与性能无关。**Q: compute_centroids 里 np.mean(points, axis0) 为什么必须写 axis0**A: X 是 (m, n) 每行一个样本axis0 沿行求各特征平均 这群点重心。不写则默认全部加总成**一个标量**全局平均每根质心都塌成一个数乱套。**Q: K-means 为什么要反复分堆→挪柱子循环**A: 一次挪完柱子位置变了点的归属可能跟着变所以必须分堆→挪→再分堆→再挪直到质心不再动收敛才算稳住。**Q: 为什么初始质心会影响结果实践里怎么处理**A: K-means 会掉进**局部最优**初始质心不同最后分出来的群可能不一样。所以实践里**多跑几次不同随机初始化选代价离质心平方距离和最小那次**。## 总结50 字以内K-means 两步循环分堆argmin 找最近质心、np.mean(axis0) 挪均值循环到不动。axis0 不能省、初始质心影响结果。平方不改顺序开不开根选谁一样。---## 复习卡片| 概念 | 一句话 | 我的场景 || -------------- | ----------------------------------- | ------------------------ || 两步循环 | 分堆(argmin 最近) → 挪均值(np.mean) | 反复到质心不动 || argmin | 返回下标住几号房 | 找最近质心 || np.linalg.norm | 欧氏距离内部先平方再开根号 | 算到质心距离 || axis0 | 沿行求各特征平均重心 | np.mean 必须写否则全局 || 平方不改顺序 | 单调递增只看排名 | 开不开根选谁一样 || 初始质心 | 影响结果局部最优 | 多跑几次选代价最小 || 图像压缩 | 几千色归 K 色存下标 | 16 色约压 6 倍 |
返回列表