欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入免费知识星球。

K-Means 算法

算法 迷途小书童 9个月前 (03-16) 413次浏览 0个评论

简介

K-Means 算法是一种非监督学习算法,它可以将数据分为K个不同的簇或者组。在本文中,我们将会介绍 K-Means 算法的基本概念、原理、实现方法以及使用示例。

基本概念

K-Means 算法中,簇指的是一个由数据点组成的集合,这些数据点具有相似的属性。例如,在对一个顾客数据库进行聚类时,同一簇中的顾客可能具有相似的购买记录、年龄、性别等属性。

距离度量

K-Means 算法中,需要使用距离度量来衡量不同数据点之间的距离。常用的距离度量有欧式距离、曼哈顿距离等。

中心点

每个簇都有一个中心点,该中心点是所有数据点的平均值,用于代表整个簇。

质心

质心指的是所有簇中心点的平均值,也可以理解为所有数据点的平均值。在 K-Means 算法中,质心通常用于计算新的中心点。

原理

K-Means 算法的基本原理是通过迭代寻找最优的簇分配方式,使得每个簇内部的数据点相似度尽可能高,而不同簇之间的相似度尽可能低。

具体步骤如下:

随机初始化 K 个中心点。

将所有数据点分配到离它们最近的中心点所在的簇中。

对每个簇,重新计算该簇的中心点。

重复步骤2和步骤3,直到簇的分配不再改变或者达到指定的迭代次数。

实现方法

我们将 K-Means 算法的实现封装在一个类中,该类包含以下方法:

  • init():初始化类,其中 n_clusters 表示要聚类的簇的数量,max_iter 表示迭代次数,默认值为300。
  • fit():训练模型,其中 X 表示数据集,返回聚类后的标签。
  • predict():预测数据点所属的簇。

具体代码实现如下:

import numpy as np

class KMeans:
    def __init__(self, n_clusters=8, max_iter=300):
        self.n_clusters = n_clusters
        self.max_iter = max_iter

    def fit(self, X):
        n_samples, n_features = X.shape

        # 随机初始化质心
        centroids = X[np.random.choice(n_samples, self.n_clusters, replace=False), :]

        # 迭代计算质心和分配数据点到簇
        for i in range(self.max_iter):
            # 计算每个数据点到所有质心的距离
            distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))

            # 分配数据点到距离最近的簇
            labels = np.argmin(distances, axis=0)

            # 更新质心
            new_centroids = np.zeros((self.n_clusters, n_features))
            for j in range(self.n_clusters):
                new_centroids[j, :] = X[labels == j, :].mean(axis=0)

            # 如果质心不再变化,退出循环
            if np.allclose(new_centroids, centroids):
                break

            centroids = new_centroids

        return labels

    def predict(self, X):
        distances = np.sqrt(((X - self.centroids[:, np.newaxis])**2).sum(axis=2))
        labels = np.argmin(distances, axis=0)
        return labels

使用示例

我们使用一个示例数据集来演示 K-Means 算法的使用

import matplotlib.pyplot as plt

# 生成示例数据
X = np.random.randn(200, 2)
X[:50, :] += 5
X[50:100, :] -= 5

# 初始化并训练模型
kmeans = KMeans(n_clusters=2)
labels = kmeans.fit(X)

# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.show()

上述代码生成了一个包含200个数据点的示例数据集,其中前50个点在(x,y)方向上都增加了5,后50个点在(x,y)方向上都减少了5。

参考资料

喜欢 (0)

您必须 登录 才能发表评论!

Ads Blocker Image Powered by Code Help Pro

Ads Blocker Detected!!!

请关闭 Adblock 等类似浏览器插件,然后刷新页面访问,感谢您的支持!

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.