KMeans++算法理论和实现
生活随笔
收集整理的這篇文章主要介紹了
KMeans++算法理论和实现
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
- https://github.com/Sean16SYSU/MachineLearningImplement
簡述
在Kmeans當(dāng)中,有兩個(gè)限制
- 定義在凸歐式空間上,使得在非凸空間上的聚類效果一般,在非歐式空間上無法計(jì)算均值點(diǎn)。
- 病態(tài)初始化問題,由于初始化完全隨機(jī),會(huì)使得生成的點(diǎn)收到限制,最后聚類的結(jié)果不好
第一類問題的主流解決方案就是,轉(zhuǎn)換距離度量的方式,這樣能使得做到一定的擴(kuò)展。但任然沒有辦法解決非歐式空間的問題。
KMeans++這篇論文主要關(guān)注于第二個(gè)問題。
- KMeans的算法和實(shí)現(xiàn)就不再贅述了。可以看 K-Means算法理論及Python實(shí)現(xiàn)
這里主要描述KMeans++的算法思路(聚焦于初始化)
Xi=argmaxi=0n(min?j=1m∣∣xi?cj∣∣2)X_i = argmax_{i=0}^n( \min_{j=1}^m{||x_i - c_j||^2})Xi?=argmaxi=0n?(j=1minm?∣∣xi??cj?∣∣2)
- 其中n為點(diǎn)數(shù),m為被選中心數(shù)
很明顯這樣的點(diǎn)在一開始的時(shí)候就足夠的分散,就不會(huì)出現(xiàn)病態(tài)初始化的問題了,雖然這樣的計(jì)算量會(huì)很大。
Python實(shí)現(xiàn)
import numpy as np def k_means_pp(X, k=3):def centroid_pick(X, k):node = np.random.randint(0, len(X))centroids = [node]while len(centroids) < k:centroids.append(np.argmax([np.min([np.linalg.norm(xi - cj) if i not in centroids else -np.inf for cj in centroids ]) for i, xi in enumerate(X)]))return np.array(centroids)centroids = X[centroid_pick(X, k)]y = np.arange(len(X))while True:y_new = np.arange(len(X))for i, xi in enumerate(X):y_new[i] = np.argmin([np.linalg.norm(xi - cj) for cj in centroids])if sum(y != y_new) == 0:breakfor j in range(k):centroids[j] = np.mean(X[np.where(y_new == j)], axis=0)y = y_new.copy()return y- 用iris檢查
- 評(píng)估方式
得到的結(jié)果是
| JC | 0.6822787660436839 |
| FMI | 0.8112427991975698 |
| RI | 0.8621633554083885 |
- 實(shí)驗(yàn)效果
- 真實(shí)效果
總結(jié)
以上是生活随笔為你收集整理的KMeans++算法理论和实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【论文阅读】Clustering by
- 下一篇: 【解决方案】调用multiprocess