原理如下:
**如下:結果如下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 適當選擇 ...