机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记
机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记
关键字:k-均值、kMeans、聚类、非监督学习
作者:米仓山下
时间:2018-11-3
机器学习实战(Machine Learning in Action,@author: Peter Harrington)
源码下载地址:https://www.manning.com/books/machine-learning-in-action
git@github.com:pbharrin/machinelearninginaction.git
*************************************************************
一、k-均值聚类算法(kMeans)原理
聚类是一种无监督学习,它将相似的对象归到同一个簇中。K-均值聚类算法以k个随机质心开始。算法会计算每个点到质心的距离。每个点会被分到距其最近的簇质心,然后紧接着基于新分配到簇的点更新质心。以上过程重复数次,直到质心不再改变。这个简单地算法非常有效但是容易受到初始质心的影响。
为了获得更好的的聚类结果,可以使用另一种称为二分K-均值的聚类方法。二分K-均值首先将所有点作为一个簇,然后使用K-均值聚类(k=2)对其划分。下一次迭时,选择有最大误差的簇进行划分。该过程直到k个簇创建成功为止。二分K-均值的聚类效果要好于K-均值聚类。
*************************************************************
二、k-均值聚类(kMeans)
算法:
输入:dataSet——待聚类的数据集;k——要聚类的簇的个数;distMeas——计算距离的函数,默认为欧式距离函数distEclud;createCent——创建质心的函数,默认为randCent;
输出:centroids——各个簇的质心;clusterAssment——存储最小距离平方和对应质心索引
def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
m = shape(dataSet)[0]
clusterAssment = mat(zeros((m,2))) #构造m×2矩阵,用来存储最小距离平方和对应质心索引
centroids = createCent(dataSet, k) #初始化质心
clusterChanged = True
while clusterChanged: #质心不再改变时结束
clusterChanged = False
for i in range(m): #遍历每个点
minDist = inf; minIndex = -1
for j in range(k): #计算该点到每个质心的距离
distJI = distMeas(centroids[j,:],dataSet[i,:])
if distJI < minDist: #最小距离和对应质心索引
minDist = distJI; minIndex = j
if clusterAssment[i,0] != minIndex: clusterChanged = True #所属类别变化
clusterAssment[i,:] = minIndex,minDist**2
print centroids
for cent in range(k): #更新质心位置
ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]] #提取标签为cent的数据
centroids[cent,:] = mean(ptsInClust, axis=0) #ptsInClust的列平均值,axis=0 列方向
return centroids, clusterAssment
其他函数:
loadDataSet(fileName)——构造数据,读取文件中的数据矩阵
distEclud(vecA, vecB)——计算两个向量的欧式距离
randCent(dataSet, k)——根据给定的数据,在其取值边界内随机构造k个质心
-------------------------------------------------
测试:
>>> import kMeans
>>> data=kMeans.loadDataSet('testSet.txt')
>>> from numpy import *
>>> centpoint,cluster=kMeans.kMeans(mat(data),4)
[[ 2.70503374 -1.42834359]
[-2.09874174 0.13175831]
[ 4.36781866 1.23667688]
[-1.57667561 -3.89341615]]
[[ 3.03713839 -2.62802833]
[-2.605345 2.35623864]
[ 2.6265299 3.10868015]
[-2.9085278 -3.11811235]]
[[ 2.80293085 -2.7315146 ]
[-2.46154315 2.78737555]
[ 2.6265299 3.10868015]
[-3.38237045 -2.9473363 ]]
>>>
*************************************************************
三、二分K-均值聚类(biKmeans)
一种用来度量聚类效果的指标SSE(误差平方和),SSE值越小表示数据点越接近他们的质心,聚类效果也越好。因为对误差取了平方,因此更加注重远离中心的点。通过增加簇的个数来降低SSE值。
克服K-均值算法收敛于局部最小值的问题,出现了二分K-均值聚类算法。首先将所有点作为一个簇,然后将该簇一分为二。之后选择其中一个簇继续划分,选择哪一个簇进行划分取决于对其划分知否可以最大程度降低SSE的值。对上述过程不断重复,直到达到指定的簇数目为止。
算法:
def biKmeans(dataSet, k, distMeas=distEclud):
m = shape(dataSet)[0]
clusterAssment = mat(zeros((m,2)))
centroid0 = mean(dataSet, axis=0).tolist()[0]
centList =[centroid0] #创建一个初始簇
for j in range(m): #每个点到质心的距离
clusterAssment[j,1] = distMeas(mat(centroid0), dataSet[j,:])**2
while (len(centList) < k): #簇个数不满足给定数目
lowestSSE = inf #寄存较小的SSE值
for i in range(len(centList)):
ptsInCurrCluster = dataSet[nonzero(clusterAssment[:,0].A==i)[0],:] #取出i簇的数据
centroidMat, splitClustAss = kMeans(ptsInCurrCluster, 2, distMeas) #将该簇分为两簇0和1
sseSplit = sum(splitClustAss[:,1]) #比较前后的SSE值
sseNotSplit = sum(clusterAssment[nonzero(clusterAssment[:,0].A!=i)[0],1])
print "sseSplit, and notSplit: ",sseSplit,sseNotSplit
if (sseSplit + sseNotSplit) < lowestSSE: #该种分法SSE降低了
bestCentToSplit = i #记录下切分的簇
bestNewCents = centroidMat #簇质心,两个
bestClustAss = splitClustAss.copy()
lowestSSE = sseSplit + sseNotSplit #寄存较小的SSE值
bestClustAss[nonzero(bestClustAss[:,0].A == 1)[0],0] = len(centList) #更新簇分配结果,centList增加一簇
bestClustAss[nonzero(bestClustAss[:,0].A == 0)[0],0] = bestCentToSplit #更新簇分配结果
print 'the bestCentToSplit is: ',bestCentToSplit
print 'the len of bestClustAss is: ', len(bestClustAss)
centList[bestCentToSplit] = bestNewCents[0,:].tolist()[0] #更新簇质心
centList.append(bestNewCents[1,:].tolist()[0]) #更新簇质心
clusterAssment[nonzero(clusterAssment[:,0].A == bestCentToSplit)[0],:]= bestClustAss #更新clusterAssment
return mat(centList), clusterAssment
测试:
>>> reload(kMeans)
<module 'kMeans' from 'kMeans.py'>
>>> data=kMeans.loadDataSet('testSet2.txt')
>>> centList,mycluster=kMeans.biKmeans(mat(data),3)
sseSplit, and notSplit: 453.0334895807502 0.0
the bestCentToSplit is: 0
the len of bestClustAss is: 60
sseSplit, and notSplit: 77.59224931775066 29.15724944412535
sseSplit, and notSplit: 12.753263136887313 423.8762401366249
the bestCentToSplit is: 0
the len of bestClustAss is: 40
>>> centList
matrix([[-2.94737575, 3.3263781 ],
[-0.45965615, -2.7782156 ],
[ 2.93386365, 3.12782785]])
>>>
*************************************************************
四、示例:在地图上的点聚类
places.txt文件中有70行数据,每行数据包括了地址、坐标等信息,其中第四、第五列是坐标信息
将这些点按照坐标远近分为5簇
其中距离的计算用到了地球表面球面距离
最后将其绘制按照不同颜色绘制出来
>>> kMeans.clusterClubs()
sseSplit, and notSplit: 3431.621150997616 0.0
the bestCentToSplit is: 0
the len of bestClustAss is: 69
sseSplit, and notSplit: 1230.242092830394 1062.0271973840918
sseSplit, and notSplit: 515.6100923704457 2369.5939536135247
the bestCentToSplit is: 0
the len of bestClustAss is: 53
sseSplit, and notSplit: 318.6390236086656 1892.3442135982214
sseSplit, and notSplit: 515.6100923704457 1230.242092830394
sseSplit, and notSplit: 471.8115196045904 1461.9522740003558
the bestCentToSplit is: 1
the len of bestClustAss is: 16
sseSplit, and notSplit: 197.38636407063862 1345.9271085845755
sseSplit, and notSplit: 53.299046126034725 1437.9528665515088
sseSplit, and notSplit: 549.8565865332125 915.5351689867098
sseSplit, and notSplit: 109.50254173619503 1538.1414114797253
the bestCentToSplit is: 2
the len of bestClustAss is: 35

