為了說明這個想法,讓我們選擇乙個均勻分布的點集作為參考資料集,並檢視k-means增加k的結果:
匯入 numpy 為 np
匯入 matplotlib。作為plt的pyplot
來自 sklearn。資料集 匯入 make_blobs
來自 sklearn。metrics import pairwise_distances
來自 sklearn。集群 匯入 kmeans
reference = np。隨機的。蘭特(100,2)
plt。圖(figsize =(12,3))
用於 ķ 在 範圍(1,6):
kmeans = kmeans(n_clusters = k)
a = kmeans。fit_predict(參考)
plt。副區(1,5,ķ)
plt。scatter(引用 [:,0 ],引用 [:,1 ],c = a)
plt。xlabel('k =' + str(k))
plt。tight_layout()
plt。show()現在讓我們對具有三個自然聚類的目標資料集執行相同的操作:
plt。圖(figsize =(12,3))
用於 ķ 在 範圍(1,6):
kmeans = kmeans(n_clusters = k)
a = kmeans。fit_predict(x)
plt。副區(1,5,ķ)
plt。散射(x [:,0 ],x [:,1 ],c = a)
plt。xlabel('k =' + str(k))
plt。tight_layout()
plt。show()
def compute_inertia(a,x):
w = [ np。意味著(pairwise_distances(x [ 乙個 == ç,:]))為 ç 在 np。獨特的(a)]
返回 np。平均值(w)
def compute_gap(clustering,k_max = 10,n_references = 5):
reference_inertia =
用於 ķ 在 範圍(1,k_max + 1):
local_inertia =
for _ in range(n_references):
聚類。n_clusters = k
assignments = clustering。fit_predict(參考)
local_inertia。追加(compute_inertia(賦值,引用))
reference_inertia。追加(np。平均值(local_inertia))
ondata_inertia =
用於 ķ 在 範圍(1,k_max + 1):
聚類。n_clusters = k
assignments = clustering。fit_predict(x)
ondata_inertia。追加(compute_inertia(賦值,x))
gap = np。log(reference_inertia)- np。log(ondata_inertia)
回報 差距,np。log(reference_inertia),np。log(ondata_inertia)
gap,reference_inertia,ondata_inertia = compute_gap(kmeans())
plt。圖(範圍(1,k_max + 1),reference_inertia,
'-o',label = 'reference')
plt。情節(範圍(1,k_max + 1),ondata_inertia,
'-o',label = 'data')
plt。xlabel('k')
plt。ylabel('log(慣性)')
plt。show()
我們現在可以計算每個k計算的差距統計量,顯示上面兩條曲線的差異:
plt。圖(範圍(1,k_max + 1),間隙,' - o ')
plt。ylabel('差距')
plt。xlabel('k')很容易看出g = k = 3時的最大值,這是我們目標資料集的正確選擇。
視覺SLAM研究點介紹
在 slam for dummy 中,有一句話說的好 slam並不是一種演算法,而是乙個概念。slam is more like a concept than a single algorithm.所以,你可以和導師 師兄弟 以及師妹,如果有的話 說你在研究slam,但是,作為同行,我可能更關心 你...
砌牆的差距
砌牆的差距 故事 建築公司經理來到乙個新工地視察,看到3個工人在不同的位置砌牆。經理對乙個工人漫不經心地說 我們砌一道牆。他對第二個工人說 我們要建一座房子。來到第三個工人的面前說,經理放眼周圍,心情十分開朗。他帶著一種豪氣說 我們要建設乙個美麗的城市。工程結束的時候,他發現第乙個工人把牆修得歪歪斜...
視覺SLAM 二 研究點介紹
在 slam for dummy 中,有一句話說的好 slam並不是一種演算法,而是乙個概念。slam is more like a concept than a single algorithm.所以,你可以和導師 師兄弟 以及師妹,如果有的話 說你在研究slam,但是,作為同行,我可能更關心 你...