Kmean聚類演算法原理python實現

2021-10-05 12:51:00 字數 4237 閱讀 4972

kmean聚類演算法是基於距離對物件進行分類的演算法,該演算法實現步驟如下:

1、確定初始資料簇質心,質心的數量與需要分的類的數量一致;

2、將資料集中的每乙個物件與不同質心計算距離,並將其分類到最近的質心簇中;

3、更新資料簇質心,迭代計算,直到資料簇質心不再變化或者分類精度達到要求時,停止演算法。

**如下:

(1)建立資料集**:

import matplotlib.pyplot as plt

import numpy as np

import random

def make_data():

data_list =

data_list1 =

data_list2 =

data_list3 =

for _ in range(30):

data1 =

data2 =

data3 =

for _ in range(4):

return data_list, data_list1, data_list2, data_list3

if __name__ == '__main__':

data, _, _, _ = make_data()

# print(data)

data_x =

data_y =

for i in data:

print(i)

plt.scatter(data_x, data_y)

plt.show()

(2)kmean演算法實現分類

# kmean演算法原理演示

import numpy as np

import matplotlib.pyplot as plt

import creat_data

import sys

sys.setrecursionlimit(1000000)

def kmean_test(cornel_list, data_list):

""":param data_list: [,,,,...,]

:param cornel_list: [,,,...,],內部元素數量與需要分類的個數有關

:return: 新核心[,,,...,]和分類的資料[[,,...,],[,,...,],...,]

"""table_list =

for _ in cornel_list:

# 將列表轉換為numpy陣列

data_list_array = np.array(data_list)

cornel_list_array = np.array(cornel_list)

for data_item in data_list_array:

distance_list =

for cornel_item in cornel_list_array:

distance = np.sqrt(np.sum((data_item - cornel_item) ** 2))

min_value_index = distance_list.index(min(distance_list))

table_list_array = np.array(table_list)

# 計算新核

new_cornel_list =

for table in table_list_array:

sum_cornel = np.zeros((1, len(data_list_array[0])))

for item in table:

sum_cornel += item

km.cornel_list_a = new_cornel_list

km.table_list_b = table_list

return table_list, new_cornel_list

class km:

cornel_list_a = none

table_list_b = none

def __init__(self, a, b):

self.count = 0

self.loop(a, b)

def loop(self, cornel_list, data_list):

table, new_cornel = kmean_test(cornel_list, data_list)

if new_cornel == cornel_list:

# print("迭代%d次尋找到最佳分組如下:" % self.count)

# for table0 in table:

# for item in table0:

# print(item)

# print("#################")

return table, new_cornel

else:

self.count += 1

self.loop(new_cornel, data_list)

if __name__ == '__main__':

km = km

data, list1, list2, list3 = creat_data.make_data()

list1_x =

list1_y =

list2_x =

list2_y =

list3_x =

list3_y =

for i in list1:

for j in list2:

for k in list3:

cornel_list1 = [[1, 3, 4, 5], [5, 6, 2, 3], [5, 3, 8, 4]]

km(cornel_list1, data)

cornel1 = km.cornel_list_a

table1 = km.table_list_b

cornel_list0 = [[40, 10, 36, 5], [33, 55, 74, 21], [9, 13, 18, 4]]

km(cornel_list0, data)

cornel2 = km.cornel_list_a

table2 = km.table_list_b

init_cornel1_x =

init_cornel1_y =

init_cornel2_x =

init_cornel2_y =

cornel1_x =

cornel1_y =

cornel2_x =

cornel2_y =

for h in cornel_list1:

for h1 in cornel_list0:

for i in cornel1:

for j in cornel2:

plt.scatter(list1_x, list1_y, color='black')

plt.scatter(list2_x, list2_y, color='red')

plt.scatter(list3_x, list3_y, color='green')

plt.scatter(cornel1_x, cornel1_y, color='blue')

plt.scatter(cornel2_x, cornel2_y, color='yellow')

plt.scatter(init_cornel1_x, init_cornel1_y, color='purple')

plt.scatter(init_cornel2_x, init_cornel2_y, color='darkorange')

plt.show()

執行結果如下:

圖中用不同顏色標記不同資料點,黑色、紅色和綠色分別是不同簇的資料,橙色和紫色為初始設定的質心(初始設定了兩個不同的質心,分別對同一組資料進行分類,以說明初始質心的選擇對分類結果的影響。)黃色和藍色分別為初始質心確定的最終分類質心的結果,由於初始兩個質心最終確定的分類質心相同,導致藍色質心被覆蓋。當對其中乙個最終質心不描繪時,就可以看到另乙個藍色質心了,如下:

K mean聚類演算法

k mean演算法屬於非監督類演算法,模型相對簡單。目標函式 j sum dj i 演算法 1 初始化k個點 2 樣本xi,到k個點的距離為 dk xi uk j argmin j dk xi屬於cj 3 更新引數 uk sum xi i sum i 重複2和3,終止條件j的變化很小或者uk變化很小...

聚類及K mean演算法

首先什麼是聚類,和分類有什麼區別,這裡講乙個例子,比如有一群學生考完期末考試,現在要根據他們的成績把他們劃分成幾個小組,讓老師分別進行輔導,這時候,你不知道要劃分幾個小組比較好,但你可以根據他們的成績,比較成績接近的歸到乙個小組,這個過程就是聚類,另一種情況是直接給出了90分段的乙個小組,80分段的...

基本k mean聚類的文字聚類演算法原理和例子

基於質心的劃分方法是研究最多的演算法,包括k mean聚類演算法及其各種變體,這些變體依據初始簇的選擇,物件的劃分 相識度的計算方法 簇中心的計算方法不同而不同。基於質心的劃分方法將簇中所有物件的平均值看做簇的質心,根據乙個資料物件與簇質心的距離,將該物件賦予最近的簇。在這類方法中,需要給定劃分的簇...