k-means 聚类算法与Python实现代码
作者:FrancoLiang 时间:2022-02-01 02:55:22
k-means 聚类算法思想先随机选择k个聚类中心,把集合里的元素与最近的聚类中心聚为一类,得到一次聚类,再把每一个类的均值作为新的聚类中心重新聚类,迭代n次得到最终结果分步解析
一、初始化聚类中心
首先随机选择集合里的一个元素作为第一个聚类中心放入容器,选择距离第一个聚类中心最远的一个元素作为第二个聚类中心放入容器,第三、四、、、N个同理,为了优化可以选择距离开方做为评判标准
二、迭代聚类
依次把集合里的元素与距离最近的聚类中心分为一类,放到对应该聚类中心的新的容器,一次聚类完成后求出新容器里个类的均值,对该类对应的聚类中心进行更新,再次进行聚类操作,迭代n次得到理想的结果
三、可视化展示
利用 python 第三方库中的可视化工具 matplotlib.pyplot 对聚类后的元素显示(散点图),方便查看结果
python代码实现
import numpy as np
import matplotlib.pyplot as plt
# 两点距离
def distance(e1, e2):
return np.sqrt((e1[0]-e2[0])**2+(e1[1]-e2[1])**2)
# 集合中心
def means(arr):
return np.array([np.mean([e[0] for e in arr]), np.mean([e[1] for e in arr])])
# arr中距离a最远的元素,用于初始化聚类中心
def farthest(k_arr, arr):
f = [0, 0]
max_d = 0
for e in arr:
d = 0
for i in range(k_arr.__len__()):
d = d + np.sqrt(distance(k_arr[i], e))
if d > max_d:
max_d = d
f = e
return f
# arr中距离a最近的元素,用于聚类
def closest(a, arr):
c = arr[1]
min_d = distance(a, arr[1])
arr = arr[1:]
for e in arr:
d = distance(a, e)
if d < min_d:
min_d = d
c = e
return c
if __name__=="__main__":
## 生成二维随机坐标(如果有数据集就更好)
arr = np.random.randint(100, size=(100, 1, 2))[:, 0, :]
## 初始化聚类中心和聚类容器
m = 5
r = np.random.randint(arr.__len__() - 1)
k_arr = np.array([arr[r]])
cla_arr = [[]]
for i in range(m-1):
k = farthest(k_arr, arr)
k_arr = np.concatenate([k_arr, np.array([k])])
cla_arr.append([])
## 迭代聚类
n = 20
cla_temp = cla_arr
for i in range(n): # 迭代n次
for e in arr: # 把集合里每一个元素聚到最近的类
ki = 0 # 假定距离第一个中心最近
min_d = distance(e, k_arr[ki])
for j in range(1, k_arr.__len__()):
if distance(e, k_arr[j]) < min_d: # 找到更近的聚类中心
min_d = distance(e, k_arr[j])
ki = j
cla_temp[ki].append(e)
# 迭代更新聚类中心
for k in range(k_arr.__len__()):
if n - 1 == i:
break
k_arr[k] = means(cla_temp[k])
cla_temp[k] = []
## 可视化展示
col = ['HotPink', 'Aqua', 'Chartreuse', 'yellow', 'LightSalmon']
for i in range(m):
plt.scatter(k_arr[i][0], k_arr[i][1], linewidth=10, color=col[i])
plt.scatter([e[0] for e in cla_temp[i]], [e[1] for e in cla_temp[i]], color=col[i])
plt.show()
结果展示
来源:https://blog.csdn.net/qq_37509235/article/details/82925781
标签:k-means,聚类,算法,python
0
投稿
猜你喜欢
Python实现arctan换算角度的示例
2023-07-16 20:31:28
教你怎样在Oracle数据库中高速导出/导入
2009-02-04 16:59:00
PHP Document 代码注释规范
2023-11-14 11:50:54
php正则过滤html标签、空格、换行符的代码(附说明)
2023-07-22 07:58:01
SQLserver 数据库危险存储过程删除与恢复方法
2011-09-30 11:33:54
如何用CocosCreator制作微信小游戏
2023-08-23 16:00:02
Python requests.post方法中data与json参数区别详解
2022-02-06 09:06:20
uni-app网络请求、数据缓存实例详解
2023-08-09 03:49:12
使用Python的Scrapy框架十分钟爬取美女图
2023-06-16 03:28:57
ASP与MySQL的连接[图文教程]
2010-03-14 11:21:00
讲解数据库管理系统必须提供的基本服务
2009-01-04 14:33:00
SQL Server正则表达式 替换函数应用详解
2023-07-07 23:53:13
关于pip的安装,更新,卸载模块以及使用方法(详解)
2022-03-15 07:21:36
Python json模块与jsonpath模块区别详解
2023-09-17 18:07:26
用 AjaxTags 简化 Ajax 开发
2007-11-27 00:00:00
js放大缩小容器:仿动画
2008-02-15 11:34:00
pyppeteer执行js绕过webdriver监测方法上
2021-12-13 12:04:40
python 批量将PPT导出成图片集的案例
2021-09-14 17:52:36
使用Math.max,Math.min获取数组中的最值实例
2023-09-03 23:23:59
python matplotlib坐标轴设置的方法
2022-03-26 03:44:04