k means原理實現

2021-09-27 04:45:15 字數 3855 閱讀 5454

原理如下:

**如下:

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

def build_data():

'''準備資料

:return:準備好的資料

'''data_list =

with open('./test.txt') as f:

#將所有的元素讀成乙個列表

lines = f.readlines()

#迴圈對每一行元素單獨處理

for line in lines:

# print(line)

line_obj = line.strip().split('\t')

# print(line_obj)

#把line_obj裡面的每乙個元素轉化為float,追加到乙個列表中

# print(data_list)

#將列表巢狀列表轉化成陣列

data_array = np.array(data_list)

#將陣列轉化成矩陣

data = np.mat(data_array)

# print(data)

return data

def center_init(data,k):

'''初始化聚類中心

:param data:所有資料樣本

:param k:聚類的類別數目

:return:聚類中心

'''#隨機在data中挑選四行作為初始化的聚類中心

#獲取data的列數

columns_num = data.shape[1]

#獲取data的行數

index_num = data.shape[0]

#初始化全為0的中心,後續替換裡面的值

center = np.zeros(shape=(k,columns_num))

# print(center)

#每次初始化乙個聚類中心,需要初始化4次

for i in range(k):

#隨機在80裡面選乙個下標,然後取出乙個數值,賦給center

#np.random.uniform()生成0到1的小數,可以更改範圍

r = int(np.random.uniform(0,index_num))

#給center賦值

center[i,:] = data[r,:]

return center

def distance(v1,v2):

'''計算點1和點2之間的距離

:param v1:點1

:param v2:點2

:return:

'''#計算點之間的距離

dist = np.sqrt(np.sum(np.power((v1 - v2), 2)))

return dist

def k_means_owns(data,k):

'''自實現聚類演算法

:param data: 所有的樣本資料

:param k: 聚類的類別數目

:return:聚類中心,每個點屬於哪乙個類別

'''#獲取data的行數

index_num = data.shape[0]

column_num = data.shape[1]

#1.初始化聚類中心

center = center_init(data,k)

# 需要將樣本資料哪一類,而且距離儲存起來。

new_data = np.zeros(shape=(index_num,column_num))

# print(center)

#2.計算距離

#每乙個樣本,都與聚類中心計算距離

#設定開關

flag = true

while flag:

flag = false #關閉開關

for i in range(index_num):

min_dist = 10000000000

min_index = -1

#i代表每一行的樣本的下標

for j in range(k):

#每乙個樣本需壓與每乙個聚類中心計算距離

#樣本點data[i,:],聚類中心center[j,:]

dist = distance(data[i,:],data[j,:])

if dist < min_dist:

min_dist = dist

min_index = j

#把數值賦給新的new_data

if new_data[i,1] != min_index:

flag = true #開啟開關

new_data[i,:] = min_dist,min_index

#調整聚類中心

for p in range(k):

# bool_id = new_data[:,1] == p

#找出屬於同一類別,

p_clustor = data[new_data[:,1]==p,:]

#計算這一類別的中心,利用均值來計算中心

#先找出這一類的簇第0列的均值

center[p,:] = p_clustor[:,0].mean(),p_clustor[:,1].mean()

# print(center)

return new_data,center

def show_res(data,new_data,center):

'''結果展示

:param data:原始資料

:param new_data:主要包含了聚類距離與最終類別的資料

:param center:最終的聚類中心

:param k:聚類的類別數目

:return:none

'''plt.figure()

#獲取原始資料的行數

index_num = data.shape[0]

#colors = ['r','g','b','y']

for i in range(index_num):

plt.scatter(data[i,0],data[i,1],c=colors[int(new_data[i,1])])

#散點圖的繪製,乙個乙個繪製

#聚類中心的位置

#b的話是描點劃線,bx的話是畫點但是不描線

plt.plot(center[:,0],center[:,1],'bx',marker='x',markersize=12)

plt.show()

def main():

'''主函式

:return:

'''#1.構建資料

data = build_data()

#2.確定聚類的數目

k = 4

new_data, center = k_means_owns(data, k)

print(new_data, '\n', center)

#3.進行結果繪製圖形顯示

show_res(data,new_data,center)

if __name__ == '__main__':

main()

結果如下

k Means聚類原理及實現

吸收天地之精華,為了完成對資料聚類的任務,廣泛查閱各種資料,現總結如下 聚類分析是沒有給定劃分類別的情況下,根據樣本相似度進行樣本分組的一種方法,是一種非監督的學習演算法。聚類的輸入是一組未被標記的樣本,聚類根據資料自身的距離或相似度劃分為若干組,劃分的原則是組內距離最小化而組間距離最大化,如下圖所...

K means演算法原理

k means,聚類 clustering 屬於非監督學習 unsupervised learning 無類別標記。clustering 中的經典演算法,資料探勘十大經典演算法之一,其運算速度比較快,而且簡單。但是最終的結果和初始點的選擇有關,容易陷入區域性最優,且需要知道k的值。1.演算法接受引數...

Kmeans聚類演算法原理與實現

k means 演算法是最為經典的基於劃分的聚類方法,是十大經典資料探勘演算法之一。k means 演算法的基本思想是 以空間中 k個點為中心進行聚類,對最靠近他們的物件歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果。假設要把樣本集分為 k個類別,演算法描述如下 1 適當選擇 ...