手寫kmeans聚類,純python實現(使用了numpy 庫),具體見**,注釋都在**中。
# -*- coding: utf-8 -*-
"""created on sun jun 21 16:46:52 2020
@author: lenovo
"""import numpy as np
#計算距離函式
defeuclidean_distance
(x1,x2)
: distance=
0for i in
range
(len
(x1)):
distance+=
pow(
(x1[i]
-x2[i]),
2)return np.sqrt(distance)
#定義初始化函式
defcentroids_init
(k,x)
: n_samples,n_features=x.shape
centroids=np.zeros(
(k,n_features)
)#centroids用於儲存每個聚類中心
for i in
range
(k):
#每一次迴圈隨機選擇乙個類別中心
centroid=x[np.random.choice(
range
(n_samples))]
# 從 n_samples裡面隨機選乙個作為聚類中心
centroids[i]
=centroid
return centroids
#定義樣本的最近質心點所屬的類別索引
defclosest_centroid
(sample,centroids)
: closest_i=
0#先把距離設為無窮大
closest_dist=
float
('inf'
)for i,centroid in
enumerate
(centroids)
: distance=euclidean_distance(sample,centroid)
if distance < closest_dist:
closest_i=i
closest_dist=distance
return closest_i
#定義構建類別過程
defcreate_clusters
(centroids,k,x)
:
clusters=[[
]for i in
range
(k)]
#假如 k 為3,那麼上面語句執行後,clusters為 [,,]
for sample_i , sample in
enumerate
(x):
#得到sample所屬的聚類中心的標籤
centroid_i=closest_centroid(sample,centroids)
clusters[centroid_i]
return clusters
#根據上一步的計算結果計算新的中心點
defcalculate_centroids
(clusters,k,x)
: n_features=np.shape(x)[1
] centroids=np.zeros(
(k,n_features)
)for i,cluster in
enumerate
(clusters)
:#求平均值,這就是kmeans更新聚類中心的方法
centroid=np.mean(x[cluster]
,axis=0)
#更新聚類中心
centroids[i]
=centroid
return centroids
#獲取每個樣本所屬的聚類類別
defget_cluster_labels
(clusters,x)
: y_pred=np.zeros(np.shape(x)[0
])for cluster_i,cluster in
enumerate
(clusters)
:for sample_i in cluster:
y_pred[sample_i]
=cluster_i
return y_pred
#封裝整合
defkmeans
(x,k,max_iter)
: centroids=centroids_init(k,x)
for i in
range
(max_iter)
: clusters=create_clusters(centroids,k,x)
prev_centroids=centroids
centroids=calculate_centroids(clusters,k,x)
diff=centroids-prev_centroids
#當聚類中心不再變化時,停止迭代
ifnot diff.
any():
break
return get_cluster_labels(clusters,x)
,centroids
x=np.array([[
0,2]
,[0,
0],[
5,0]
,[4,
5],[
1,1]
])labels,centers=kmeans(x,2,
10)print
(labels)
print
(centers)
輸出為:
[1. 1. 0. 0. 1.]
[[4.5 2.5 ]
[0.33333333 1. ]]
K Means聚類演算法
k means聚類演算法 intergret kmeans演算法的基本思想是初始隨機給定k個簇中心,按照最鄰近原則把待分類樣本點分到各個簇。然後按平均法重新計算各個簇的質心,從而確定新的簇心。一直迭代,直到簇心的移動距離小於某個給定的值。k means聚類演算法主要分為三個步驟 1 第一步是為待聚類...
聚類演算法 K means
演算法接受引數 k 然後將事先輸入的n個資料物件劃分為 k個聚類以便使得所獲得的聚類滿足 同一聚類中的物件相似度較高 而不同聚類中的物件相似度較小。聚類相似度是利用各聚類中物件的均值所獲得乙個 中心物件 引力中心 來進行計算的。k means演算法是最為經典的基於劃分的聚類方法,是十大經典資料探勘演...
模糊kmeans聚類
首先介紹乙個,fuzzykmeans演算法的主要思想 模糊均值聚類 fcm 即眾所周知的模糊isodata,是用隸屬度確定每個資料點屬於某個聚類的程度的一種聚類演算法。1973年,bezdek提出了該演算法,作為早期硬均值聚類 hcm 方法的一種改進。fcm把 n 個向量 xi i 1,2,n 分為...