k_means算法+python实现
文章目录
一、原理
K均值算法使用的聚类准则函数是误差平方和准则,通过反复迭代优化聚类结果,使所有样本到各自所属类别的中心的距离平方和达到最小。
二、算法步骤
设迭代次数 r = 0
- 如果把数据分成k个类,则第一步选前k个点作为第一批聚类中心:Z1(r ),Z2(r )…Zk(r )
- 将所有的数据与各个聚类中心求距离(根据实际情况选择欧式、马氏等距离),然后将各数据点分配到离自己最近的聚类中心(相当于分类)。
- 对于分好的类,求每个类的重心,作为新的聚类中心。获得新一批的聚类中心Z1(r+1)、Z2(r+1)…Zk(r+1)
- 如果新一批的聚类中心与上一批的聚类中心完全相等,则停止迭代,否则重复步骤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实现的更多相关文章
- pageRank算法 python实现
一.什么是pagerank PageRank的Page可是认为是网页,表示网页排名,也可以认为是Larry Page(google 产品经理),因为他是这个算法的发明者之一,还是google CEO( ...
- 常见排序算法-Python实现
常见排序算法-Python实现 python 排序 算法 1.二分法 python 32行 right = length- : ] ): test_list = [,,,,,, ...
- kmp算法python实现
kmp算法python实现 kmp算法 kmp算法用于字符串的模式匹配,也就是找到模式字符串在目标字符串的第一次出现的位置比如abababc那么bab在其位置1处,bc在其位置5处我们首先想到的最简单 ...
- k_means算法的C++实现
首先画出k_means算法的流程图:
- KMP算法-Python版
KMP算法-Python版 传统法: 从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将模式串向右移动一位.这有什么难的? 我们可以 ...
- 压缩感知重构算法之IRLS算法python实现
压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...
- 压缩感知重构算法之OLS算法python实现
压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...
- 压缩感知重构算法之CoSaMP算法python实现
压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...
- 压缩感知重构算法之IHT算法python实现
压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...
随机推荐
- Perl入门 - Perl方法的使用
1.定义一个方法 Perl使用sub定义方法. 语法: sub 方法名称{方法体} 2.调用一个方法 Perl直接使用方法名称调用方法. 调用方式有以下四种: 方法名称: &方法名称: 方法名 ...
- Elasticsearch的query phase和fetch phase
对于一次query查询到数据返回到客户端,经历了两个过程 query phase和fetch phase的过程 query phase 查询阶段 fetch phase 获取阶段. 1 qu ...
- 查看日志文件常用命令:tail,cat,tac,head,echo
linux查看日志文件内容命令tail.cat.tac.head.echo tail -f test.log你会看到屏幕不断有内容被打印出来. 这时候中断第一个进程Ctrl-C, ---------- ...
- IOT设备SmartConfig实现
一般情况下,IOT设备(针对wifi设备)在智能化过程中需要连接到家庭路由.但在此之前,需要将wifi信息(通常是ssid和password,即名字和密码)发给设备,这一步骤被称为配网.移动设备如An ...
- 入门大数据---Spark整体复习
一. Spark简介 1.1 前言 Apache Spark是一个基于内存的计算框架,它是Scala语言开发的,而且提供了一站式解决方案,提供了包括内存计算(Spark Core),流式计算(Spar ...
- Python实用笔记 (25)面向对象高级编程——多重继承
class Dog(Mammal, Runnable): pass 多重继承,继承了不同大类的所有功能,这种设计称之为Mixln,其目的就是给一个类增加多个功能,这样,在设计类的时候,我们优先考虑通过 ...
- ajax前后端交互原理(4)
4.JSON 4.1 什么是JSON? JavaScript 对象表示法(JavaScript Object Notation)简称JSON,是一种轻量级的数据交换格式.虽然它基于JavaScript ...
- java.math.BigDecimal cannot be cast to [Ljava.lang.Object;
从数据库中使用sum函数取出统计值后,放进list中,遍历list的时候强转化成Object是报错. BigDecimal .Integer不是基本类型,是int的包装类,无法把包装当做基本类型来用. ...
- 小熊派4G开发板初体验
开发板硬件资源介绍 前阵子小熊派发布了一款超高性价比的4G开发板(19.8元包邮),但是板子仅限量1000套.小熊派官方给我送了一块,我们一起来学习学习: 板子做得小巧精致,控制核心用的是移远的EC1 ...
- 洛谷 P3574 [POI2014]FAR-FarmCraft
题目传送门 题目描述 输入输出格式 输入格式: 输出格式: 一行,包含一个整数,代表题目中所说的最小时间. 输入输出样例 样例输入 样例输出 提示 分析 我们设f[x]为遍历完以x为根的子树且将这棵子 ...