📜  大数据分析-K-Means聚类(1)

📅  最后修改于: 2023-12-03 15:23:44.458000             🧑  作者: Mango

大数据分析-K-Means聚类

介绍

K-Means聚类是一种常见的无监督学习算法,它将数据集分成K个簇,满足同一簇内的数据点之间的相似度比不同簇之间的数据点之间的相似度高。

K-Means聚类算法的主要思想是:随机选择K个点作为簇的中心,然后将所有数据点分配到最近的簇中,计算每个簇的质心(即簇中所有数据点的平均值),再将簇的中心移动到质心处,重复以上步骤直至某个条件满足为止。常用的停止条件有:簇的中心不再发生变化,簇的分配不再发生变化等。

K-Means聚类算法的优点是:速度快,可扩展性强,易于理解和实现。它的应用场景广泛,例如市场细分、图像压缩等。

算法流程
  1. 从数据集中随机选择K个点作为簇的中心
  2. 将每个数据点分配到距离它最近的簇中
  3. 计算每个簇的质心(即簇中所有数据点的平均值)
  4. 将簇的中心移动到质心处
  5. 重复2-4步骤直至某个条件满足为止
代码实现
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()

kmeans.png

总结

K-Means聚类是一种有效的无监督学习算法,它能够对大规模数据进行高效率的聚类分析。但是,在实际应用中需要针对实际情况选择合适的聚类数量K和停止条件,否则可能会产生聚类不准确或者过分拟合的问题。