日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

K-Means算法理论及Python实现

發布時間:2025/4/16 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 K-Means算法理论及Python实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡述

K-means Algorithm(s)

  • Assumes Euclidean space/distance 假設是在歐式空間下的。因為means本身是需要在歐式空間下才可以計算。但K-means有很多的推廣版本,將歐式空間中所提到的Centroid轉成Clustroid,是一種比較常見的推廣方式。
  • 算法先取k個類: Initialization 的時候需要避免ill-initialization 這里考慮到病態的初始化。最為經典的是使用 Rival penalized competitive learning1

總之,通過一定的方式,可以實現初始化的K個類中心的選取。

算法流程

  • For each point, place it in the cluster whose current centroid it is nearest.對于每個點,將其放在那個類中心離它最近的那個類中。
  • After all points are assigned, update the locations of centroids of the K clusters. 每個點都被分配完之后,更新每個類的中心位置。
  • Reassign all points to their closet centroid. 再分配每個點(方法類似)直到整個分配沒什么變化。(直到收斂)

收斂性證明

這里我只給出不是很嚴謹的證明~ 至于詳細的可以看60年前的那篇論文。

我們認為K-means一定會收斂。
下面使用反證法:
假設該算法不收斂。

那么根據假設就存在有這樣的一個點。在添加它之后,即類中心發生移動后,就該刪除掉它。
而這是不合理的。添加上該點之后,該類中心會向該點的發生移動。即距離比之前更近了。而根據算法,我們知道這樣的點是不會被拋棄的。所以,這樣的點不存在。即該算法會收斂。

證明不是很嚴謹,但是卻可以拿來做對于算法收斂的直觀認知~
歡迎大家在評論區補充~

Python實現

  • 注意,這里采用的是完全隨機初始化,這樣的效果不是很好。因為可能會存在有病態的初始化結果。
def k_means(X, k=3):index_list = np.arange(len(X))np.random.shuffle(index_list)centroids_index = index_list[:k]centroids = X[centroids_index]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
  • 直接用PCA截取部分特征,主要是為了畫圖
from sklearn import datasets iris = datasets.load_iris() from sklearn.decomposition import PCA X_reduced = PCA(n_components=2).fit_transform(iris.data) import matplotlib.pyplot as plt plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=y, cmap=plt.cm.Set1)

原圖:

K-means:

  • 直接選用前兩個特征
plt.scatter(iris.data[:, 0], iris.data[:, 1], c=y, cmap=plt.cm.Set1) y_test_2 = k_means(iris.data) plt.scatter(iris.data[:, 0], iris.data[:, 1], c=y_test, cmap=plt.cm.Set1)

原圖:

K-means:


  • https://ieeexplore.ieee.org/abstract/document/238318) ??

  • 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的K-Means算法理论及Python实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。