K means演算法實現

2021-09-21 14:03:44 字數 4301 閱讀 6412

首先隨機生成k個聚類中心點

根據聚類中心點,將資料分為k類。分類的原則是資料離哪個中心點近就將它分為哪一類別。

再根據分好的類別的資料,重新計算聚類的類別中心點。

不斷的重複2和3步,直到中心點不再變化。

from numpy import

*import csv

import matplotlib.pyplot as plt

# 讀取csv中的資料

defload_data

(file_name)

: output =

with

open

(file_name,

"r", newline='')

asfile

: reader = csv.reader(

file

)for row in reader:

float_line =

[float

(row[0]

),float

(row[1]

)]return output

# 計算歐氏距離

defget_euclid_distance

(vector_a, vector_b)

: temp_x = power(vector_a[0]

- vector_b[0]

,2)# (a - b)的平方

temp_y = power(vector_a[1]

- vector_b[1]

,2)# (a - b)的平方

temp_sum = temp_x + temp_y # 求和

return sqrt(temp_sum)

# 構建聚類簇的中心,取k個隨機的中心

defget_random_center

(data_set, k)

: n =

len(data_set[0]

) center_points =

for a in

range

(k):[0

,0])

# 每個質心有n個座標值,總共要k個質心

min_list =

max_list =

for a in

range

(n):

temp_list =

for item in data_set:

)min

(temp_list)

)max

(temp_list)

)for a in

range

(n):

for item in center_points:

min_a = min_list[a]

max_a = max_list[a]

range_a =

float

(max_a - min_a)

item[a]

= min_a + range_a * random.random(

)return center_points

# k-means的子方法,計算輸入的資料距離哪個分類簇最近

defget_nearest_center_point

(vector_input, center_points)

: min_distance =

999999

min_index =-1

for a in

range

(len

(center_points)):

distance = get_euclid_distance(vector_input, center_points[a]

)if distance < min_distance:

min_distance = distance

min_index = a

return min_index

# k-means的子方法,計算中心點座標,其實就是所有的x取平均值,所有的y取平均值

defget_center

(data_set, nearest_points_list, center_points)

:for a in

range

(len

(center_points)):

temp_data_set =

for b in

range

(len

(nearest_points_list)):

if a == nearest_points_list[b]:)

# x的平均值

x =0 y =

0for item in temp_data_set:

x = x + item[0]

y = y + item[1]

center_points[a]=[

(x /

len(temp_data_set)),

(y /

len(temp_data_set))]

return center_points

# k-means 聚類演算法

defk_means

(data_set, k)

:# 存放了資料集中每乙個資料的最近中心點

nearest_points_list =

for _ in data_set:-1

) center_points = get_random_center(data_set, k)

cluster_changed =

true

# 用來判斷聚類是否已經收斂

while cluster_changed:

cluster_changed =

false

# 把每乙個資料點劃分到離它最近的中心點,如果中心點和上一次迭代的中心點不同,則需要繼續迭代

for a in

range

(len

(data_set)):

nearest_point_index = get_nearest_center_point(data_set[a]

, center_points)

if nearest_points_list[a]

!= nearest_point_index:

cluster_changed =

true

nearest_points_list[a]

= nearest_point_index

center_points = get_center(data_set, nearest_points_list, center_points)

for a in

range

(len

(data_set)):

data_set[a]

)return data_set

# 畫散點圖

defdraw_scatter

(data_set)

: x_list =

y_list =

type_list =

for item in data_set:0]

)1])

2])print

(x_list)

plt.scatter(x_list, y_list, c=type_list, marker=

"o")

plt.colorbar(

) plt.xlabel(

"x")

plt.ylabel(

"y")

plt.title(

"k-means output"

) plt.show(

)# 程式入口

data = load_data(

"k-means資料集.csv"

)output = k_means(data,5)

draw_scatter(output)

「k-means資料集.csv」中的資料(由於篇幅原因,這裡只寫了五條資料):

39.9977029,35.8926435

19.7229760,88.8343157

61.2781605,42.0899836

69.3072809,78.9241336

24.7780982,85.9094580

聚類結果(使用matplotlib繪製的散點圖,共聚成5類):

Kmeans演算法實現

include opencv2 highgui highgui.hpp include opencv2 core core.hpp include using namespace cv using namespace std static void help int main int argc ch...

K means演算法實現

import math import numpy class point data reader file name str def init self,file name point data reader.file name file name defget data list self,num...

matlab實現kmeans演算法

kmeans是一種聚類演算法 無監督學習 演算法分為兩步 1.隨機選取k個聚類中心。2.計算每個樣本點離哪個聚類中心最近 距離計算 就將該樣本分為這個類。3.重新計算這k個類的聚類中心。一種簡單的計算方法為 計算每個類的平均值即為新的聚類中心。重複執行步驟2,直到聚類中心的變化小於給定閾值,或者達到...