聚類算法是一種無監(jiān)督學(xué)習(xí)方法,它將相似的數(shù)據(jù)樣本劃分為一組,同時(shí)將不相似的數(shù)據(jù)樣本劃分為另一組。這個(gè)過程由計(jì)算機(jī)自動(dòng)完成,不需要任何人為的干預(yù)。
K-means算法是一種經(jīng)典的聚類算法,它的主要思想是把數(shù)據(jù)集分成k個(gè)簇,每個(gè)簇包括距離其它各簇最近的若干個(gè)數(shù)據(jù)點(diǎn),并在每個(gè)簇中選取一個(gè)聚點(diǎn)作為簇的中心。K-means是一種迭代算法,它的流程如下:
- 隨機(jī)選擇k個(gè)初始點(diǎn)作為k個(gè)簇的中心
- 對(duì)于數(shù)據(jù)集中的每個(gè)點(diǎn),計(jì)算它與k個(gè)簇中心的距離,并把它歸為距離最小的簇
- 對(duì)于每個(gè)簇,重新計(jì)算它的中心點(diǎn)(即該簇內(nèi)所有點(diǎn)的平均值)
- 重復(fù)步驟2-3,直到簇不再改變(也就是每個(gè)點(diǎn)距離它所屬的簇中心最近)
K-means算法的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
- 算法簡(jiǎn)單而高效,適用于大規(guī)模數(shù)據(jù)集;
- 結(jié)果容易解釋和理解,簇中心點(diǎn)可以用于表示聚類結(jié)構(gòu);
- 可以用于預(yù)處理,將簇中心用于后續(xù)學(xué)習(xí)任務(wù)中。
缺點(diǎn):
- 初始中心點(diǎn)的選擇會(huì)影響聚類結(jié)果,可能產(chǎn)生局部最優(yōu)解;
- 簇的數(shù)量k需要預(yù)先指定,對(duì)于不同的數(shù)據(jù)集和任務(wù),k的選擇不同,不容易確定;
- 對(duì)于分布方差較大的數(shù)據(jù)集,可能會(huì)產(chǎn)生較差的聚類效果。
在本次實(shí)現(xiàn)中,我們將使用K-means算法,它是一種常見的聚類算法。下面是K-means算法的詳細(xì)步驟:
- 隨機(jī)選擇K個(gè)中心點(diǎn)
- 根據(jù)每個(gè)中心點(diǎn),將樣本點(diǎn)分配到與之最近的聚類中心點(diǎn)所在的聚類中。
- 根據(jù)每個(gè)聚類中的樣本點(diǎn),重新計(jì)算該聚類的中心點(diǎn)。
- 重復(fù)執(zhí)行步驟2和步驟3,直到聚類結(jié)果不再發(fā)生變化。
下面是實(shí)現(xiàn)K-means算法的Python代碼:
import numpy as np
class KMeans:
def __init__(self, n_clusters=8, max_iter=300, random_state=0):
self.n_clusters = n_clusters
self.max_iter = max_iter
self.random_state = random_state
def fit(self, X):
np.random.seed(self.random_state)
n_samples, n_features = X.shape
centroids = np.random.randn(self.n_clusters, n_features)
for i in range(self.max_iter):
# Assign labels to each sample
labels = self._get_labels(X, centroids)
# Update centroids
centroids = self._get_centroids(X, labels)
self.labels_ = labels
def _get_labels(self, X, centroids):
distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))
labels = np.argmin(distances, axis=0)
return labels
def _get_centroids(self, X, labels):
centroids = np.zeros((self.n_clusters, X.shape[1]))
for i in range(self.n_clusters):
centroids[i] = np.mean(X[labels == i], axis=0)
return centroids
接下來,我們可以使用KMeans類來對(duì)一個(gè)數(shù)據(jù)集進(jìn)行聚類。例如:文章來源:http://www.zghlxwxcb.cn/news/detail-472329.html
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
X, y = make_blobs(n_samples=500, centers=8, random_state=0)
kmeans = KMeans(n_clusters=8, max_iter=100)
kmeans.fit(X)
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], c='red', marker='x')
plt.show()
上面的代碼會(huì)生成一個(gè)聚類結(jié)果圖,其中不同顏色的點(diǎn)表示不同的聚類,紅色的“x”表示每個(gè)聚類的中心點(diǎn)。[DONE]文章來源地址http://www.zghlxwxcb.cn/news/detail-472329.html
到了這里,關(guān)于【g】聚類算法之K-means算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!