資料探勘1 K means均值聚類演算法

2022-07-02 05:09:06 字數 4415 閱讀 7500

一.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...