K-均值聚类算法介绍

K-均值聚类算法(K-Means Algorithm, KMA)是一种迭代求解的聚类分析算法,其核心目标是将数据集划分为K个簇,使得簇内的数据点尽可能相似,而簇间的数据点尽可能不同。以下是对K-均值聚类算法的详细介绍:

原理

K-均值聚类算法的工作原理主要包括以下几个步骤:

初始化:随机选择K个数据点作为初始的聚类中心(也称为质心)。
分配:计算数据集中每个点到这K个聚类中心的距离,并将每个点分配给最近的聚类中心,形成K个簇。
更新:重新计算每个簇的聚类中心,通常是计算簇内所有点的平均值(质心)。
迭代:重复步骤2和3,直到聚类中心不再发生显著变化或达到预设的迭代次数。

终止条件

K-均值聚类算法的终止条件通常包括:

没有(或最小数目)对象被重新分配给不同的聚类。
没有(或最小数目)聚类中心再发生变化。
误差平方和(Within-Cluster Sum of Squares, WCSS)局部最小。

特点和局限

K-均值聚类算法简单、高效,在数据集具有明显聚类结构时表现良好。然而,它也存在一些局限性:

对初始聚类中心的选择敏感,不同的初始聚类中心可能导致不同的聚类结果。
假设簇的形状为球形,如果数据簇的形状不是球形,K-均值可能无法正确聚类。
对异常值敏感,异常值可能显著影响聚类中心的位置,从而影响聚类结果。
需要预先指定簇的数量K,在实际应用中,簇的数量可能未知,需要通过其他方法来确定。

应用领域

K-均值聚类算法被广泛应用于各种领域,包括数据分析、信号处理、机器学习等。具体应用场景包括市场细分、图像分割、生物信息学、推荐系统等。

Python实现

在Python中,可以使用sklearn.cluster模块中的KMeans类来实现K-均值聚类算法。以下是一个简单的示例代码:

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

# 生成模拟数据
X, _ = make_blobs(n_samples=300, centers=4, random_state=0, cluster_std=0.60)

# 初始化KMeans模型
kmeans = KMeans(n_clusters=4)

# 拟合数据
kmeans.fit(X)

# 预测簇标签
labels = kmeans.predict(X)

# 获取质心
centroids = kmeans.cluster_centers_

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=200, alpha=0.5)
plt.show()

在上述示例中,我们首先生成了一个包含300个数据点、围绕4个中心随机分布的数据集。然后,我们初始化了一个KMeans模型,设置簇的数量为4。通过调用fit方法,模型学习数据并自动找到簇中心。最后,我们使用predict方法为每个数据点分配簇标签,并可视化了数据点和簇中心。

以上是对K-均值聚类算法的详细介绍,包括其原理、特点和局限、应用领域以及Python实现。请注意,在实际应用中,可能需要考虑数据的特性和聚类算法的局限性,选择合适的聚类算法和参数。

K-均值聚类算法python实现样例

K-均值聚类算法是一种常用的无监督学习算法,用于将数据集划分为K个簇。下面是一个用Python实现K-均值聚类算法的示例代码:

import numpy as np

class KMeans:
    def __init__(self, n_clusters, max_iter=100):
        self.n_clusters = n_clusters
        self.max_iter = max_iter
    
    def fit(self, X):
        self.centroids = X[np.random.choice(X.shape[0], size=self.n_clusters, replace=False)]
        
        for _ in range(self.max_iter):
            distances = np.linalg.norm(X[:, np.newaxis] - self.centroids, axis=2)
            labels = np.argmin(distances, axis=1)
            
            new_centroids = np.empty_like(self.centroids)
            for i in range(self.n_clusters):
                new_centroids[i] = X[labels == i].mean(axis=0)
            
            if np.allclose(self.centroids, new_centroids):
                break
                
            self.centroids = new_centroids
    
    def predict(self, X):
        distances = np.linalg.norm(X[:, np.newaxis] - self.centroids, axis=2)
        labels = np.argmin(distances, axis=1)
        return labels

使用示例:

import matplotlib.pyplot as plt

# 生成随机数据
np.random.seed(0)
X = np.random.randn(100, 2)

# 调用KMeans类对数据进行聚类
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)

# 画出聚类结果
labels = kmeans.predict(X)
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(kmeans.centroids[:, 0], kmeans.centroids[:, 1], c='red', marker='x')
plt.show()

在上述示例中,我们首先定义了一个KMeans类,构造函数中传入了簇的个数n_clusters和最大迭代次数max_iter。fit方法用于训练模型,其中使用np.random.choice函数随机选择初始的聚类中心,并使用np.argmin函数找到每个数据点距离最近的聚类中心作为其标签。然后计算每个簇的新中心点,并与旧的中心点进行比较,如果两者相等则停止迭代,否则继续更新中心点。predict方法用于对给定的数据进行预测,找到距离最近的聚类中心作为其标签。

最后,我们生成了一个随机数据集,并使用KMeans类进行聚类,将聚类结果可视化出来。聚类中心用红色的"X"标记表示。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