一、原理

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

k_means算法+python实现的更多相关文章

  1. pageRank算法 python实现

    一.什么是pagerank PageRank的Page可是认为是网页,表示网页排名,也可以认为是Larry Page(google 产品经理),因为他是这个算法的发明者之一,还是google CEO( ...

  2. 常见排序算法-Python实现

    常见排序算法-Python实现 python 排序 算法 1.二分法     python    32行 right = length-  :  ]   ):  test_list = [,,,,,, ...

  3. kmp算法python实现

    kmp算法python实现 kmp算法 kmp算法用于字符串的模式匹配,也就是找到模式字符串在目标字符串的第一次出现的位置比如abababc那么bab在其位置1处,bc在其位置5处我们首先想到的最简单 ...

  4. k_means算法的C++实现

    首先画出k_means算法的流程图:

  5. KMP算法-Python版

                               KMP算法-Python版 传统法: 从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将模式串向右移动一位.这有什么难的? 我们可以 ...

  6. 压缩感知重构算法之IRLS算法python实现

    压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...

  7. 压缩感知重构算法之OLS算法python实现

    压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...

  8. 压缩感知重构算法之CoSaMP算法python实现

    压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...

  9. 压缩感知重构算法之IHT算法python实现

    压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...

随机推荐

  1. JAVA相关基础知识

    JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分, ...

  2. Area.js下载

    因为vant AddressEdit 地址编辑的必要组件area.js网站经常进不去,所以存在这里,area.js 代码如下: export default { province_list: { 11 ...

  3. 从Spring Initializr开始

    出识springcloud我们这里需要建立两个项目 来感受下微服务 一.配置服务 1. Spring Initializr. 用idea自带的 Spring Initializr. 建立第一个项目 2 ...

  4. elk5

    在百度指数上面可以看到二者热度的一个对比 es要先建立索引index,才能进行检索 elasticSearch的安装 1.jdk要1.8版本以上,并且每台elasticserach的jdk版本要一致 ...

  5. 06[笔记] SpringBoot 删除Redis指定缓存

    /* ******************************************载入缓存开始************************************************* ...

  6. 这一次搞懂SpringBoot核心原理(自动配置、事件驱动、Condition)

    @ 目录 前言 正文 启动原理 事件驱动 自动配置原理 Condition注解原理 总结 前言 SpringBoot是Spring的包装,通过自动配置使得SpringBoot可以做到开箱即用,上手成本 ...

  7. vs code 初始化vue项目框架

    1.首先安装npm组件  下载地址:https://nodejs.org/en/ 安装完 2.配置环境变量 3.验证是否成功 node -v npm -v 4.替换npm 输入npm install ...

  8. python创建DataFrame,并实现DataFrame的转置

    >>> import pandas as pd >>> import numpy as np >>> x1 = {1: 106, 2: 3, 7: ...

  9. Redis系列(六):数据结构QuickList(快速列表)源码解析

    1.介绍 Redis在3.2版本之前List的底层编码是ZipList和LinkedList实现的 在3.2版本之后,重新引入了QuickList的数据结构,列表的底层都是QuickList实现 当L ...

  10. FTP学习

    FTP服务的使用 一.LVM理论 介绍 FTP用于在Internet 上控制文件的双向传输. FTP的主要作用就是让用户连接一 个远程计算机(这些计算机上 运行着FTP服务器程序) ,并查看远程计算机 ...