K均值聚类和代码实现
K均值聚类是一种无监督学习分类算法。
介绍
对于$n$个$m$维特征的样本,K均值聚类是求解最优化问题:
$\displaystyle C^*=\text{arg}\min\limits_{C}\sum\limits_{l = 1}^K\sum\limits_{x\in C_l}||x-x_l||^2$
其中$C$表示某种样本的划分方式,$x\in C_l$表示被划分在第$l$类的样本,$x_l$表示被划分在第$l$类的所有样本的中心,也就是均值。所以上式表示最小化所有类别内样本到其对应的类别样本均值的距离之和。最优化这个问题是NP难问题,所以现实采用类似贪心的迭代算法来逼近最优解(不一定最优)。具体流程如下(每个样本只能属于一个类别):
0、初始化$K$个类的均值为随机$m$维向量。
1、将每个样本划分到与之距离最小的类别均值对应的类别中。
2、根据划分进的样本,每个类别重新计算类别均值,并记录。
3、比较连续两次的类别均值,如果差别小于一定阈值就结束,否则回到1。
通过计算可以知道时间复杂度是$O(mnk)$。
代码实现
Numpy手动实现
首先使用由正态分布生成的两簇点集来实验,每个簇各200个点。可能由于这两个点集比较靠近,所以分类完全错误,如图:

重新生成5簇正态分布点集,这次每个集合之间相对较远,除了少数没有正确聚类外(两类交汇处),表现不错:

代码如下:
#%%获取数据
import matplotlib.pyplot as plt
import numpy as np
import xlrd table = xlrd.open_workbook('test.xlsx').sheets()[0]#读取Excel数据
data = []
for i in range(0,table.nrows):#假设第一行是表头不读入
data.append(table.row_values(i))
data = np.array(data)
#%%聚类
def distance(a,b):
d = a-b
return np.dot(d,d)
def clusterize(data,class_m):#关于类均值对样本分类
for i in data:
min_dis = np.inf
for j in range(len(class_m)):
t = distance(i[:-1],class_m[j])
if t<min_dis:
min_dis=t
i[-1]=j def calc_mean(data,class_m):#以类中样本计算均值
class_m -= class_m
num = np.zeros([len(class_m)])
for i in data:
num[int(i[-1])]+=1
class_m[int(i[-1])]+=i[:-1]
for i in range(len(class_m)):
class_m[i]/=num[i]
def updated_mean(dif):#计算前后两次更新的均值距离,传入前后差值
sum_ = 0
for i in dif:
sum_ += np.dot(i,i)
return sum_
def k_means_cluster(data,K):
class_mean = data[0:K,:-1]
class_mean_old = -class_mean
t = updated_mean(class_mean-class_mean_old)
ii = 0
while t>0.0001:
class_mean_old = class_mean.copy()
clusterize(data,class_mean)
print(class_mean)
print(class_mean_old)
calc_mean(data,class_mean)
print(class_mean)
print(class_mean_old)
t = updated_mean(class_mean-class_mean_old)
print(t)
ii+=1
print(ii)
data1 = data.copy()
np.random.shuffle(data1)
k_means_cluster(data1,5) #要分几类直接这里设置################################## #%%绘制结果
import matplotlib.pyplot as plt fig = plt.figure()
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
ax1.scatter(data1[:,0],data1[:,1],c = data1[:,-1])
ax1.set_title("K-Means")
ax2.scatter(data[:,0],data[:,1],c = data[:,-1])
ax2.set_title("Should be")
plt.show()
Sklearn
使用封装好的Sklearn,代码如下:
#%%获取数据
import matplotlib.pyplot as plt
import numpy as np
import xlrd table = xlrd.open_workbook('test.xlsx').sheets()[0]#读取Excel数据
data = []
for i in range(0,table.nrows):#假设第一行是表头不读入
data.append(table.row_values(i))
data = np.array(data)
#%%聚类
from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=5)
kmeans.fit(data[:,:-1])
y = kmeans.predict(data[:,:-1])
fig = plt.figure()
ax1 = fig.add_subplot(121)
ax1.scatter(data[:,0],data[:,1],c = y)
ax1.set_title("K-Means")
ax2 = fig.add_subplot(122)
ax2.scatter(data[:,0],data[:,1],c=data[:,-1])
ax2.set_title("Should be")
plt.show()
结果图:

