二 k means聚類演算法的手動實現

2022-05-06 17:06:14 字數 2935 閱讀 2041

import

numpy as np

import

pandas as pd

import

matplotlib as mpl

import

matplotlib.pyplot as plt

%matplotlib inline

#為了減少迭代次數,我們可以盡量把質心初始化在資料分布的內部

def randcent(data, k): #

定義隨機選取質心的函式

data_min = data.iloc[:, :].min() #

返回每乙個特徵的最小值

data_max = data.iloc[:, :].max() #

返回每乙個特徵的最大值

data_cent = np.random.uniform(data_min,data_max,(k, data.shape[1]))#

在最大值和最小值之間隨機生成k個質心,返回k*data.shape[1]形狀

return

data_cent

#將以上打包成函式,計算乙個樣本到所有質心的距離並且返回最小距離和對應的索引

defone_sample_datacent_distance(one_sample, data_cent):

one_sample_distance = np.sum(np.power((one_sample.values - data_cent), 2), axis=1) #

乙個樣本到所有質心的距離

distance_min_values = one_sample_distance.min() #

最小的距離的值

distance_min_index = np.where(one_sample_distance == distance_min_values)#

距離最短的的索引

return

distance_min_values, distance_min_index

defkmeans(data,k ):

m, n = data.shape#

提取出資料集的行列

data_cent =randcent(data, k)

add_3 = np.zeros((m,3))

add_3[:,0] =np.inf

add_3[:, 1: 3] = -1data_add_3 = pd.concat([data, pd.dataframe(add_3)] , axis=1, ignore_index =true)

clusterchanged = true #

設定乙個迴圈因子,用來控制迴圈

while

clusterchanged:

clusterchanged = false #

先更改迴圈因子,防止陷入死迴圈

for i in range(m): #

對資料集中每一條樣本進行迴圈

dist_min_values, dist_min_index = one_sample_datacent_distance(data_add_3.iloc[i, :n], data_cent) #

計算當前樣本到k個質心的距離

data_add_3.iloc[i, n] = dist_min_values #

將距離的最小值放到容器的第一列(即第n列)

#找到最小距離所在位置的索引即為簇的標號,將簇標號放入容器第二列(即第n+1列)

data_add_3.iloc[i, n+1] =dist_min_index[0]

#判斷最後兩列是否相等(簇是否還會變化),不相等則進入下一次迴圈,相等則終止迴圈

clusterchanged = not (data_add_3.iloc[:, -1] == data_add_3.iloc[:, -2]).all()

#重新計算當前的質心

ifclusterchanged:

cent_df = data_add_3.groupby(n+1).mean() #

對每個簇進行求均值

data_cent = cent_df.iloc[:,:n].values #

將均值賦值給質心(確定了新質心)

data_add_3.iloc[:, -1] = data_add_3.iloc[:, -2] #

當前簇標號賦值給最後一列

return data_cent, data_add_3

from sklearn.datasets import make_blobs #

匯入生成資料集的包

#自己建立資料集

x, y = make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)

plt.scatter(x[:, 0], x[:, 1]

,marker='o'

#點的形狀

,s=8 #

點的大小

效果還是非常好

K Means聚類演算法

k means聚類演算法 intergret kmeans演算法的基本思想是初始隨機給定k個簇中心,按照最鄰近原則把待分類樣本點分到各個簇。然後按平均法重新計算各個簇的質心,從而確定新的簇心。一直迭代,直到簇心的移動距離小於某個給定的值。k means聚類演算法主要分為三個步驟 1 第一步是為待聚類...

聚類演算法 K means

演算法接受引數 k 然後將事先輸入的n個資料物件劃分為 k個聚類以便使得所獲得的聚類滿足 同一聚類中的物件相似度較高 而不同聚類中的物件相似度較小。聚類相似度是利用各聚類中物件的均值所獲得乙個 中心物件 引力中心 來進行計算的。k means演算法是最為經典的基於劃分的聚類方法,是十大經典資料探勘演...

k means聚類演算法

說到聚類,得跟分類區別開來,分類是按人為給定的標準將樣本歸到某個類別中去,在機器學習中多是監督學習,也就是訓練樣本要給標籤 正確的類別資訊 而聚類是在某種規則下自動將樣本歸類,在機器學習中是無監督學習,不需要提前給樣本打標籤。k means聚類演算法,就是在某種度量方式下,將樣本自動劃分到k個類別中...