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...