机器学习之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均值算法是一种无监督的聚类算法.算法将每个样本分配到离它最近的那个类中心所代表的类,而类中心的确 ...
 
随机推荐
- 日志分析平台ELK之日志收集器logstash常用插件配置
			
前文我们了解了logstash的工作流程以及基本的收集日志相关配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13761906.html:今天我们来了解下l ...
 - 迪杰斯特拉和spfa
			
迪杰斯特拉 Dijkstra算法是典型的算法.Dijkstra算法是很有代表性的算法.Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均 ...
 - Lyndon words学习笔记
			
Lyndon words 定义: 对于一个字符串\(S\),若\(S\)的最小后缀是其本身,则\(S\)为一个\(lyndon\)串; 记为\(S\in L\); 即: \[S \in L \begi ...
 - Java知识系统回顾整理01基础06数组03排序
			
一.选择法排序 选择法排序的思路: 把第一位和其他所有的进行比较,只要比第一位小的,就换到第一个位置来 比较完后,第一位就是最小的 然后再从第二位和剩余的其他所有进行比较,只要比第二位小,就换到第二个 ...
 - nessus 本地扫描(一)
			
第一次使用nessus ,so 适合小白看看 1.新建扫描.配置策略:起个名字,description是详细记录,类似于说明:targets是要访问的主机ip地址或者网段,必填项 选择好之后sav ...
 - 【题解】CF1290B Irreducible Anagrams
			
Link 题目大意:对于一个字符串,每次询问一个区间,看看这个区间是不是可以划分为若干区间,这些区间内数字经过排列后可以还原原来区间. \(\text{Solution:}\) 菜鸡笔者字符串构造该好 ...
 - git仓库之gitlab搭建使用
			
一.简介 GitLab 是一个用于仓库管理系统的开源项目,使用git作为代码管理工具,并在此基础上搭建起来的web服务.类似github,常用在企业内部做git私有仓库使用: 二.gitlab安装 系 ...
 - JavaScript实时显示当前时间
			
1.HTML部分 <div id="div1">显示当前时间!</div> 2.css部分 #div1 { width: 700px; height: 50 ...
 - 在nginx下导出数据库数据
			
首先上干货 解决问题 set_time_limit(0); //设置脚本运行时间为不限制 因为php脚本默认时间为30秒 ini_set('memory_limit', -1); //取消脚本运行内存 ...
 - 解读JVM虚拟机
			
概要点: java虚拟机概述和基本概念 堆.栈.方法区 了解虚拟机参数 垃圾回收概念和算法.及对象的分代转换 垃圾收集器 java虚拟机的原理: 所谓虚拟机,就是一台虚拟的机器.它是一款软件,用来执行 ...