【手撕】K-measn算法及python代码实现及改进

本文详细介绍了K-means聚类算法的工作原理,包括步骤和Python实现,展示了如何将数据集划分为相似簇。还提及了K-means的变种和应用扩展,如在YOLOv5中的应用。
部署运行你感兴趣的模型镜像

当谈到聚类算法时,K-means 算法是一个非常常见且有用的工具。它用于将数据集划分为不同的簇,每个簇包含数据点,这些数据点在特征空间上彼此相似。在这篇博客文章中,我们将深入了解 K-means 算法的工作原理,并提供 Python 代码实现。

什么是 K-means 算法?

K-means 算法是一种无监督学习算法,用于将数据集中的数据点划分为 K 个不同的簇,其中 K 是用户定义的超参数。这个算法的目标是使每个数据点都属于离它最近的簇的中心点,从而最小化数据点与簇中心点之间的距离。

K-means 算法的主要步骤如下:

  1. 初始化:随机选择 K 个数据点作为初始的簇中心点。

  2. 分配:对每个数据点,计算它与每个簇中心点的距离,并将它分配到距离最近的簇中心点所在的簇。

  3. 更新:对于每个簇,计算新的簇中心点,通常是该簇中所有数据点的平均值。

  4. 重复:重复步骤 2 和步骤 3,直到簇中心点不再改变,或者达到最大迭代次数。

  5. 结束:算法收敛,每个数据点都分配到了一个簇中,得到了 K 个簇。

Python 代码实现

下面是使用 Python 实现 K-means 算法的示例代码:

import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

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

# 使用 K-means 聚类
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)

