程式設計實現之k均值演算法

2021-10-01 01:57:35 字數 1642 閱讀 1543

聚類屬於無監督學習。周志華老師在《機器學習》一書中詳細講解了各種聚類演算法,如k均值、學習向量量化、高斯混合聚類等。在這篇部落格中,我根據周志華老師描述的演算法步驟,用python實現了 k均值演算法。具體**如下:

import pandas as pd

import numpy as np

import random

import matplotlib.pyplot as plt

#首先從資料集中讀入資料

midu =

hantanglv =

df = pd.read_excel('西瓜資料集4.0.xlsx')

for i in df.index.values:

m = len(midu)

def distance(x1, y1, x2, y2):

return ((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))**0.5

def kmeans(x):

m = 0

h = 0

for i in x:

m = m + i[0]

h = h + i[1]

return m/len(x), h/len(x)

#按照書上所講,將聚類簇數定義為3

k = 3

#用flag表示均值向量有沒有更新

flag = k

#選擇k個樣本作為均值向量

u = random.sample(range(0, m), k)

u =

for i in u:

#開始迭代

while flag==k:

c =

flag=0

for i in range(k):

for i in range(m):

#使用歐式距離

everydistance = [distance(midu[i], hantanglv[i], j[0], j[1]) for j in u]

for i in range(k):

mk, hk = kmeans(c[i])

if u[i][0] != mk or u[i][1] != hk:

u[i] = (mk, hk)

flag = flag + 1

#將聚類結果視覺化出來

co = ['r', 'g', 'b', 'm']

for i in range(k):

mm = [a[0] for a in c[i]]

hh = [a[1] for a in c[i]]

plt.scatter(mm, hh, color=co[i%len(co)])

plt.scatter(u[i][0], u[i][1], marker='x')

plt.show()

採用的資料集是西瓜資料集4.0:

最終聚類結果如下圖所示:

因為初始均值向量是隨機生成的,所以每次的聚類結果都不太一樣。

K 均值演算法

動態聚類方法是模式識別中一種普遍採用的方法,它具有以下3個要點 1 選定某種距離度量作為樣本間的相似性度量 2 確定某個評價聚類結果質量的準則函式 3 給定某個初始分類,然後用迭代演算法找出使準則函式取極值的最好的聚類結果 k means演算法 輸入 聚類個數k,以及包含 n個資料物件的資料庫。輸出...

K均值演算法

假設需要聚成k個類 演算法先會隨機從資料集中選取k個點,把他們當做k個聚類的中心點 依次計算資料集中的每乙個點與各個中心點的距離,離哪個中心點近,就劃分到那個中心點對應的聚類下 計算分到同一類簇下,所有點的均值,更新中心點,重複 直至達到迭代結束條件 import numpy as np impor...

k均值演算法

1 撲克牌手動演練k均值聚類過程 30張牌,3類 實驗總牌數為30,分三類進行三輪迭代。第一輪 抽取聚類中心為 3 4 7.聚類結果為 第二輪 經過求平均後,重新確定聚類中心為 2 4 10 第三輪 對上類再進行求平均,選定聚類中心為2 5 10 最終聚類中心穩定在2 5 10,以此為小中大劃分。2...