一.k-means均值聚類演算法原理
對於給定的樣本集,按照樣本之間的距離大小,將樣本集劃分為k個簇。讓簇內的點盡量緊密的連在一起,而讓簇間的距離盡量的大。
如果用資料表示式表示,假設簇劃分為(c1,c2,…ck),則我們的目標是最小化平方誤差e:
其中μi是簇ci的均值向量,有時也稱為質心,表示式為:
二.k-means均值聚類演算法步驟:
資料樣本間的相似性度量:歐式距離
評價聚類效能的準則函式:最小誤差準則函式
輸入:簇的數目k和包含n個物件的資料庫
輸出:k個簇,使平方誤差準則最小
設定初始類別中心和簇數
根據簇中心對資料進行簇劃分
重新計算當前簇劃分下每個簇的中心
在得到簇中心下繼續進行簇劃分
如果連續兩次的簇劃分結果不變(即最小誤差函式的值達到最優)則停止演算法;否則一直迴圈
實驗原始碼:
# 匯入第三方模組
import random
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import axes3d # 空間三維畫圖
def load_data(path):
df = pd.read_excel(path)
column_count = df.shape[1]
df_li = df.values.tolist()
return df_li,column_count
# 計算歐式距離,並且儲存到陣列中
def distance(dataset,centroids,k):
利用np.tile()將dataset中的元素擴充套件到與centroids同乙個shape
也就是算出dataset中的每乙個元素分別與centroids的disatcne,
儲存到乙個列表中,並將這個列表儲存到原先設定的空列表中,最後
將儲存完資料的列表轉換為陣列格式
需要明確的是,分成幾簇,必定會有k個質心,擴充套件成k維後,能分別
計算資料集中的某乙個元素與這k個質心的距離
dis_list =
for data in dataset:
diff = (np.tile(data,(k,1)))-centroids
squareddiff = diff ** 2
squareddist = np.sum(squareddiff,axis=1)
distance = squareddist ** 0.5
dis_list = np.array(dis_list)
return dis_list
# 計算質心,並且返回質心變化量
def centroids_init(dataset,centroids,k):
# 首先計算初始化質心與資料集元素之間的距離
dis_list = distance(dataset,centroids,k)
# 根據第一次距離計算進行分類,並計算出新的質心
mindistindices = np.argmin(dis_list,axis=1) #axis 表示每行最小值下標
# #dataframe(dataset)對dataset分組
# groupby(min)按照min進行統計分類
# mean()對分類結果求均值
newcentroids = pd.dataframe(dataset).groupby(mindistindices).mean()
newcentroids = newcentroids.values
# 計算新質心與初始化質心的變化量
centroids_change = newcentroids - centroids
return centroids_change,newcentroids
# 使用k-means進行分類
def k_means(dataset,k):
# 隨機獲取質心,作初始化處理
# 從資料集中隨機取k個元素作為質心
centroids = random.sample(dataset,k)
centroids_change,newcentroids = centroids_init(dataset,centroids,k)
# 不斷更新質心,直到centroids_change為0,表示聚類中心已經確定
while np.any(centroids_change != 0 ):
centroids_change,newcentroids = centroids_init(dataset,newcentroids,k)
# 將矩陣轉換為列表,並排序
centroids = sorted(newcentroids.tolist())
# 根據質心來聚類
cluster =
# 計算歐式距離
dis_list = distance(dataset,centroids,k)
mindistindices = np.argmin(dis_list,axis=1)
for i in range(k):
# 根據k個質心建立k個空列表,表示k個簇
for i,j in enumerate(mindistindices):
# 將dataset中的元素分類到指定的列表中
return centroids,cluster
# 資料視覺化
def visualization(dataset,centroids):
if column_count == 2:
for i in range(len(dataset)):
plt.scatter(dataset[i][0],dataset[i][1],marker = 'o',color = 'blue',s = 40,label = '原始點')
for j in range(len(centroids)):
plt.scatter(centroids[j][0],centroids[j][1],marker = 'x',color = 'red',s = 50,label = '質心')
plt.show()
elif column_count == 3:
fig = plt.figure()
ax = axes3d(fig)
for i in range(len(dataset)):
ax.scatter(dataset[i][0],dataset[i][1],dataset[i][2],marker = 'o',color = 'blue',s = 40,label = '原始點')
for j in range(len(centroids)):
ax.scatter(centroids[j][0],centroids[j][1],centroids[j][2],marker = 'x',color = 'red',s = 50,label = '質心')
ax.set_zlabel('z', fontdict=)
ax.set_ylabel('y', fontdict=)
ax.set_xlabel('x', fontdict=)
plt.show()
else:
print('資料維度過高,無法進行視覺化')
if __name__ == '__main__':
path = input(r'請輸入檔案的路徑:')
dataset,column_count = load_data(path)
print(dataset)
print('-'*30,'讀取成功','-'*30)
k = int(input('請輸入簇數:'))
centroids,cluster = k_means(dataset,k)
print('質心為:%s'%centroids)
print('集群為:%s'%cluster)
visualization(dataset,centroids)
三.執行截圖
分別利用三維資料集和二維資料對演算法進行測試
三維資料集:大連**醫院哪家好
執行結果:
二維資料集:
執行結果:
聚類演算法(1) K Means
k means不斷地取離種子點最近均值,將資料點到原型的某種距離作為優化的目標函式,利用函式求極值的方法得到迭代運算。演算法流程 1 初始化選擇k個點作為k個聚類樣本中心 2 迭代 計算每個樣本點到中心點的距離,根據距離判斷每個樣本點所屬類別 各聚類根據屬於自己這一類的樣本點的均值更新聚類中心 3 ...
Python機器學習 1 KMeans聚類
python進行kmeans聚類是比較簡單的,首先需要import numpy,從sklearn.cluster中import kmeans模組 import numpy as np from sklearn.cluster import kmeans 然後讀取txt檔案,獲取相應的資料並轉換成nu...
k均值例子 資料探勘 K means聚類原理和例子
本課程講解現在工業界和學術界流行的機器學習演算法的相關知識,以及如何用python去實現這些演算法。演算法的講解包括supervised learning 有監督式學習 和unsupervised learning 無監督式學習 兩個部分。其中supervised learning包括classif...