手寫KMeans聚類

2021-10-07 10:51:34 字數 3006 閱讀 9508

手寫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 分為...