聚類算法之划分方法(k-means)


 聚類划分方法

    給定n個數據點的數據集合,構建數據集合的出K個划分,每個划分代表一個類別,2<k<sqrt(n)。算法思想,划分法需要預先指定聚類數目和聚類中心,計算每個點與其他點的距離,對於每個數據點都有n-1個距離值,對這些距離值進行排序,找出最接近的數據點,算出這些距離的和值。並進行下次迭代,這時數據中興點位置改變,繼續按照上方的步驟,逐步降低目標函數的誤差值,直到目標函數值收斂時,得到最終聚類的結果。逐步對聚類結果進行優化、不斷將目標數據集向各個聚類中心進行重新分配以獲最優解。代表算K-means,K-medoids.(公式亂碼,用文字代替)

setp1:指定K個聚類中心

setp2:(每一個數據點與初始聚類中心的距離)

setp3:(對每一個數據點x,找到最近的C(聚類中心),x分配到新的類C中)

setp4:(更新聚類中心點)

setp5:(計算每一類的偏差)

setp6:判斷偏差是否小於閾值(自己設定),不小於則返回setp2

    當聚類是密集的,而聚類之間區別明顯時,KMeans算法的效果較好。另外,對處理大數據集,該算法是高效率的,因為它的復雜度是,其中,n是所有對象的數目,K是聚類的數目,t是迭代的次數。通常。但是,KMeans算法只有在聚類的平均值被定義的情況下才能使用。如果處理符號屬性的數據並不適用。KMeans算法對初始聚類中心和樣本的輸入順序敏感,對於不同的初始聚類中心和樣本輸入順序,聚類結果會有很大差別。由於采用迭代更新的方法,所以當初始聚類中心落在局部值最小附近時,算法容易生成局部最優解。另外,算法的效果受孤立點的影響很大。

優點:1簡單,易於理解和實現;2,時間復雜度低3.聚類中心用各類別中所有數據的平均值表示k-means方法的缺陷1,需要對均值給出定義,2,需要指定要聚類的數目;3,一些過大的異常值會帶來很大影響;4,算法對初始選值敏感;5,適合球形聚類6.果好壞依賴於對初始聚類中心的選擇、容易陷入局部最優解、對K值的選擇沒有准則可依循、只能處理數值屬性的數據、聚類結構可能不平衡。

簡單說下:k-means和K-medoids區別,k-means聚類中心在空間上(也就是可能是在數據上,也可能不再數據上),K-medoids呢,聚類中心要求在數據上

簡單實現k-means

from sklearn.cluster import KMeans
from sklearn import datasets
from dask.array.learn import predict
import numpy as np
iris = datasets.load_iris()
X = iris.data
y = iris.target
clf=KMeans(n_clusters=3)
model=clf.fit(X)
predicted=model.predict(X)
#設置區間
print(predicted)
k2y = np.array([0,1,2]) #
print(k2y[predicted])
print((k2y[predicted] == y).astype(int).mean())

好的這樣做出來精確度為89.3%,聚類算法受到初始點的影響很大,初始點選取的好壞直接影響我們聚類精度。這是初始k-means ,當然可以改進算法,加核。。。。(這里不闡述)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM