根據k-均值演算法的工作流程,我們可以寫出偽**:
建立k個點作為初始質心(通常是隨機選擇)
當任意乙個點的簇分配結果發生改變時:
對資料集中的每個點:
對每個質心:
計算質心與資料點之間的距離
將資料點分配到據其最近的簇
對每個簇,計算簇中所有點的均值並將均值作為新的質心
直到簇不再發生變化或者達到最大迭代次數
距離計算公式可以使用歐幾里得距離,曼哈頓距離,閔可夫斯基距離等等,**展示為了簡單使用歐幾里得距離。
import numpy as np
import matplotlib.pyplot as plt
# 計算距離
defeucldistance
(vector1, vector2)
:return np.sqrt(
sum(
(vector2 - vector1)**2
))# 初始化質心
definitcentroids
(data, k)
: numsamples, dim = data.shape
# k個質心,列數跟樣本的列數一樣
centroids = np.zeros(
(k, dim)
)# 隨機選出k個質心
for i in
range
(k):
# 隨機選取乙個樣本的索引
index =
int(np.random.uniform(
0, numsamples)
)# 作為初始化的質心
centroids[i,:]
= data[index,:]
return centroids
# 傳入資料集和k的值
defkmeans
(data, k)
:# 計算樣本個數
numsamples = data.shape[0]
# 樣本的屬性,第一列儲存該樣本屬於哪個簇,第二列儲存該樣本跟它所屬簇的誤差
clusterdata = np.array(np.zeros(
(numsamples,2)
))# 決定質心是否要改變的變數
clusterchanged =
true
# 初始化質心
centroids = initcentroids(data, k)
while clusterchanged:
clusterchanged =
false
# 迴圈每乙個樣本
for i in
range
(numsamples)
:# 最小距離
mindist =
100000.0
# 定義樣本所屬的簇
minindex =
0# 迴圈計算每乙個質心與該樣本的距離
for j in
range
(k):
# 迴圈每乙個質心和樣本,計算距離
distance = eucldistance(centroids[j,:]
, data[i,:]
)# 如果計算的距離小於最小距離,則更新最小距離
if distance < mindist:
mindist = distance
# 更新最小距離
clusterdata[i,1]
= mindist
# 更新樣本所屬的簇
minindex = j
# 如果樣本的所屬的簇發生了變化
if clusterdata[i,0]
!= minindex:
# 質心要重新計算
clusterchanged =
true
# 更新樣本的簇
clusterdata[i,0]
= minindex
# 更新質心
for j in
range
(k):
# 獲取第j個簇所有的樣本所在的索引
# nonzero返回非零元素的索引
cluster_index = np.nonzero(clusterdata[:,
0]== j)
# 第j個簇所有的樣本點
pointsincluster = data[cluster_index]
# 計算質心
centroids[j,:]
= np.mean(pointsincluster, axis=0)
# showcluster(data, k, centroids, clusterdata)
return centroids, clusterdata
# 顯示結果
defshowcluster
(data, k, centroids, clusterdata)
: numsamples, dim = data.shape
if dim !=2:
print
("dimension of your data is not 2!"
)return
1# 用不同顏色形狀來表示各個類別
mark =
['or'
,'ob'
,'og'
,'ok'
,'^r'
,'+r'
,'sr'
,'dr',',
'pr'
]if k >
len(mark)
:print
("your k is too large!"
)return
1# 畫樣本點
for i in
range
(numsamples)
: markindex =
int(clusterdata[i,0]
) plt.plot(data[i,0]
, data[i,1]
, mark[markindex]
)# 用不同顏色形狀來表示各個類別
mark =
['*r'
,'*b'
,'*g'
,'*k'
,'^b'
,'+b'
,'sb'
,'db',',
'pb'
]# 畫質心點
for i in
range
(k):
plt.plot(centroids[i,0]
, centroids[i,1]
, mark[i]
, markersize=20)
plt.show(
)# 對新的資料集**
defpredict
(datas)
:return np.array(
[np.argmin(
((np.tile(data,
(k,1))
-centroids)**2
).sum(axis=1)
)for data in datas]
)
sklearn kmeans聚類的使用方法 K均值演算法(K means)
k均值聚類容易實現,但是可能收斂到區域性最小值,影響k means效果的因素 優 只需要計算資料點與聚類中心的距離,其計算複雜度只有o n 缺 十分依賴於初始給定的聚類數目 同時隨機初始化可能會生成不同的聚類效果,所以它缺乏重複性和連續性。偽 建立k個點作為起始質心 通常是隨機選擇 當任意乙個點的簇...
機器學習演算法之Kmeans演算法(K均值演算法)
kmeans演算法是典型的基於距離的聚類演算法,採用距離作為相似性的評價指標,即認為兩個物件的距離越近,其相似度就越大。該演算法認為簇是由距離靠近的物件組成的,因此把得到緊湊且獨立的簇作為最終目標。兩個樣本在歐式空間中的距離 引入新概念 cluster 表示乙個簇 centroid 表示當前簇的中心...
K均值 K means 聚類演算法
j.b.macqueen 在 1967 年提出的k means演算法 22 到目前為止用於科學和工業應用的諸多聚類演算法中一種極有影響的技術。它是聚類方法中乙個基本的劃分方法,常常採用誤差平方和準則函式作為聚類準則函式,誤差平方和準則函式定義為 3 1 其中,是類 中資料物件的均值,即 j 1,2,...