K均值聚类
聚类(cluster)与分类的不同之处在于, 分类算法训练过程中样本所属的分类是已知的属监督学习. 而聚类算法不需要带有分类的训练数据,而是根据样本特征的相似性将其分为几类,又称为无监督分类.
K均值聚类(K-means cluster)算法是一种比较简单的聚类算法:
在特征空间中选择k个质心,每个质心代表一个分类
对于每个样本点计算其到各质心的距离,将其归入最近质心的类中
对于每个类计算所有样本点的均值,作为新的质心
反复执行
2,3直至所有样本点分类均不再发生变化为止.
上述算法中的距离可以采用不同的定义, 最常见的为欧式距离:
def distEclud(vecA, vecB):
return sqrt(sum(power(vecA - vecB, 2)))
初始质心可以在数据集边界内随机选取:
def randCent(dataSet, k):
n = shape(dataSet)[1]
centers = mat(zeros((k, n)))
for j in range(n):
minJ = min(dataSet[:, j])
rangeJ = float(max(dataSet[:, j]) - minJ)
centers[:, j] = mat(minJ + rangeJ * random.rand(k, 1))
return centers
实现KMean算法:
def kMeans(dataSet, k, distMethod=distEclud, createCent=randCent):
m = shape(dataSet)[0]
clusterAssess = mat(zeros((m, 2)))
centers = createCent(dataSet, k)
clusterChanged = True
while clusterChanged:
clusterChanged = False
for i in range(m): # for each sample
# get closest center
minDist = inf
minIndex = -1
for j in range(k): # for each class
dist = distMethod(centers[j, :], dataSet[i, :])
if dist < minDist:
minDist = dist
minIndex = j
if clusterAssess[i, 0] != minIndex:
clusterChanged = True
clusterAssess[i, :] = minIndex, minDist ** 2
# update center
for cent in range(k):
ptsInClust = dataSet[nonzero(clusterAssess[:, 0].A == cent)[0]]
centers[cent, :] = mean(ptsInClust, axis=0)
return centers, clusterAssess
centers为所有质心的坐标列表, clusterAssess记录了每个点的序号和距其质心距离的平方.
定义误差平方和(Sum of Squared Error, SSE)为所有样本点距其质心的距离平方和, 误差越小则聚类效果越好.
K-Mean算法很容易实现,但是需要手动指定分类数k故而在实际应用中非常不便.
二分K均值算法是该问题的一种解决方案, 该算法仅需指定最大的分类数而自行选择最佳分类数:
将整个数据集作为一个分类
使用kMeans算法将其进行二分类
选择误差较大的分类进行进一步划分
算法实现:
def binKMeans(dataSet, k, distMethod=distEclud):
m = shape(dataSet)[0]
clusterAssess = mat(zeros((m, 2)))
originCenters = mean(dataSet, axis=0).tolist()[0]
centers = [originCenters]
# get origin error
for j in range(m):
clusterAssess[j, 1] = distMethod(mat(originCenters), dataSet[j, :]) ** 2
# try to cluster
while (len(centers) < k):
# get best spilt
minError = inf
for i in range(len(centers)):
ptsInCurrCluster = dataSet[nonzero(clusterAssess[:, 0].A == i)[0], :]
splitCenter, splitAssess = kMeans(ptsInCurrCluster, 2, distMethod)
spiltError = sum(splitAssess[:, 1])
formerError = sum(clusterAssess[nonzero(clusterAssess[:, 0].A != i)[0], 1])
if (spiltError + formerError) < minError:
bestCentToSplit = i
bestNewCents = splitCenter
bestClustAss = splitAssess.copy()
minError = spiltError + formerError
# update assessment
bestClustAss[nonzero(bestClustAss[:, 0].A == 1)[0], 0] = len(centers)
bestClustAss[nonzero(bestClustAss[:, 0].A == 0)[0], 0] = bestCentToSplit
# update global centers and assessment
centers[bestCentToSplit] = bestNewCents[0, :].tolist()[0]
centers.append(bestNewCents[1, :].tolist()[0])
clusterAssess[nonzero(clusterAssess[:, 0].A == bestCentToSplit)[0], :] = bestClustAss
return centers, clusterAssess
K均值聚类的更多相关文章
- 【转】算法杂货铺——k均值聚类(K-means)
k均值聚类(K-means) 4.1.摘要 在前面的文章中,介绍了三种常见的分类算法.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应.但是很多时 ...
- 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)和关联分析,这两大类 ...
- 第十篇:K均值聚类(KMeans)
前言 本文讲解如何使用R语言进行 KMeans 均值聚类分析,并以一个关于人口出生率死亡率的实例演示具体分析步骤. 聚类分析总体流程 1. 载入并了解数据集:2. 调用聚类函数进行聚类:3. 查看聚类 ...
- K均值聚类的失效性分析
K均值聚类是一种应用广泛的聚类技术,特别是它不依赖于任何对数据所做的假设,比如说,给定一个数据集合及对应的类数目,就可以运用K均值方法,通过最小化均方误差,来进行聚类分析. 因此,K均值实际上是一个最 ...
- ML: 聚类算法-K均值聚类
基于划分方法聚类算法R包: K-均值聚类(K-means) stats::kmeans().fpc::kmeansruns() K-中心点聚类(K-Medoids) ...
- 探索sklearn | K均值聚类
1 K均值聚类 K均值聚类是一种非监督机器学习算法,只需要输入样本的特征 ,而无需标记. K均值聚类首先需要随机初始化K个聚类中心,然后遍历每一个样本,将样本归类到最近的一个聚类中,一个聚类中样本特征 ...
随机推荐
- java多线程系列9 高级同步工具(3) CyclicBarrier
CyclicBarrier 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point) 然后一再执行 public class CyclicBar ...
- LAMP简介与部署
lamp简介 lamp,是由Linux+Apache+Mysql/MariaDB+Php/Perl/Python的一组动态网站或者服务器的开源软件,除Linux外其它各部件本身都是各自独立的程序,但是 ...
- 一不注意,在Unity3D中DllImport 引起的Bug.
单要说这个Bug是很简单,但是得从头说起. 一些大型的网络游戏,或者加载比较多的一些场景时,如果要等待所有模型,贴图等各种资源文件加载完毕才能执行游戏,对用户将会是一个很头大的事情.所以就需要用到动态 ...
- 走进JDK(四)------InputStream、OutputStream、Reader、Writer
InputStream InputStream是java中的输入流,下面基于java8来分析下InputStream源码 一.类定义 public abstract class InputStream ...
- PHY过采样问题
什么频率下进行过采样 ?? 按时程序是LMDS时钟小于100M时会进行过程采样,实际上PHY的文档上也有明确的说明: The minimum operational data rate is 1.0 ...
- Latex 模版生成会议论文 不显示Keywords,而是显示 Index Terms- ,改成Keywords 方法
一. 不管显示何种内容,TEX 文件都是 \begin{IEEEKeywords} 关键词1.关键词2,..... \end{IEEEKeywords} 其中:模版文件 IEEETran.cls存在下 ...
- iOS中的HTTPS
在WWDC 15,Apple提出的ATS (App Transport Security) ,是 Apple 在推进网络通讯安全的一个重要方式.在 iOS 9 和 OS X 10.11 中,默认情况下 ...
- go操作redis
package main import ( "fmt" "github.com/gomodule/redigo/redis" ) func main() { c ...
- MySQL:索引
索引的目的在于提高查询效率,它的作用就相当于一本书的目录: 1. 常见的索引模型 1.1 哈希表 优点:适用于等值查询的场景: 缺点:范围查询效率较低: 1.2 有序数组 优点:范围查询和等值查询效率 ...
- maven 下载镜像文件卡,下载pom文件慢的问题
问题原因: maven默认的镜像库URL为 http://maven.net.cn/content/groups/public/ 由于网络原因,可能导致响应速度超级慢,或者无法效应: 解决方法: 配置 ...