📅  最后修改于: 2023-12-03 15:23:44.458000             🧑  作者: Mango
K-Means聚类是一种常见的无监督学习算法,它将数据集分成K个簇,满足同一簇内的数据点之间的相似度比不同簇之间的数据点之间的相似度高。
K-Means聚类算法的主要思想是:随机选择K个点作为簇的中心,然后将所有数据点分配到最近的簇中,计算每个簇的质心(即簇中所有数据点的平均值),再将簇的中心移动到质心处,重复以上步骤直至某个条件满足为止。常用的停止条件有:簇的中心不再发生变化,簇的分配不再发生变化等。
K-Means聚类算法的优点是:速度快,可扩展性强,易于理解和实现。它的应用场景广泛,例如市场细分、图像压缩等。
import numpy as np
class KMeans:
def __init__(self, k=2, max_iter=300):
self.k = k
self.max_iter = max_iter
def fit(self, X):
n_samples, n_features = X.shape
# 随机初始化簇中心
self.centers = np.random.randn(self.k, n_features)
# 迭代更新簇中心
for i in range(self.max_iter):
distances = np.sqrt(((X - self.centers[:, np.newaxis])**2).sum(axis=2))
labels = np.argmin(distances, axis=0)
new_centers = np.zeros((self.k, n_features))
for j in range(self.k):
new_centers[j,:] = X[labels==j].mean(axis=0)
# 若簇中心不再发生变化,则停止迭代
if np.all(self.centers == new_centers):
break
self.centers = new_centers
self.labels_ = labels
def predict(self, X):
distances = np.sqrt(((X - self.centers[:, np.newaxis])**2).sum(axis=2))
labels = np.argmin(distances, axis=0)
return labels
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
# 生成样本数据
X, y = make_blobs(n_samples=500, centers=4, random_state=0, cluster_std=1.0)
# 训练模型
clf = KMeans(k=4)
clf.fit(X)
# 预测结果
y_pred = clf.predict(X)
# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.scatter(clf.centers[:, 0], clf.centers[:, 1], marker='*', s=200, c='red')
plt.show()
K-Means聚类是一种有效的无监督学习算法,它能够对大规模数据进行高效率的聚类分析。但是,在实际应用中需要针对实际情况选择合适的聚类数量K和停止条件,否则可能会产生聚类不准确或者过分拟合的问题。