【机器学习】之 kmean算法原理及实现

基本概念

K-Means 聚类算法的目标是将数据集分成 ( K ) 个簇,使得每个簇内的数据点尽可能相似,而簇与簇之间尽可能不同。这种相似度是通过计算数据点与簇中心的距离来衡量的。

算法步骤

  1. 选择簇的数量 ( K ):随机选择 ( K ) 个数据点作为初始簇中心(质心)。
  2. 分配数据点:将每个数据点分配到距离最近的簇中心,形成 ( K ) 个簇。
  3. 更新簇中心:重新计算每个簇的质心,即该簇所有数据点的均值。
  4. 重复步骤 2 和 3:直到簇中心的位置不再发生显著变化或达到预设的最大迭代次数。

距离度量

K-Means 算法中通常使用欧氏距离来度量数据点 ( x ) 和簇中心 ( y ) 之间的距离,

实现代码

以下是使用 Python 和 NumPy 实现 K-Means 聚类算法的示例代码:

import numpy as np

class KMeans:
    def __init__(self, k=3, max_iters=100):
        self.k = k
        self.max_iters = max_iters
        self.centroids = None

    def fit(self, X):
        # 随机初始化簇中心
        self.centroids = X[np.random.choice(X.shape[0], self.k, replace=False)]

        for _ in range(self.max_iters):
            # 分配每个样本到最近的簇中心
            labels = self._assign_clusters(X)
            # 计算新的簇中心
            new_centroids = self._calculate_centroids(X, labels)
            # 检查簇中心是否发生变化
            if np.all(new_centroids == self.centroids):
                break
            self.centroids = new_centroids
        return labels

    def _assign_clusters(self, X):
        # 计算每个数据点到簇中心的距离,并分配到最近的簇中心
        distances = np.sqrt(((self.centroids[:, np.newaxis, :] - X[np.newaxis, :, :]) ** 2).sum(axis=2))
        return np.argmin(distances, axis=0)

    def _calculate_centroids(self, X, labels):
        # 计算每个簇的新簇中心
        new_centroids = np.array([X[labels == i].mean(axis=0) for i in range(self.k)])
        return new_centroids

    def predict(self, X):
        # 预测数据点的簇标签
        return self._assign_clusters(X)

# 示例用法
if __name__ == "__main__":
    # 创建示例数据
    X = np.array([[1, 2], [1, 4], [1, 0], [10, 2], [10, 4], [10, 0]])

    # 创建KMeans实例
    kmeans = KMeans(k=2, max_iters=100)
    # 训练模型
    kmeans.fit(X)
    # 预测簇标签
    predictions = kmeans.predict(X)

    print("簇中心:\n", kmeans.centroids)
    print("预测簇标签:", predictions)

超参数选择

  • ( K ) 值的选择通常依赖于具体问题和数据集。可以使用肘部法则(Elbow Method)或轮廓系数(Silhouette Score)等方法来辅助决定最优的 ( K ) 值。

优缺点

优点

  • 简单直观:算法容易理解和实现。
  • 计算效率高:对于大规模数据集也相对有效。

缺点

  • 对初始簇中心敏感:可能只能找到局部最优解。
  • 需要指定 ( K ):簇的数量需要预先指定,这在某些情况下可能不是显而易见的。
  • 对非球形簇效果差:对具有复杂形状或大小不一致的簇的识别效果不佳。

总结

K-Means 是一种简单有效的聚类算法,适用于许多实际问题。然而,它也有一些局限性,因此在选择聚类算法时应考虑数据集的特性和具体需求。

Code

代码已上传至:AI_With_NumPy
此项目汇集了更多AI相关的算法实现,供大家学习参考使用,欢迎点赞收藏👏🏻

备注

个人水平有限,有问题随时交流~

好的,下面我来给你讲解一下使用 Python 进行训练集划分、特征选择和 Kmeans 算法的方法。 1. 训练集划分 在使用机器学习算法进行模型训练时,需要将数据集分为训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能。可以使用 Python 中的 scikit-learn 库进行数据集的划分。 代码示例: ```python from sklearn.model_selection import train_test_split # X为特征矩阵,y为目标向量 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) ``` 其中,`X` 为特征矩阵,`y` 为目标向量,`test_size` 为测试集所占比例,`random_state` 为随机种子,可以保证每次划分的结果一致。 2. 特征选择 在机器学习中,特征选择是指从原始特征中选择出最相关的特征,用于构建模型。特征选择可以提高模型的精度,同时减少计算复杂度。可以使用 Python 中的 scikit-learn 库进行特征选择。 代码示例: ```python from sklearn.feature_selection import SelectKBest from sklearn.feature_selection import chi2 # X为特征矩阵,y为目标向量 # 选择k个最好的特征 selector = SelectKBest(chi2, k=20) selector.fit_transform(X, y) ``` 其中,`SelectKBest` 是特征选择方法,`chi2` 是选择方法的评价指标,`k` 是选择的特征数。上面的代码会选择出 20 个最相关的特征。 3. Kmeans 算法 Kmeans 算法是一种聚类算法,可以将数据集分为多个类别。可以使用 Python 中的 scikit-learn 库进行 Kmeans 算法实现。 代码示例: ```python from sklearn.cluster import KMeans # X为特征矩阵 kmeans = KMeans(n_clusters=3, random_state=0).fit(X) ``` 其中,`n_clusters` 是聚类的簇数,`random_state` 是随机种子,可以保证每次聚类的结果一致。上面的代码会将数据集分为 3 个类别。 希望这些代码示例能够帮到你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值