一、原理

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 经典算法 40 例

    [程序 1] 题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列 ...

  2. 为页内的tab添加的iframe添加加载动画过渡效果

    var iframe = $("iframe[data-id=" + id + " ]"); if (iframe.length > 0) { var e ...

  3. xdebug调试代码常用操作

    xdebug调试代码常用操作 1.查看变量中的值 2.常用快捷键 ①F8单步调试 ②F9可以直接快速结束调试 ③F7 可以进入调试代码的底层方法,我觉得查看底层代码时,这个特别的方便!

  4. Mariadb之显式使用表锁和行级锁

    首先我们来看看mariadb的锁定概念,所谓锁就是当一个进程或事务在操作某一资源时,为了防止其他用户或者进程或事务对其进行资源操作,导致资源抢占而发生冲突,通常在A进程操作该资源时,会对该资源进行加锁 ...

  5. 《Java并发编程之美》

    简介 码云笔记 java-concurrent/TheBeautyOfConcurrentProgram

  6. dart快速入门教程 (2)

    2.变量和数据类型 2.1.变量和常量 变量通俗的说就是可以变化的量,作用就是用来存储数据,你可以把一个变量看作是一个水果篮,里面可以装苹果.梨.香蕉等,常量就是一个固定的值,和变量是相对的,变量可以 ...

  7. 《UNIX环境高级编程》(APUE) 笔记第十章 - 信号

    10 - 信号 GitHub 地址 1. 信号 信号是 软中断 ,信号提供了一种处理异步事件的方法. 当造成信号的事件发生时,为进程 产生 一个信号(或向进程 发送 一个信号).事件 可以是硬件异常( ...

  8. Linux虚拟网络:Docker网络知识之基础篇

    我们在工作中应用了docker容器化技术,服务的部署.维护和扩展都方便了很多.然而,近期在私有化部署过程中,由于不同服务器环境的复杂多变,常常遇到网络方面的问题,现象为容器服务运行正常,但宿主机.容器 ...

  9. Python3笔记013 - 3.4 循环语句

    第3章 流程控制语句 3.4 循环语句 1.while 循环 # 带else的while循环,循环结束后执行,根据需要取舍else while 条件表达式: 循环体 else: 语句 a = 0 wh ...

  10. DLL注入之windows消息钩取

    DLL注入之windows消息钩取 0x00 通过Windows消息的钩取 通过Windows消息钩取可以使用SetWindowsHookEx.该函数的原型如下: SetWindowsHookEx( ...