KMeans算法分析以及实现
KMeans
KMeans是一种无监督学习聚类方法, 目的是发现数据中数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好。
无监督学习,也就是没有对应的标签,只有数据记录.通过KMeans聚类,可以将数据划分成一个簇,进而发现数据之间的关系.
原理
KMeans算法是将数据\({x^1, x^2 ,..., x^n}\)聚类成k个簇,其中每个\(x^i \in R^n\), 算法具体描述:
- 随机选择k个聚类质心点:\(\mu_1, \mu_2, ..., \mu_k\);
- 重复下面过程直到收敛{
对于每一个数据i,计算其属于的簇:
\(c^{(i)} := argmin_j||x^{(i)}-\mu_j||^2\);
对于每个簇j,重新计算簇质心:
\(\mu_j=\frac{\sum_{i=1}^n1{(c^i==j)}x^i}{\sum_{i=1}^n1{(c^{(i)}=j)}}\)
}
用语言描述来说,就是:随机确定k个初始点作为簇中心; 为每个数据分配簇[计算每条数据和簇中心的相似度,分配到最相似的簇上];根据簇中的数据点对每个簇中心进行更新.反复重复直到收敛为止.
伪代码:
创建k个点作为起始质心;
当任意一个点的簇分配结果发生改变时:
对数据集中的每个数据点:
对每个质心:
计算质心和当前数据点的相似度
将数据点分配到最近的质心所代表的簇上
对于每个簇,计算簇中所有点的均值,并将均值作为新的簇中心[质心]
存在问题及其处理方法
- 必须事先给出k(要生成的簇的数目),而且对初值敏感,对于不同的初始值,可能会导致不同结果。
- 不适合于发现非凸面形状的簇或者大小差别很大的簇。
- 对于“躁声”和孤立点数据是敏感的,因为簇的中心是通过计算数据的平均值得到的,这些数据的存在会使聚类的中心发生很大的偏移;
- 容易陷入到局部最优解.
对于局部最优解的问题,一方面可以像决策树一样,对最后生成的聚类效果进行"剪枝"处理,但有所不同,因为要保证簇数目不变,所有处理进行"剪枝处理"外,还需要"增枝处理",具体可以依据某种指标[SSE sum of square errors]选择指标最大的簇尝试划分, 然后选择两个进行合并,保证簇的数目不变.
另一方面,可以对kmeans进行优化处理,存在一种二分kMeans处理.
二分k均值:首先将所有数据看成一个簇,然后将该簇一分为二,之后选择其中一个簇继续划分, 如何选择簇取决于对其划分是否可以最大程度的降低SSE的值;然后反复重复,直到得到K个簇为止.
代码实现
github地址: repository
KMeans算法分析以及实现的更多相关文章
- 转载: scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法
版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ================== ...
- kmeans算法理解及代码实现
github:kmeans代码实现1.kmeans代码实现2(包含二分k-means) 本文算法均使用python3实现 1 聚类算法 对于"监督学习"(supervised ...
- Kmeans聚类算法分析(转帖)
原帖地址:http://www.opencvchina.com/thread-749-1-1.html k-means是一种聚类算法,这种算法是依赖于点的邻域来决定哪些点应该分在一个组中. ...
- K-MEANS算法总结
K-MEANS算法 摘要:在数据挖掘中,K-Means算法是一种 cluster analysis 的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法. 在数据挖掘中,K-M ...
- 斯坦福机器学习实现与分析之八(kmeans算法)
Kmeans算法简介 作为无监督学习领域的一种简单的算法,Kmeans在实际应用中却是相当广泛的.其过程是通过不断交替迭代求得最优的类中心以及每个样本所属类别,具体步骤如下: 确定类别个数k 随机初始 ...
- kmeans算法
# coding:utf-8 import numpy as np import matplotlib.pyplot as plt def dis(x, y): #计算距离 return np.sum ...
- 机器学习算法与Python实践之(五)k均值聚类(k-means)
机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学 ...
- K-means聚类算法及python代码实现
K-means聚类算法(事先数据并没有类别之分!所有的数据都是一样的) 1.概述 K-means算法是集简单和经典于一身的基于距离的聚类算法 采用距离作为相似性的评价指标,即认为两个对象的距离越近,其 ...
- 数据挖掘之KMeans算法应用与简单理解
一.背景 煤矿地磅产生了一系列数据: 我想从这些数据中,取出最能反映当前车辆重量的数据(有很多数据是车辆上磅过程中产生的数据).我于是想到了聚类算法KMeans,该算法思想比较简单. 二.算法步骤 1 ...
随机推荐
- angularjs的$http请求方式
/*$http常用的几个参数 $http服务的设置对象: 1.method 字符串 表示发送的请求类型 get post jsonp等等 2.url 字符串 绝对或者相对的URL,请求的目标 3.pa ...
- Intent调用常见系统组件
// 调用浏览器 Uri webViewUri = Uri.parse("http://blog.csdn.net/zuolongsnail"); Intent intent = ...
- REPLACE函数的使用方法
Replace函数的含义~ 用新字符串替换旧字符串,而且替换的位置和数量都是指定的. replace函数的语法格式 =Replace(old_text,start_num,num_chars,new_ ...
- @addTagHelper的使用
@addTagHelper用来在cshtml页面加入自定义的Tag @addTagHelper “[the full type name of taghelper,] the assembly nam ...
- SEVERE: An incompatible version 1.1.27 of the APR based Apache Tomcat Native library is installed, while Tomcat requires version 1.1.32
问题: SEVERE: An incompatible version 1.1.27 of the APR based Apache Tomcat Native library is installe ...
- Exchange ActiveSync iOS and Android User Agent Strings
Updated: April 2018 iOS devices unfortunately do not register with ActiveSync or other tools with a ...
- python 序列化pickle 和 encode的区别
我们把变量从内存中变成可存储或传输的过程称之为序列化. 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即un ...
- php处理手机号中间的四位为星号****
在显示用户列表的场景中,一般用到手机号的显示时都需要对手机号进行处理,一般是把中间的四位换成星号****,我本人用php处理的思路是进行替换,用****替换手机号的中间四位 代码如下: $all_lo ...
- Centos7使用Docker安装Gogs搭建git服务器
gihub地址:https://github.com/gogs/gogs gogs官网:https://gogs.io/ gihub官方docker安装gogs方法:https://github.co ...
- python基础 - 控制语句
判断-if mood = True if mood: print('mood ok'); else: print('mood not OK') if-elif-else if a == 1: pass ...