机器学习之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均值算法是一种无监督的聚类算法.算法将每个样本分配到离它最近的那个类中心所代表的类,而类中心的确 ...
随机推荐
- Spring ioc 源码分析之--beanFactory.registerResolvableDependency()方法
背景: 在spring ioc refresh()方法中,看到了如下逻辑: 要理解该逻辑的原理,先看场景:有个接口InterFaceA,它有2个实现类A1和A2 那么,如果一个类C 依赖了InterF ...
- django 的基础设计
一.web程序工作流程 二.django 的基础介绍 目的:了解Django框架的作用和特点 作用: 简便.快速的开发数据库驱动的网站 Django的优势 快速开发 MVT 功能齐全 Django学 ...
- flutter json_annotation和json_serializable处理json数据序列化
flutter json_annotation和json_serializable处理json数据序列化 导包 dependencies: json_annotation: ^2.4.0 dev_de ...
- newifi3-D2 openwrt挂载u盘扩容/overlay
格式化U盘 1.openwrt安装插件 opkg install fdisk swap-utils kmod-usb-storage kmod-fs-ext4 e2fsprogs kmod-usb-o ...
- 从面向过程到面向对象再到MVC
/* * * title: 从面向过程到面向对象再到MVC * author: tanghao * date: 2020.9.30 * version: 1.0 * */ 前言 本文档通过一个显示20 ...
- CUMTCTF'2020 未完成 wp
Web babysqli burp抓包,发现有 的过滤,用/**/过滤空格. 报错注入 payload username=admin&password='/**/or/**/extractva ...
- Power Designer建模之餐饮在线点评系统——业务处理模型
餐饮在线点评系统除查看会员促销活动.查看站内消息等简单业务流程外,相对复杂的业务流程包括管理员注册餐厅,发布餐厅信息,餐厅信息主要包括特色菜.促销活动.团购活动和优惠券信息. 餐厅信息发布后,用户可以 ...
- >>8) & 0xFF中的 >> 和 &0xFF 的作用
参考:https://blog.csdn.net/iamgamer/article/details/79354617 其中有两个位运算,一个是>>,一个是&. 0xff的作用一: ...
- Java 客户端操作 FastDFS 实现文件上传下载替换删除
FastDFS 的作者余庆先生已经为我们开发好了 Java 对应的 SDK.这里需要解释一下:作者余庆并没有及时更新最新的 Java SDK 至 Maven 中央仓库,目前中央仓库最新版仍旧是 1.2 ...
- Python 导入模块的两种方法:import xxx 和from...import xxx
import 方式导入模块 import tool.getsum.add # 导入模块,优先会从启动文件的当前目录开始寻找 # 如果找到,就使用 # 如果找不到,会在系统模块存放目录去 tool.ge ...