歡迎來到海小皮的CSDN博客
今天人工智能的實驗,簡單學習了K-means的二維聚類,在這里介紹給大家,注釋非常詳細哦!
1、思路介紹
這個方法理解起來不是特別的難,首先我來介紹一下基本思路,我以比較通俗易懂的比喻來講解:
(1)現在往地面上撒了一把豆子(隨機散布),每個豆子有自己的二維坐標(兩個維度的變數)
(2)首先隨機選K個豆子作為初始的代表人物(初始中心點),他們代表了各自的團體(聚類子集)
(3)每個豆子都計算自己到各個代表人物間的距離,加入距離自己最近的代表人物的團隊,得到初始聚類
(4)計算每一個聚類子集的中心點,選出新的代表人物(新的中心點)
(5)重復(3)(4)步,直到聚類不再發生變化
2、代碼參考
import numpy as np
import random as rd
import matplotlib.pyplot as plt
# 測驗資料
TEST = [(1,7),(2,6),(3,5),(8,1.5),(7,2.5),(1,1),(9,6),(3,8),(0.5,4),(5,3.2),(2,2),(4,3),(5,4),(4,2),(5,3),(2,1)]
# 藥品資料
Yao_list = [(1,1),(2,2),(4,3),(5,4)]
# 獲取初始聚類點
def get_init_center(raw_data,k):
return rd.sample(raw_data,k)
# 計算距離
def cal_distance(x,y):
return np.linalg.norm(np.array(x)-np.array(y))
# 分簇
def divid_cluster(center,raw_data):
cluster = [] # 創建聚類的集合
# 創建聚類的子集 數量等于中心點數
for i in range(len(center)):
cluster.append([])
dis = 0.0 # 初始化距離
# 取出每一個點進行距離判斷
for node in raw_data:
dis_min = float('inf') # 重新初始化距離最小值
flag = -1 # 重新初始化位置標志位
# 與每一個center計算距離 找到最短
for item in center:
dis = cal_distance(node,item)
if(dis < dis_min):
dis_min = dis # 更新最小值
flag += 1
# 將node添加到對應的聚類子集
if flag != -1 :
cluster[flag].append(node)
return cluster
# 計算新的中心點
def cal_new_cnter(cluster_son):
x_sum ,y_sum =0,0#初始化
for node in cluster_son:
x_sum += node[0]
y_sum += node[1]
# 創建tuple
re_center = (x_sum/len(cluster_son),y_sum/len(cluster_son))
return re_center
# 開始
K = 2 # 聚類的集合數
Raw_data = TEST # 選取二維資料集合
Linit_stop = 5000
# 隨機選擇 k個點作為初始中心點
init_center = get_init_center(Raw_data,K)
print('init centers',init_center)
# 進行聚類初始化
init_cluster = divid_cluster(init_center,Raw_data)
print('init clusters',init_cluster)
old_cluster = init_cluster
new_cluster = []
count = 0
while True:
count += 1
new_centers = []
# 計算新的聚類子集中心點
for item in old_cluster:
temp_center = cal_new_cnter(item) # 計算子集中心點
new_centers.append(temp_center) # 放入新的中心點集合
print(count,'new centers',new_centers)
# 根據新的中心點進行迭代
new_cluster = divid_cluster(new_centers,Raw_data)
print(count,'new cluster',new_cluster)
if new_cluster == old_cluster:
break
else:
old_cluster = new_cluster
if count == Linit_stop:
break
# 畫圖
x = []
y = []
count = 0
for item in old_cluster:
x = []
y = []
count += 1
for node in item:
x.append(node[0])
y.append(node[1])
if count == 1:
# 聚類
plt.scatter(x,y,s=5,c='b')
# 中心
plt.scatter(new_centers[0][0],new_centers[0][1],s=50,c='y')
elif count == 2:
# 聚類
plt.scatter(x,y,s=20,c='r')
# 中心
plt.scatter(new_centers[1][0],new_centers[1][1],s=50,c='g')
plt.show()
因為初始中心點是隨機選擇的,所以每次的聚類結果基本上是不同的,所以你運行的結果未必和我的相同
TEST的運行結果
藥品分類資料的運行結果
歡迎互相交流,初次學習,多多指教!
如果有幫助麻煩點個贊再走蛤!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/242882.html
標籤:python
