k meanas原理自實現

2022-07-22 18:45:12 字數 3851 閱讀 7553

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 前後的空白字元

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

# print(line_obj)

# print(type(line_obj))

# print("*"*20)

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

# 列表巢狀列表的資料 ,每乙個列表元素是原來的每一行元素

# print(data_list)

# 將列表巢狀列表轉化為二維陣列

data_array = np.array(data_list)

# print(data_array)

# 將二維陣列 轉化為矩陣

data = np.mat(data_array)

# print(data)

# print(type(data))

return data

def center_init(data, k):

"""初始化聚類中心

:param data: 所有的樣本資料

:param k: 聚類的類別數目

:return: 聚類中心

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

# 獲取data 的列數

columns_num = data.shape[1]

# 獲取data 的行數

index_num = data.shape[0]

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

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

# 每次初始化乙個聚類中心,需要迴圈初始化k次

for i in range(k):

# 隨機在80行裡面選乙個下標

# np.random.uniform() --->預設生成【0,1) 小數,可以更改最小值與最大值

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

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]

columns_num = data.shape[1]

# 1、初始化聚類中心

center = center_init(data, k)

# print(center)

# 需要將這個樣本屬於哪一類,而且距離也要儲存起來吧

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

# 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,:],center[j,:])

if dist < min_dist :

min_dist = dist

min_index = j

if new_data[i,1] != min_index:

flag = true # 開啟

new_data[i,:] = min_dist,min_index

# 調整聚類中心

for p in range(k):

# p 0 1 2 3

# 找出屬於同一類別

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

# 計算這一類別的中心

# 先找出 這一類的簇第0 列的均值,與第1列的均值分別作為center 的行、列

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

return new_data,center

def show_res(data,new_data,center):

"""結果展示

:param data: 原始資料

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

:param center: 最終的聚類中心

:return: none

"""# 1、建立畫布

plt.figure()

# 2、繪圖

# 獲取原始資料的行數

index_num = data.shape[0]

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

# 繪製散點圖

# 乙個點的繪製,需要給該點進行新增顏色

for i in range(index_num):

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

# 繪製聚類中心

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

# print(center[:,0])

# print(center[:,1])

# 3、展示

plt.show()

def main():

"""主函式

:return:

"""# 1、構建資料

data = build_data()

# 2、進行自實現k-means

# 確定聚類的類別數目

k = 4

new_data, center = k_means_owns(data, k)

print(new_data)

print("*" * 80)

print(center)

# 3、結果展示

# 進行繪製結果圖形展示

show_res(data,new_data,center)

if __name__ == '__main__':

main()

k meanas原理自實現

import numpy as np import matplotlib.pyplot as plt def build data 準備資料 return 準備好的資料 data list 載入資料 with open test.txt as f 將所有的元素讀成乙個列表 lines f.readl...

KNN演算法原理與自實現

1.計算已知類別資料集中的點與當前點之間的距離 2.按照距離遞增次序排序 3.選擇與當前距離最小的k個點 4.確定前k個點所在類別的出現概率 5.返回前k個點出現頻率最高的類別作為當前點的 分類 距離計算 param v1 第乙個點的位置 param v2 第二個點的位置 return distan...

自抽樣演算法原理及python實現

後續補充 採用自抽樣方式對資料進行選擇 coding utf 8 引入資料庫包 import pymysql 引入操作excel包 import xlrd import pandas as pd import matplotlib.pyplot as plt import matplotlib im...