一、原理

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. #linux vscode 保存总提示“Retry as sudo”

    linux中,对不同路径下的文件,系统默认指定了不同的操作权限(读/写/执行),出现这个问题是由于文件的权限不足造成的.(路径为/opt/lampp/htdocs/LearnPHP_jayce/hel ...

  2. Centos7下的MySQL5.6安装

    yum install wget yum install perl perl-devel cd /usr/local/src wget https://cdn.mysql.com//Downloads ...

  3. linux下的c语言编程学习笔记

    视频参看csdn学院王阳和下面的linux环境下c语言编程基础相当的经典,其中王阳的视频讲的很好,相当的经典 编译hellogcc.c需要依赖/home目录下的头文件 为了避免同一个文件被includ ...

  4. 写给.NET开发者的Python教程(一):引言

    距离上一篇博文已过去8个月了,这段时间发生了很多事情导致没能持续更新博客.这段时间除了工作繁忙,业余时间都投入到AI技术的学习中,后面一段时间将会给大家分享我作为一个.NET开发人员在深度学习领域学习 ...

  5. vue全家桶(2.6)

    3.9.滚动行为 设置滚动行为的作用是导航到新路由时,让页面滚动到你想要的位置. const router = new VueRouter({ routes: [...], scrollBehavio ...

  6. linux 测试端口是否可通

    windows上一般用telnet 如telnet ip port linux上可以用telnet,跟windows一样 telnet ip port 也可以用wget:如:wget ip:port ...

  7. .Net: C#中的委托(Delegate)和事件(Event)

    委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真 是太容易了,而没有过去的人每次 ...

  8. Python之浅谈基础

    执行python的两种方式 交互式(jupyter) 通过cmd或jupyter运行python代码 优点:运行一句执行一句 缺点:关闭cmd或jupyter后数据消失 命令行式(pycharm) 优 ...

  9. 洛谷 P6582 【座位调查】

    这道题就两个步骤: 1.找联通块个数:判断是否符合标准并且找联通块个数 我用的广搜实现的,思路挺简单的: 先找一个联通块的端点,根据题中的定义,一个联通块的端点,周围所不是座位的个数(指上下左右),只 ...

  10. Netty 源码解析(五): Netty 的线程池分析

    今天是猿灯塔“365篇原创计划”第五篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源码解析(二): Netty 的 Channel Netty ...