*************************************************************
机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记的更多相关文章
- 学习笔记之机器学习实战 (Machine Learning in Action)
机器学习实战 (豆瓣) https://book.douban.com/subject/24703171/ 机器学习是人工智能研究领域中一个极其重要的研究方向,在现今的大数据时代背景下,捕获数据并从中 ...
- 机器学习实战 [Machine learning in action]
内容简介 机器学习是人工智能研究领域中一个极其重要的研究方向,在现今的大数据时代背景下,捕获数据并从中萃取有价值的信息或模式,成为各行业求生存.谋发展的决定性手段,这使得这一过去为分析师和数学家所专属 ...
- K近邻 Python实现 机器学习实战(Machine Learning in Action)
算法原理 K近邻是机器学习中常见的分类方法之间,也是相对最简单的一种分类方法,属于监督学习范畴.其实K近邻并没有显式的学习过程,它的学习过程就是测试过程.K近邻思想很简单:先给你一个训练数据集D,包括 ...
- 机器学习算法与Python实践之(五)k均值聚类(k-means)
机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学 ...
- 斯坦福大学公开课机器学习: machine learning system design | error analysis(误差分析:检验算法是否有高偏差和高方差)
误差分析可以更系统地做出决定.如果你准备研究机器学习的东西或者构造机器学习应用程序,最好的实践方法不是建立一个非常复杂的系统.拥有多么复杂的变量,而是构建一个简单的算法.这样你可以很快地实现它.研究机 ...
- 机器学习实战---K均值聚类算法
一:一般K均值聚类算法实现 (一)导入数据 import numpy as np import matplotlib.pyplot as plt def loadDataSet(filename): ...
- 《Machine Learning in Action》—— 剖析支持向量机,单手狂撕线性SVM
<Machine Learning in Action>-- 剖析支持向量机,单手狂撕线性SVM 前面在写NumPy文章的结尾处也有提到,本来是打算按照<机器学习实战 / Machi ...
- 机器学习理论与实战(十)K均值聚类和二分K均值聚类
接下来就要说下无监督机器学习方法,所谓无监督机器学习前面也说过,就是没有标签的情况,对样本数据进行聚类分析.关联性分析等.主要包括K均值聚类(K-means clustering)和关联分析,这两大类 ...
- 【机器学习】机器学习入门08 - 聚类与聚类算法K-Means
时间过得很快,这篇文章已经是机器学习入门系列的最后一篇了.短短八周的时间里,虽然对机器学习并没有太多应用和熟悉的机会,但对于机器学习一些基本概念已经差不多有了一个提纲挈领的了解,如分类和回归,损失函数 ...
随机推荐
- SQL Server性能优化(7)理解数据库文件组织
一.基本单位"页" SQL Server是用8KB的页来存储数据.物理I/O操作也是在页级执行.页的种类有很多,具体参考(MSDN).我们关注更多的是数据页的结构,包括三部 ...
- MySql中插入乱码问题解决
今天在使用Java写入数据库时候,发现Insert语句和Update语句在执行过后,数据库中中文显示的是“??”,经过一番查阅,其中关键的问题在于编码格式是否统一. 其中创建表时候,每个关键字的格式都 ...
- Android开发艺术探索学习笔记(十)
第十章 Android的消息机制 面试中经常会被问到的一个问题:handler是如何在子线程和主线程中进行消息的传递的,这个问题通过了解Android的消息机制可以得到一个准确的答案. Androi ...
- 全网最详细的CentOS7里如何安装MySQL(得改为替换安装MariaDB)(图文详解)
不多说,直接上干货! 直接yum install mysql的话会报错,原因在于yum安装库里没有直接可以用的安装包,此时需要用到MariaDB了,MariaDB是MySQL社区开发的分支,也是一个增 ...
- python使用requests请求的数据乱码
1.首先进入目标网站,浏览器查看源码,找到head标签下面的meta标签,一般meta标签不止一个,我们只需找到charset属性里面的值即可 2.requests请求成功时,设置它的编码,代码如下 ...
- 61. 旋转链表-leetcode
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出: 4-& ...
- Vue笔记:VS Code 常用快捷键
VS Code 常用快捷键 1.注释: 单行注释:ctrl+/, 注释后再按取消 取消单行注释:alt+shift+A 注释后再按取消 2.移动行 向上移动一行:alt+up 向下移动一行:alt+d ...
- CentOS 6.9上inotify-tools 安装及使用方法
文章目录 [隐藏] 一.检查系统内核版本 三.下载安装(下载有点慢) 四.查看inotify默认参数 五.修改inotify参数 六.创建实时监控脚本 (file 里面放的需要监听的目录) 七:实例操 ...
- xfsdump 备份文件系统
实战:xfs 文件系统的备份和恢复 一.xfs 简单介绍. XFS 提供了 xfsdump 和 xfsrestore 工具协助备份 XFS 文件系统中的数据.xfsdump 按 inode顺序备 ...
- [Python学习笔记-005] 理解yield
网络上介绍yield的文章很多,但大多讲得过于复杂或者追求全面以至于反而不好理解.本文用一个极简的例子给出参考资料[1]中的讲解,因为个人觉得其讲解最为通俗易懂,读者只需要对Python的列表有所了解 ...