一、原理

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)/std
return 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_dis
if(min_dis == dis):
min_class = i
result['第'+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 = Z
new_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

最新文章

  1. js让text值不可改变,同&lt;input type=&quot;text&quot; readonly=&quot;readonly&quot; /&gt;
  2. jquery.hover()函数使用
  3. php多线程抓取信息测试例子
  4. 完成端口(Completion Port)详解(转)
  5. js中获取项目路径的小插件
  6. Yii 框架表单验证---实例
  7. C# 扩展方法奇思妙用高级篇六:WinForm 控件选择器
  8. How Tomcat Works(七)
  9. Vim Cscope安装与使用
  10. Spark Streaming fileStream实现原理
  11. hadoop深入研究:(十六)——Avro序列化与反序列化
  12. 【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 G - 免费馅饼
  13. [论文解读]CNN网络可视化——Visualizing and Understanding Convolutional Networks
  14. git的安装(和远程仓库建立连接)
  15. jsp篇 之 Jsp中的内置对象和范围对象
  16. 扫AR
  17. react native中如何往服务器上传网络图片
  18. Chrome插件:gitlab activity dashboard background-color
  19. 使用Apache Kylin搭建企业级开源大数据分析平台
  20. 第十章&#160;泛型程序设计与C++标准模板库 泛型程序设计及STL的结构

热门文章

  1. 【asp.net core 系列】12 数据加密算法
  2. es性能调优---写优化操作
  3. SSH网上商城一
  4. 入门大数据---Flume的搭建
  5. Unicode 环境下的字符串的操作
  6. SpringBoot中VO,DTO,DO,PO的概念、区别和用处
  7. C# 特性篇 Attributes
  8. Scanner 类
  9. 数据库基础02-MYSQL的事务
  10. CF1051F The Shortest Statement 题解