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