K均值聚类和代码实现的更多相关文章
- 5-Spark高级数据分析-第五章 基于K均值聚类的网络流量异常检测
据我们所知,有‘已知的已知’,有些事,我们知道我们知道:我们也知道,有 ‘已知的未知’,也就是说,有些事,我们现在知道我们不知道.但是,同样存在‘不知的不知’——有些事,我们不知道我们不知道. 上一章 ...
- 机器学习实战5:k-means聚类:二分k均值聚类+地理位置聚簇实例
k-均值聚类是非监督学习的一种,输入必须指定聚簇中心个数k.k均值是基于相似度的聚类,为没有标签的一簇实例分为一类. 一 经典的k-均值聚类 思路: 1 随机创建k个质心(k必须指定,二维的很容易确定 ...
- Python实现kMeans(k均值聚类)
Python实现kMeans(k均值聚类) 运行环境 Pyhton3 numpy(科学计算包) matplotlib(画图所需,不画图可不必) 计算过程 st=>start: 开始 e=> ...
- 机器学习理论与实战(十)K均值聚类和二分K均值聚类
接下来就要说下无监督机器学习方法,所谓无监督机器学习前面也说过,就是没有标签的情况,对样本数据进行聚类分析.关联性分析等.主要包括K均值聚类(K-means clustering)和关联分析,这两大类 ...
- ML: 聚类算法-K均值聚类
基于划分方法聚类算法R包: K-均值聚类(K-means) stats::kmeans().fpc::kmeansruns() K-中心点聚类(K-Medoids) ...
- 机器学习算法与Python实践之(六)二分k均值聚类
http://blog.csdn.net/zouxy09/article/details/17590137 机器学习算法与Python实践之(六)二分k均值聚类 zouxy09@qq.com http ...
- 机器学习之路:python k均值聚类 KMeans 手写数字
python3 学习使用api 使用了网上的数据集,我把他下载到了本地 可以到我的git中下载数据集: https://github.com/linyi0604/MachineLearning 代码: ...
- k均值聚类算法原理和(TensorFlow)实现
顾名思义,k均值聚类是一种对数据进行聚类的技术,即将数据分割成指定数量的几个类,揭示数据的内在性质及规律. 我们知道,在机器学习中,有三种不同的学习模式:监督学习.无监督学习和强化学习: 监督学习,也 ...
- SciPy k均值聚类
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- 聚类之K均值聚类和EM算法
这篇博客整理K均值聚类的内容,包括: 1.K均值聚类的原理: 2.初始类中心的选择和类别数K的确定: 3.K均值聚类和EM算法.高斯混合模型的关系. 一.K均值聚类的原理 K均值聚类(K-means) ...
随机推荐
- Ubuntu 修改密码
强制修改密码 可以通过切换到 root 帐户强制修改密码来绕过密码长度限制: sudo su # 切换到 root 帐户 passwd USER # 修改密码 或者: sudo passwd $(wh ...
- 使用 nuxi analyze 命令分析 Nuxt 应用的生产包
title: 使用 nuxi analyze 命令分析 Nuxt 应用的生产包 date: 2024/8/29 updated: 2024/8/29 author: cmdragon excerpt: ...
- CM3和ARM7的差异
此文章由文心一言生成,引用请标注作者:文心一言CM3通常指的是Cortex-M3,它是ARM公司设计的一种基于ARMv7-M架构的32位处理器内核,主要用于嵌入式系统.而ARM7则是ARM公司早期设计 ...
- 【YashanDB数据库】由于网络带宽不足导致的jdbc向yashandb插入数据慢
问题现象 某客户环境,客户的业务使用jdbc驱动向其他操作系统上的yashandb插入90万条数据,耗时大约30分钟. 问题的风险及影响 影响客户的业务处理效率 问题影响的版本 所有的yashandb ...
- Angular 18+ 高级教程 – Change Detection & Ivy rendering engine
前言 不熟悉 Angular 的朋友可能不了解 Change Detection 和目前当火的 Signal 之间的关系,以至于认为现在应该要学习新潮流 Signal 而不是已经过时的 Change ...
- Dart 2.14 版现已发布
支持 Apple Silicon,增加了默认的 lint.更好的工具和新的语言功能提高生产力. 本月,我们发布了 Dart SDK 2.14 的正式版,新的版本旨在通过独特的可移植性.生产力和稳健性组 ...
- 【赵渝强老师】什么是Redis Cluster
(一)什么是Redis Cluster? Redis Cluster是Redis的分布式解决方案,在Redis 3.0版本正式推出的,有效解决了Redis分布式方面的需求.当遇到单机内存.并发.流量等 ...
- JS时间对象与字符串相互转换
1.Date => String 代码 /** * 函数描述:时间格式化工具 * @param format {String} 格式(y-年,M-月,d-日,H-时[24],h-时[12],m- ...
- UEFI原理与编程(一)
第一章 UEFI概述(Unified Extensible Firmware Interface 统一的可扩展固件接口) 常见缩写及描述: 缩略词 全名 描述 UEFI Unified Extensi ...
- meltdown 安全漏洞原理是怎么样的?
Meltdown是2018年初公开的一种严重的计算机安全漏洞,影响了多种处理器,包括英特尔.ARM和某些AMD处理器.其原理基于利用现代CPU的"推测执行"(speculative ...