KMeans++算法理论和实现
生活随笔
收集整理的這篇文章主要介紹了
KMeans++算法理论和实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- https://github.com/Sean16SYSU/MachineLearningImplement
簡述
在Kmeans當中,有兩個限制
- 定義在凸歐式空間上,使得在非凸空間上的聚類效果一般,在非歐式空間上無法計算均值點。
- 病態初始化問題,由于初始化完全隨機,會使得生成的點收到限制,最后聚類的結果不好
第一類問題的主流解決方案就是,轉換距離度量的方式,這樣能使得做到一定的擴展。但任然沒有辦法解決非歐式空間的問題。
KMeans++這篇論文主要關注于第二個問題。
- KMeans的算法和實現就不再贅述了??梢钥?K-Means算法理論及Python實現
這里主要描述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為點數,m為被選中心數
很明顯這樣的點在一開始的時候就足夠的分散,就不會出現病態初始化的問題了,雖然這樣的計算量會很大。
Python實現
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檢查
- 評估方式
得到的結果是
| JC | 0.6822787660436839 |
| FMI | 0.8112427991975698 |
| RI | 0.8621633554083885 |
- 實驗效果
- 真實效果
總結
以上是生活随笔為你收集整理的KMeans++算法理论和实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【论文阅读】Clustering by
- 下一篇: 高斯混合模型GMM理论和Python实现