# 获取簇中心点和分配结果
centers = kmeans.cluster_centers_
labels = kmeans.labels_

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(centers[:, 0], centers[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.show()

这个示例使用 Scikit-Learn 库来执行 K-means 算法。首先,我们生成了一个随机的二维数据集 X,然后使用 K-means 聚类算法将其分成 3 个簇。最后,我们可视化了结果,用不同的颜色表示不同的簇,用红色的 "x" 标记表示簇中心点。

我们也可以不使用其内置算法,根据前面说的步骤一步一步使用代码展现:

import numpy as np
import matplotlib.pyplot as plt

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

# 定义K值和迭代次数
K = 3
max_iterations = 100

# 随机初始化簇中心点
centers = X[np.random.choice(X.shape[0], K, replace=False)]

# 迭代更新簇中心点
for _ in range(max_iterations):
    # 计算每个数据点到每个簇中心点的欧氏距离
    distances = np.linalg.norm(X[:, np.newaxis, :] - centers, axis=2)
    
    # 分配每个数据点到最近的簇
    labels = np.argmin(distances, axis=1)
    
    # 更新簇中心点为每个簇的平均值
    new_centers = np.array([X[labels == k].mean(axis=0) for k in range(K)])
    
    # 如果簇中心点不再改变,结束迭代
    if np.all(centers == new_centers):
        break
    
    centers = new_centers

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(centers[:, 0], centers[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.show()

这个示例实现了一个基本的K-means算法,包括随机初始化簇中心点、分配数据点到最近的簇、更新簇中心点等步骤。最后,我们通过可视化显示了结果,用不同的颜色表示不同的簇,用红色的 "x" 标记表示簇中心点。请注意,这只是一个简单的示例,K-means算法还有很多变种和改进方法,可以根据具体的需求和数据集选择合适的算法。

在后续我也会将我自己的一些创新点和相关代码分享给大家,包括一些XK-Means、LK-Means等创新算法,可用在不同场景,我使用其对YOLOv5所需锚框重新聚类,有效涨点!!!请大家持续关注!!

结论

K-means 算法是一种强大的聚类算法,用于将数据点划分为不同的簇。通过本文,你了解了它的基本工作原理,并通过 Python 代码实现了一个简单的示例。如果你对 K-means 算法感兴趣,可以进一步探索它的高级应用和调优技巧,以满足特定的数据分析需求。感谢阅读!

如果你有任何问题或需要进一步的解释,请随时提出。

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>嗯,用户想实现一个K-means算法,需要详细步骤和代码示例。首先我得回忆一下K-means的基本原理。K-means是一种聚类算法,通过迭代将数据点分配到最近的簇中心,然后更新簇中心,直到收敛。 用户可能已经了解过一些机器学习的基础知识,但可能需要从零开始的指导。所以步骤需要分清楚,先初始化簇中心,然后分配数据点,再更新中心,重复直到稳定。代码部分要避免使用现成库,自己实现。 要注意数学公式的正确性,比如距离计算通常用欧氏距离,目标函数是簇内平方和。可能需要提到初始化的方法,比如随机选点或者改进的k-means++,但用户可能只需要基础版本。 代码示例需要清晰,用Python的话,可以用numpy处理数组。函数结构包括初始化中心、分配簇、更新中心、迭代循环。还要处理可能的收敛条件,比如最大迭代次数或中心变化阈值。 用户可能遇到的问题包括如何选择K值,如何处理空簇,或者如何优化算法效率。不过用户这次的问题主要是实现,所以重点放在步骤和代码上。需要验证代码的正确性,比如用简单数据集测试。 另外,用户提到要参考之前的引用,里面提到了K-means的目标是最小化簇内距离总和,所以在解释步骤时要提到这一点。可能还需要说明算法的优缺点,比如对初始值敏感,适合凸数据集等。 最后,生成的相关问题需要考虑用户可能的后续疑问,比如如何选择K值,优化方法,或者与其他聚类算法的比较。确保问题能引导用户深入理解。</think>### 从零实现K-means算法的详细步骤 #### 一、算法核心原理 K-means通过**最小化簇内样本到质心的平方距离总和**完成聚类。数学目标函数为: $$J = \sum_{i=1}^k \sum_{x \in C_i} ||x - \mu_i||^2$$ 其中$C_i$表示第$i$个簇,$\mu_i$为簇中心[^1]。 #### 二、实现步骤 1. **初始化簇中心** - 随机选择$k$个样本作为初始质心 - 改进方法:k-means++(后续优化阶段使用) 2. **迭代优化** ```mermaid graph TD A[初始化质心] --> B[分配样本到最近质心] B --> C[重新计算质心] C --> D{质心变化?} D ----> B D ----> E[输出结果] ``` 3. **终止条件** - 质心不再变化 - 达到最大迭代次数 - 目标函数变化小于阈值 #### 三、Python代码实现 ```python import numpy as np def k_means(X, k, max_iters=100): # 随机初始化质心 centroids = X[np.random.choice(X.shape[0], k, replace=False)] for _ in range(max_iters): # 计算距离矩阵 distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2)) # 分配簇标签 labels = np.argmin(distances, axis=0) # 更新质心 new_centroids = np.array([X[labels == i].mean(axis=0) for i in range(k)]) # 终止条件判断 if np.all(centroids == new_centroids): break centroids = new_centroids return labels, centroids # 测试示例 np.random.seed(42) data = np.vstack([ np.random.normal(loc=[0,0], scale=0.5, size=(50,2)), np.random.normal(loc=[5,5], scale=0.5, size=(50,2)) ]) labels, centers = k_means(data, 2) ``` #### 四、关键实现细节 1. **距离计算优化**:使用向量化运算代替循环 $$d(x, \mu) = \sqrt{\sum_{j=1}^n (x_j - \mu_j)^2}$$ 2. **空簇处理**:当某个簇失去所有样本时,重新随机初始化该质心 3. **特征标准化**:建议在算法前对数据进行标准化处理 $$x' = \frac{x - \mu}{\sigma}$$ #### 五、算法验证 可通过计算轮廓系数评估聚类质量: $$s(i) = \frac{b(i) - a(i)}{\max(a(i), b(i))}$$ 其中$a(i)$是样本$i$到同簇其他样本的平均距离,$b(i)$是到最近其他簇样本的平均距离。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JH_vision

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值