源:
k-means是機器學習中乙個比較常用的演算法,屬於無監督學習演算法,其常被用於資料的聚類,只需為它指定簇的數量即可自動將資料聚合到多類中,相同簇中的資料相似度較高,不同簇中資料相似度較低。
優點:缺點:
其聚類過程類似於梯度下降演算法,建立代價函式並通過迭代使得代價函式值越來越小
例子**實現
from sklearn.cluster import kmeans
from sklearn.externals import joblib
from sklearn import cluster
import numpy as np
import matplotlib.pyplot as plt
data = np.random.rand(100,2)
estimator=kmeans(n_clusters=3)
res=estimator.fit_predict(data)
lable_pred=estimator.labels_
centroids=estimator.cluster_centers_
inertia=estimator.inertia_
#print res
print lable_pred
print centroids
print inertia
for i in range(len(data)):
if int(lable_pred[i])==0:
plt.scatter(data[i][0],data[i][1],color='red')
if int(lable_pred[i])==1:
plt.scatter(data[i][0],data[i][1],color='black')
if int(lable_pred[i])==2:
plt.scatter(data[i][0],data[i][1],color='blue')
plt.show()
輸出
基於numpy實現,源:
import numpy as np
import matplotlib.pyplot as plt
'''標誌位統計遞迴執行次數'''
flag = 0
'''歐式距離'''
def ecluddist(x, y):
return np.sqrt(sum(np.square(np.array(x) - np.array(y))))
'''曼哈頓距離'''
def manhattandist(x, y):
return np.sum(np.abs(x - y))
'''夾角余弦'''
def cos(x, y):
return np.dot(x, y)/(np.linalg.norm(x) * np.linalg.norm(y))
'''計算簇的均值點'''
def clustermean(dataset):
return sum(np.array(dataset)) / len(dataset)
'''生成隨機均值點'''
def randcenter(dataset, k):
temp =
while len(temp) < k:
index = np.random.randint(0, len(dataset)-1)
if index not in temp:
return np.array([dataset[i] for i in temp])
'''以資料集的前k個點為均值點'''
def ordercenter(dataset, k):
return np.array([dataset[i] for i in range(k)])
'''聚類'''
def kmeans(dataset, dist, center, k):
global flag
#all_kinds用於存放中間計算結果
all_kinds =
for _ in range(k):
temp =
#計算每個點到各均值點的距離
for i in dataset:
temp =
for j in center:
#列印中間結果
for i in range(k):
print('第'+str(i)+'組:', all_kinds[i], end='\n')
flag += 1
print('************************迭代'+str(flag)+'次***************************')
#更新均值點
center_ = np.array([clustermean(i) for i in all_kinds])
if (center_ == center).all():
print('結束')
for i in range(k):
print('第'+str(i)+'組均值點:', center_[i], end='\n')
plt.scatter([j[0] for j in all_kinds[i]], [j[1] for j in all_kinds[i]], marker='*')
plt.grid()
plt.show()
else:
#遞迴呼叫kmeans函式
center = center_
kmeans(dataset, dist, center, k)
def main(k):
'''生成隨機點'''
x = [np.random.randint(0, 50) for _ in range(50)]
y = [np.random.randint(0, 50) for _ in range(50)]
points = [[i,j] for i, j in zip(x, y)]
plt.plot(x, y, 'b.')
plt.show()
initial_center = randcenter(dataset=points, k=k)
kmeans(dataset=points, dist=ecluddist, center=initial_center, k=k)
if __name__ == '__main__':
main(3)
K Means聚類演算法
k means聚類演算法 intergret kmeans演算法的基本思想是初始隨機給定k個簇中心,按照最鄰近原則把待分類樣本點分到各個簇。然後按平均法重新計算各個簇的質心,從而確定新的簇心。一直迭代,直到簇心的移動距離小於某個給定的值。k means聚類演算法主要分為三個步驟 1 第一步是為待聚類...
聚類演算法 K means
演算法接受引數 k 然後將事先輸入的n個資料物件劃分為 k個聚類以便使得所獲得的聚類滿足 同一聚類中的物件相似度較高 而不同聚類中的物件相似度較小。聚類相似度是利用各聚類中物件的均值所獲得乙個 中心物件 引力中心 來進行計算的。k means演算法是最為經典的基於劃分的聚類方法,是十大經典資料探勘演...
k means聚類演算法
說到聚類,得跟分類區別開來,分類是按人為給定的標準將樣本歸到某個類別中去,在機器學習中多是監督學習,也就是訓練樣本要給標籤 正確的類別資訊 而聚類是在某種規則下自動將樣本歸類,在機器學習中是無監督學習,不需要提前給樣本打標籤。k means聚類演算法,就是在某種度量方式下,將樣本自動劃分到k個類別中...