聚类算法是一种无监督学习方法,它将相似的数据样本划分为一组,同时将不相似的数据样本划分为另一组。这个过程由计算机自动完成,不需要任何人为的干预。
K-means算法是一种经典的聚类算法,它的主要思想是把数据集分成k个簇,每个簇包括距离其它各簇最近的若干个数据点,并在每个簇中选取一个聚点作为簇的中心。K-means是一种迭代算法,它的流程如下:
- 随机选择k个初始点作为k个簇的中心
- 对于数据集中的每个点,计算它与k个簇中心的距离,并把它归为距离最小的簇
- 对于每个簇,重新计算它的中心点(即该簇内所有点的平均值)
- 重复步骤2-3,直到簇不再改变(也就是每个点距离它所属的簇中心最近)
K-means算法的优缺点:
优点:
- 算法简单而高效,适用于大规模数据集;
- 结果容易解释和理解,簇中心点可以用于表示聚类结构;
- 可以用于预处理,将簇中心用于后续学习任务中。
缺点:
- 初始中心点的选择会影响聚类结果,可能产生局部最优解;
- 簇的数量k需要预先指定,对于不同的数据集和任务,k的选择不同,不容易确定;
- 对于分布方差较大的数据集,可能会产生较差的聚类效果。
在本次实现中,我们将使用K-means算法,它是一种常见的聚类算法。下面是K-means算法的详细步骤:
- 随机选择K个中心点
- 根据每个中心点,将样本点分配到与之最近的聚类中心点所在的聚类中。
- 根据每个聚类中的样本点,重新计算该聚类的中心点。
- 重复执行步骤2和步骤3,直到聚类结果不再发生变化。
下面是实现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类来对一个数据集进行聚类。例如:文章来源:https://www.toymoban.com/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()
上面的代码会生成一个聚类结果图,其中不同颜色的点表示不同的聚类,红色的“x”表示每个聚类的中心点。[DONE]文章来源地址https://www.toymoban.com/news/detail-472329.html
到了这里,关于【g】聚类算法之K-means算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!