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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

KMeans++算法理论和实现

發(fā)布時(shí)間:2025/4/16 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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++的算法思路(聚焦于初始化)

  • 先隨機(jī)選一個(gè)點(diǎn),作為初始的中心
  • 之后,在其他沒有選的點(diǎn)中,找到離已經(jīng)選好的點(diǎn)最遠(yuǎn)的點(diǎn)(即,離中心點(diǎn)集中點(diǎn)的最小距離的值,在所有的沒有被選中為中心點(diǎn)的點(diǎn)中是距離最大的點(diǎn))
    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)放入中心集合中,一直到最后選完k個(gè)初始化的中心
  • 之后,接著完成KMeans操作即可
  • 很明顯這樣的點(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檢查
    from sklearn import datasetsiris = datasets.load_iris() test_y = k_means_pp(iris.data)
    • 評(píng)估方式
    def evaluate(y, t):a, b, c, d = [0 for i in range(4)]for i in range(len(y)):for j in range(i+1, len(y)):if y[i] == y[j] and t[i] == t[j]:a += 1elif y[i] == y[j] and t[i] != t[j]:b += 1elif y[i] != y[j] and t[i] == t[j]:c += 1elif y[i] != y[j] and t[i] != t[j]:d += 1return a, b, c, ddef external_index(a, b, c, d, m):JC = a / (a + b + c)FMI = np.sqrt(a**2 / ((a + b) * (a + c)))RI = 2 * ( a + d ) / ( m * (m + 1) )return JC, FMI, RIdef evaluate_it(y, t):a, b, c, d = evaluate(y, t)return external_index(a, b, c, d, len(y))

    得到的結(jié)果是

    External indexValue
    JC0.6822787660436839
    FMI0.8112427991975698
    RI0.8621633554083885
    • 實(shí)驗(yàn)效果

    • 真實(shí)效果

    總結(jié)

    以上是生活随笔為你收集整理的KMeans++算法理论和实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。