13. k_means算法原理及代码实现
kmeans算法原理及代码实现
完整的实验代码在我的github上👉QYHcrossover/ML-numpy: 机器学习算法numpy实现 (github.com) 欢迎star⭐
kmeans算法原理
在上一篇文章中,我们介绍了Mean Shift聚类算法的原理和代码实现。不同于Mean Shift聚类的基于密度的方法,k均值聚类是一种基于距离的聚类算法。它将数据集划分为k个簇,每个簇包含最接近它们的数据点。与Mean Shift聚类不同,k均值聚类需要事先指定簇的数量k。
该算法的实现过程包括以下几个步骤:
- 随机选择k个点作为初始中心点。
- 对于每个数据点,计算它与k个中心点的距离,并将其归为距离最近的中心点所在的簇。
- 对于每个簇,重新计算它们的中心点。
- 重复步骤2和3,直到簇不再发生变化或达到预定的迭代次数。
公式
kmeans算法的代价函数为:
$J(c, \mu) = \sum_{i=1}{m}|x - \mu_{c{(i)}}|$
其中,$c{(i)}$表示第$i$个样本所属的簇,$\mu_{c{(i)}}$表示第$i$个样本所属簇的中心点。
代码实现
代码实现步骤为:
在数据集中随机选择k个点作为初始中心点。
ci = np.random.choice(len(dataset),k,replace=False)
centers = data[ci]
对于每个数据点,计算它与k个中心点的距离,并将其归为距离最近的中心点所在的簇。
distances = np.hstack([np.sum((data-center)**2,axis=1)[:,np.newaxis] for center in centers])
mink = np.argmin(distances,axis=1)
对于每个簇,重新计算它们的中心点。
newcenters = np.array([np.mean(data[mink==i],axis=0) for i in range(k)])
重复步骤2和3,直到簇不再发生变化或达到预定的迭代次数。
delta = np.sum(np.abs(newcenters - centers))
if delta < 1e-5 or it >10000:
return centers,mink,it
centers = newcenters
it += 1
具体实现代码如下:
import numpy as np
def kmeans(data,k):
ci = np.random.choice(len(dataset),k,replace=False)
centers = data[ci]
it = 0
while True:
#计算所有点到聚类中心的距离
distances = np.hstack([np.sum((data-center)**2,axis=1)[:,np.newaxis] for center in centers])
mink = np.argmin(distances,axis=1)
#确定下一轮聚类中心
newcenters = np.array([np.mean(data[mink==i],axis=0) for i in range(k)])
#判断是否需要下次迭代
delta = np.sum(np.abs(newcenters - centers))
if delta < 1e-5 or it >10000:
return centers,mink,it
#下次迭代
centers = newcenters
it += 1
if __name__ == "__main__":
#读取数据
data = []
with open("data.txt") as f:
for line in f:
x,y = line.strip().split()
data.append((float(x),float(y)))
data = np.array(dataset)
#kmeans聚类
centers,index,it = kmeans(data,2)
print(centers)
print(index)
print(it)
总结
本文介绍了kmeans聚类算法的原理和代码实现。kmeans是一种基于距离的聚类算法,它将数据集划分为k个簇,每个簇包含最接近它们的数据点。与Mean Shift聚类不同,k均值聚类需要事先指定簇的数量k。在实现过程中,首先随机选择k个点作为初始中心点,然后计算每个数据点与k个中心点的距离,并将其归为距离最近的中心点所在的簇。之后重新计算每个簇的中心点,并重复上述步骤,直到簇不再发生变化或达到预定的迭代次数。本文还给出了算法的代价函数和具体代码实现。Kmeans算法是一种简单易用的聚类算法,在实际应用中具有广泛的应用前景。
完整的实验代码在我的github上👉QYHcrossover/ML-numpy: 机器学习算法numpy实现 (github.com) 欢迎star⭐
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人