文章目录

  • 一、原理
  • 二、算法步骤
  • 三、实例如下:
  • 四、python代码实现:

一、原理

K均值算法使用的聚类准则函数是误差平方和准则,通过反复迭代优化聚类结果,使所有样本到各自所属类别的中心的距离平方和达到最小。

二、算法步骤

设迭代次数 r = 0

  1. 如果把数据分成k个类,则第一步选前k个点作为第一批聚类中心:Z1(r ),Z2(r )…Zk(r )
  2. 将所有的数据与各个聚类中心求距离(根据实际情况选择欧式、马氏等距离),然后将各数据点分配到离自己最近的聚类中心(相当于分类)。
  3. 对于分好的类,求每个类的重心,作为新的聚类中心。获得新一批的聚类中心Z1(r+1)、Z2(r+1)…Zk(r+1)
  4. 如果新一批的聚类中心与上一批的聚类中心完全相等,则停止迭代,否则重复步骤2~4

三、实例如下:

根据调查得到某地10所学校的数据(见下表),试采用k_means算法编写程序,将这些学校按三种类别聚类。

四、python代码实现:

import numpy as np'''k-means算法
'''#标签
label_set = ['学校1','学校2','学校3','学校4','学校5','学校6','学校7','学校8','学校9','学校10'
]
#数据
data_set = np.array([[2088,562.05,42,434],[10344.8,4755,76,1279],[2700,4100,56,820],[3967,3751,67,990],[5850.24,6173.25,78,1240],[1803.26,5224.99,72,1180],[2268,8011,56,800],[32000,18000,200,2000],[100000,30000,200,1100],[173333,60000,420,2552]
])#标准化
def normal_dataSet(data_set):mean = np.mean(data_set,axis=0)std = np.std(data_set,axis=0)dataSet =  (data_set-mean)/stdreturn dataSet#计算欧氏距离
def O_distance(x, y):dis = np.sqrt(np.sum(np.square(x-y)))return dis#第一步获取聚类中心(直接获取前k个作为中心)
def get_cluster_center(dataSet, k):Z = []for i in range(k):Z.append(dataSet[i])return np.array(Z)#根据离聚类中心Z的距离分类
def classify(dataSet, Z):result = {}for i in range(len(Z)):result['第'+str(i+1)+'类'] = []for j in range(len(dataSet)):min_class = 0 #初始类min_dis = O_distance(dataSet[j],Z[0]) #初始最小的距离for i in range(len(Z)):dis = O_distance(dataSet[j],Z[i])min_dis = dis if dis < min_dis else min_disif(min_dis == dis):min_class = iresult['第'+str(min_class+1)+'类'].append(j)return result#获取新的聚类中心
def get_new_cluster_center(result,dataSet):Z=[]new_result = {}#因为result保存的是各类别对应的各点在dataSet的下标#需要将下标转化为dataSet中实际值for key in result.keys():new_result[key] = []for index in result[key]:new_result[key].append(dataSet[index])avg = np.mean(np.array(new_result[key]),axis=0)Z.append(avg)return np.array(Z)#k_means算法,将数据集分成k份
def k_means(dataSet, k):result = {} #分类结果Z = get_cluster_center(dataSet, k) #初始的聚类中心result = classify(dataSet, Z) #第一次分类old_Z = Znew_Z = get_new_cluster_center(result,dataSet) #获取新的聚类中心#迭代while ((old_Z!=new_Z).any()):result = classify(dataSet, new_Z)old_Z = new_Z.copy()new_Z = get_new_cluster_center(result,dataSet)return result# k_means(data_set_1,None,2)dataSet = normal_dataSet(data_set)#标准化处理
result = k_means(dataSet ,3)#分步聚类
#打印分类结果
for key in result.keys():print(key,end=': ')for index in result[key]:print(label_set[index],end=' ')print()

运行结果如下:

第1类: 学校1
第2类: 学校8 学校9 学校10
第3类: 学校2 学校3 学校4 学校5 学校6 学校7

