机器学习之K均值算法(K-means)聚类
K均值算法(K-means)聚类
【关键词】K个种子,均值
一、K-means算法原理
聚类的概念:一种无监督的学习,事先不知道类别,自动将相似的对象归到同一个簇中。
K-Means算法是一种聚类分析(cluster analysis)的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法。
K-Means算法主要解决的问题如下图所示。我们可以看到,在图的左边有一些点,我们用肉眼可以看出来有四个点群,但是我们怎么通过计算机程序找出这几个点群来呢?于是就出现了我们的K-Means算法
这个算法其实很简单,如下图所示:
从上图中,我们可以看到,A,B,C,D,E是五个在图中点。而灰色的点是我们的种子点,也就是我们用来找点群的点。有两个种子点,所以K=2。
然后,K-Means的算法如下:
- 随机在图中取K(这里K=2)个种子点。
- 然后对图中的所有点求到这K个种子点的距离,假如点Pi离种子点Si最近,那么Pi属于Si点群。(上图中,我们可以看到A,B属于上面的种子点,C,D,E属于下面中部的种子点)
- 接下来,我们要移动种子点到属于他的“点群”的中心。(见图上的第三步)
- 然后重复第2)和第3)步,直到,种子点没有移动(我们可以看到图中的第四步上面的种子点聚合了A,B,C,下面的种子点聚合了D,E)。
这个算法很简单,重点说一下“求点群中心的算法”:欧氏距离(Euclidean Distance):差的平方和的平方根
K-Means主要最重大的缺陷——都和初始值有关:
K是事先给定的,这个K值的选定是非常难以估计的。很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适。(ISODATA算法通过类的自动合并和分裂,得到较为合理的类型数目K)
K-Means算法需要用初始随机种子点来搞,这个随机种子点太重要,不同的随机种子点会有得到完全不同的结果。(K-Means++算法可以用来解决这个问题,其可以有效地选择初始点)
总结:K-Means算法步骤:
- 从数据中选择k个对象作为初始聚类中心;
- 计算每个聚类对象到聚类中心的距离来划分;
- 再次计算每个聚类中心
- 计算标准测度函数,直到达到最大迭代次数,则停止,否则,继续操作。
- 确定最优的聚类中心
K-Means算法应用
看到这里,你会说,K-Means算法看来很简单,而且好像就是在玩坐标点,没什么真实用处。而且,这个算法缺陷很多,还不如人工呢。是的,前面的例子只是玩二维坐标点,的确没什么意思。但是你想一下下面的几个问题:
1)如果不是二维的,是多维的,如5维的,那么,就只能用计算机来计算了。
2)二维坐标点的X,Y 坐标,其实是一种向量,是一种数学抽象。现实世界中很多属性是可以抽象成向量的,比如,我们的年龄,我们的喜好,我们的商品,等等,能抽象成向量的目的就是可以让计算机知道某两个属性间的距离。如:我们认为,18岁的人离24岁的人的距离要比离12岁的距离要近,鞋子这个商品离衣服这个商品的距离要比电脑要近,等等。
二、实战
重要参数:
- n_clusters:聚类的个数
重要属性:
- cluster*centers* : [n_clusters, n_features]的数组,表示聚类中心点的坐标
- labels_ : 每个样本点的标签
1、聚类实例
导包,使用make_blobs生成随机点cluster_std
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
获取数据
#获取数据
#centers=3 默认值,生成3个聚类点集
X,y = make_blobs()
plt.scatter(X[:,0],X[:,1],c=y)
训练模型
#选取3个种子
kmeans = KMeans(n_clusters=3)
# 无监督学习:estimator.fit(X)
# 监督学习:estimator.fit(X,y)
kmeans.fit(X)
显示聚类中心
#查看聚类中心坐标点
cluster_centers_ = kmeans.cluster_centers_
cluster_centers_
#显示聚类中心
plt.scatter(X[:,0],X[:,1],c=y)
plt.scatter(cluster_centers_[:,0],cluster_centers_[:,1],
s=300,alpha=0.4,c='r')
预测
#预测
y_ = kmeans.predict(X)
plt.scatter(X[:,0],X[:,1],c = y_)
2、亚洲足球队分类
导包
from sklearn.cluster import KMeans
#导入3D图像包
from mpl_toolkits.mplot3d import Axes3D
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
读取数据
#读取数据
football = pd.read_csv('./AsiaZoo.txt',header=None)
football
修改列索引
#修改列索引
columns = {0:'国家',1:'2006世界杯',2:'2010世界杯',3:'2007亚洲杯'}
football.rename(columns=columns,inplace=True)
训练模型
#特征数据
X = football.iloc[:,1:]
#3个聚类中心
kmeans = KMeans(3)
#训练模型
kmeans.fit(X)
#预测
y_ = kmeans.predict(X)
y_
#输出分类结果
for i in range(3):
print('--------第%d类--------'%(3-i))
index = np.argwhere(y_ == i).reshape(-1)
print(football['国家'][index].values)
绘制3D图像
fig = plt.figure(figsize=(8,8))
axes3D = Axes3D(fig)
axes3D.scatter(X['2006世界杯'],X['2010世界杯'],X['2007亚洲杯'],
c = y_)
#设置坐标轴标签 字体为宋体 大小为30
axes3D.set_xlabel('2006世界杯',fontproperties = 'FangSong',
size = 30)
axes3D.set_ylabel('2010世界杯',fontproperties = 'FangSong',
size = 30)
axes3D.set_zlabel('2007亚洲杯',fontproperties = 'FangSong',
size = 30)
三、图片压缩
导包
from sklearn.cluster import KMeans
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
#绘图时可以显示中文
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
获取数据
bird = plt.imread('./img/bird_small.png')
plt.imshow(bird)
这张图片大小是128*128像素,有16384个(红,蓝,绿)组成的像素值。
#特征数据
X = bird.reshape(-1,3)
#三维图像变形成二维
df = pd.DataFrame(X)
#查看没有重复的像素值有多少
df.drop_duplicates().shape
说明原图颜色种类有13930种。
训练模型
#取16个聚类中心,相当于取16种颜色
kmeans = KMeans(16)
kmeans.fit(X)
#对原图像像素进行分类,分成16类
y_ = kmeans.predict(X)
预测后的数据有16384个像素值,颜色种类只有16种,相比原来的图片减少了13930 - 16 = 13914,所以图片相当于压缩了。
绘制压缩后的图片
#获取聚类像素值(即颜色种类)
cluster_centers_ = kmeans.cluster_centers_
cluster_centers_.shape
#把分类后的颜色种类取出16384个,组成一幅新的图片
bird_cluster = cluster_centers_[y_]
bird_cluster.shape
plt.figure(figsize=(3,1*2))
axes = plt.subplot(1,2,1)
axes.imshow(bird.reshape(128,128,3))
axes.set_title('压缩前')
axes.axis('off')
axes = plt.subplot(1,2,2)
axes.imshow(bird_cluster.reshape(128,128,3))
axes.set_title('压缩后')
axes.axis('off')
压缩后的图片和压缩前的图片相似度还是挺高的。
机器学习之K均值算法(K-means)聚类的更多相关文章
- K 均值算法-如何让数据自动分组
公号:码农充电站pro 主页:https://codeshellme.github.io 之前介绍到的一些机器学习算法都是监督学习算法.所谓监督学习,就是既有特征数据,又有目标数据. 而本篇文章要介绍 ...
- 聚类算法:K-means 算法(k均值算法)
k-means算法: 第一步:选$K$个初始聚类中心,$z_1(1),z_2(1),\cdots,z_k(1)$,其中括号内的序号为寻找聚类中心的迭代运算的次序号. 聚类中心的向量值可任意设 ...
- 聚类算法:K均值、凝聚层次聚类和DBSCAN
聚类分析就仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组(簇).其目标是,组内的对象相互之间是相似的,而不同组中的对象是不同的.组内相似性越大,组间差别越大,聚类就越好. 先介绍下聚类的不 ...
- 聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用
1.用python实现K均值算法 import numpy as np x = np.random.randint(1,100,20)#产生的20个一到一百的随机整数 y = np.zeros(20) ...
- 【机器学习】K均值算法(I)
K均值算法是一类非监督学习类,其可以通过观察样本的离散性来对样本进行分类. 例如,在对如下图所示的样本中进行聚类,则执行如下步骤 1:随机选取3个点作为聚类中心. 2:簇分配:遍历所有样本然后依据每个 ...
- 常见聚类算法——K均值、凝聚层次聚类和DBSCAN比较
聚类分析就仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组(簇).其目标是,组内的对象相互之间是相似的,而不同组中的对象是不同的.组内相似性越大,组间差别越大,聚类就越好. 先介绍下聚类的不 ...
- 机器学习算法之Kmeans算法(K均值算法)
Kmeans算法(K均值算法) KMeans算法是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大.该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑 ...
- 使用K均值算法进行图片压缩
K均值算法 上一期介绍了机器学习中的监督式学习,并用了离散回归与神经网络模型算法来解决手写数字的识别问题.今天我们介绍一种机器学习中的非监督式学习算法--K均值算法. 所谓非监督式学习,是一种 ...
- 一句话总结K均值算法
一句话总结K均值算法 核心:把样本分配到离它最近的类中心所属的类,类中心由属于这个类的所有样本确定. k均值算法是一种无监督的聚类算法.算法将每个样本分配到离它最近的那个类中心所代表的类,而类中心的确 ...
随机推荐
- 决策树防止过拟合(预剪枝(Pre-Pruning))
预剪枝(Pre-Pruning):预剪枝就是在构造决策树的过程中,先对每个结点在划分前进行估计,若果当前结点的划分不能带来决策树模型泛华性能的提升,则不对当前结点进行划分并且将当前结点标记为叶结点.
- 剑指offer-递归和循环
1. 斐波那契数列 解: 没啥好说的了,直接上高效的滚动迭代解法.矩阵解法和特征根解法这里不讨论了. class Solution: def Fibonacci(self, n): # write c ...
- 怀疑安装MySQL之后,导致OrCAD Capture、Allegro就打不开
记得在异常出现之前,只安装了MySQL,之后OrCAD Capture.Allegro就打不开了. Capture.exe - 系统错误 allegro.exe - 系统错误 我尝试在Cadence的 ...
- pycharm 解决PEP8问题,配置autopep8到菜单栏
autopep8是一个可以将Python代码自动排版为PEP8风格第三方包,使用它可以轻松地排版出格式优美整齐的代码.网络上有很多介绍如何在pycharm中配置autopep8的方案,但很多方案中还是 ...
- Web前后端:如何分离,如何解耦?
摘要:在本文中我们一起来探讨一下为什么要在软件开发中进行前后端的分离,如何做到前后端分离,如何解耦. 简单地说,就是要把复杂的问题简单化,把一个从0到N的问题转化为N个0到1的问题.另一个相近的说法就 ...
- ORA-00001: unique constraint (string.string) violated 违反唯一约束条件(.)
ORA-00001: unique constraint (string.string) violated ORA-00001: 违反唯一约束条件(.) Cause: An UPDATE or I ...
- Java源码详解系列(十一)--Spring的使用和源码
Spring 是一个一站式的 Java 框架,致力于提高我们项目开发的效率.通过 Spring,我们可以避免编写大量额外代码,更专注于我们的核心逻辑.目前,Spring 已经成为最受欢迎的 Java ...
- 两个多维高斯分布之间的KL散度推导
在深度学习中,我们通常对模型进行抽样并计算与真实样本之间的损失,来估计模型分布与真实分布之间的差异.并且损失可以定义得很简单,比如二范数即可.但是对于已知参数的两个确定分布之间的差异,我们就要通过推导 ...
- win7如何安装maven
1.Maven的简介Maven是一个项目管理工具,主要用于Java平台的项目构建.依赖管理和项目生命周期管理. 当然对于我这样的程序猿来说,最大的好处就是对jar包的管理比较方便,只需要告诉Maven ...
- JAVA对象头详解(含32位虚拟机与64位虚拟机)
为什么要学习Java对象头 学习Java对象头主要是为了解synchronized底层原理,synchronized锁升级过程,Java并发编程等. JAVA对象头 由于Java面向对象的思想,在JV ...