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个聚类中心,然后遍历每一个样本,将样本归类到最近的一个聚类中,一个聚类中样本特征 ...
随机推荐
- Nginx的rewrite应用
Rewrite主要的功能是实现URL重写,Nginx 的 Rewrite 规则采用 PCRE Perl 兼容正则表达式的语法进行规则匹配,如相使用 Nginx 的 Rewrite 功能,在编译 Ngi ...
- SAS 逻辑库
SAS逻辑库 SAS逻辑库是一个或多个SAS文件的集合,用于组织.查找和管理 SAS文件.SAS逻辑库管理的SAS文件包括SAS数据集.SAS目录.已编 译的SAS程序,以及多维数据库文件等. 1.逻 ...
- 2019.02.11 bzoj1568: [JSOI2008]Blue Mary开公司(线段树)
传送门 题意简述:维护整体加一条线段,求单点极值. 思路: 直接上李超线段树维护即可. 代码: #include<bits/stdc++.h> #define ri register in ...
- 1.MFC架构分析
1.架构代码文件的结构 主要由四个部分组成 1.资源文件Resource.h:主要定义资源的ID 2.预编译文件:stdafx.h 可以用来解决头文件包含冲突的问题,定义一些需要全局性包含的文件. 3 ...
- qhfl-5 redis 简单操作
Redis Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis有以下特点: -- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可 ...
- 从中央仓库下载所想要的jar包
中央仓库地址:https://mvnrepository.com/ 这边我搜索一个commons-logging包作为例子: 点击下面第二个绿色的comons-logging进入这个页面: 一.win ...
- MFC为多个控件绑定同一个函数
方式一: afx_msg void OnButtonClick(UINT nID); ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON_1, IDC_BUTTON_XX, ...
- Mysql中比较常用的两种存储引擎和事务
存储引擎:引擎(类似汽车上的发动机)决定了数据库的快慢,MySql中有20多个引擎,不同的存储引擎提供不同的存储机制.索引技巧.锁定水平.MYISAM存储引擎,INNODB存储引擎最出名.数据库的核心 ...
- Python学习第三章
1.模块: 其实每个.py文件本身就是一个模块,当读者做完了一个.py文件,如果别人打算直接分享你的成果,只要在他编写的.py文件中倒入(import)就好了. 比如想在hello1.py文件里直接使 ...
- MySQL--运维内参中的binlog_summary脚本
#!/bin/bash ##===================================================## ## 脚本出自<MySQL运维内参> ##===== ...