k_means算法+python实现相关推荐

  1. 棋盘最短路径 python_Dijkstra 最短路径算法 Python 实现

    Dijkstra 最短路径算法 Python 实现 问题描述 使用 Dijkstra 算法求图中的任意顶点到其它顶点的最短路径(求出需要经过那些点以及最短距离). 以下图为例: 算法思想 可以使用二维 ...

  2. 2021-03-15 数据挖掘算法—K-Means算法 Python版本

    数据挖掘算法-K-Means算法 Python版本 简介 又叫K-均值算法,是非监督学习中的聚类算法. 基本思想 k-means算法比较简单.在k-means算法中,用cluster来表示簇:容易证明 ...

  3. 2021-01-28 粒子群优化算法-Python版本和Matlab函数 particleswarm 调用

    粒子群优化算法-Python版本和Matlab函数 particleswarm 调用 前两天分享了粒子群优化算法的原理和Matlab原理实现,本文分享一下Python代码下的PSO实现以及Matlab ...

  4. 最优化算法python实现篇(4)——无约束多维极值(梯度下降法)

    最优化算法python实现篇(4)--无约束多维极值(梯度下降法) 摘要 算法简介 注意事项 算法适用性 python实现 实例运行结果 算法过程可视化 摘要 本文介绍了多维无约束极值优化算法中的梯度 ...

  5. 最优化算法python实现篇(3)——无约束一维极值(黄金分割法)

    最优化算法python实现篇(3)--无约束一维极值(黄金分割法) 算法适用问题 python实现 示例运行结果 算法适用问题 搜索给定单峰区间的极值问题,一般对凸优化问题比较适用. python实现 ...

  6. 最优化算法python实现篇(2)—无约束一维极值(二分法)

    最优化算法python实现篇(2)--无约束一维极值(二分法) 算法适用问题 python实现 示例运行结果 算法适用问题 搜索给定单峰区间的极值问题,一般对凸优化问题比较适用. python实现 # ...

  7. 多元线性回归算法python实现_手写算法-Python代码推广多元线性回归

    1.梯度下降-矩阵形式 上篇文章介绍了一元线性回归,包括Python实现和sklearn实现的实例.对比,以及一些问题点,详情可以看这里: 链接: 手写算法-Python代码实现一元线性回归 里面封装 ...

  8. 哈希运算python实现_一致性哈希算法 python实现

    # -*- coding: utf-8 -*- """ 一致性哈希算法 python实现 参考 http://weblogs.java.net/blog/2007/11/ ...

  9. (四)协同过滤算法之基于用户的推荐算法python实现

    一.背景 关于推荐算法的相关背景介绍,已经在上一个姊妹篇(三)协同过滤算法之基于物品的推荐算法python实现中有所介绍.在此,便不在赘述,本文主要介绍基于用户的协同过滤算法,而对推荐算法不太清楚的朋 ...

最新文章

  1. linux异常断电usb驱动丢失,如何修复Linux中损坏的USB驱动器 | MOS86
  2. 线程安全与可重入函数的区别及联系
  3. 日常办公会用到的python模块-Python如何去实际提高工作的效率?也许这个会有用!...
  4. 【数字信号处理】序列表示与运算 ( 序列乘以常数 | 序列相加 | 序列移位 | 序列尺度变换 )
  5. android 导入系统证书,安卓手机添加系统证书方法(HTTPS抓包)
  6. web前端技术分享:es6展开运算符概念和使用!
  7. c语言程序设计教程 实验十,清华大学出版社-图书详情-《C语言程序设计实验教程》...
  8. php 整行插入mysql_MySQL的多行插入
  9. 【hdu3441】Rotation,Polya套Polya
  10. 人群与网络:万维网结构、链接分析与网络搜索
  11. 你还敢用鼠标吗?黑客在百米之外控制你的鼠标
  12. Linux 内核编程总结
  13. C++学习(七十一)3Dtiles glTF glb b3dm
  14. dpdk-pktgen快速发包工具踩坑日记
  15. qt样式表设置边框_Qt样式表之 QSS 语法介绍
  16. tomcat 控制台中文乱码问题解决办法寻觅
  17. 微信小程序 三角形实现 (评论三角形)
  18. 第七周项目(5):排队看病时模拟
  19. BeanFactory和ApplicationContext的异同点
  20. 简单工厂模式-Simple Factory Pattern 工厂三兄弟之简单工厂模式(四):图表库解决方案的改进,简单工厂模式的简化,简单工厂模式总结

热门文章

  1. 安卓一个页面设置另一个页面的文本样式_H1标签对于SEO有多重要?页面要不要用H1标签呢?...
  2. 学了python能干啥举例-第9p,Python是什么?学了Python能干什么?
  3. python爬虫代码-Python爬虫教程:200行代码实现一个滑动验证码
  4. python在线编辑器手机-‎App Store 上的quot;Python AI - 代码编辑器”
  5. python中国官网-中蟒 (中文 Python) 編程語言網站 chinesepython
  6. python练手经典100例-python零基础练手项目100+
  7. 类加载过程(时机)略解
  8. mysql排序规则选什么区别_mysql – 字符集和排序规则是什么意思?
  9. idea中怎么新建vue项目_项目中使用vue-awesome-swiper
  10. java json 多余属性,fastjson支持JSON字符串解析到指定类型的JavaBean时的多余属性么?...