K means聚類演算法

2021-09-11 23:05:40 字數 3344 閱讀 3861

源:

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個類別中...