机器学习--K-means算法
2015-06-08 16:45
183 查看
本文转自:http://blog.csdn.net/linkin1005/article/details/39312735
提到k-means不得不说的许高建老师,他似乎比较偏爱使用这种聚类方法,在N个不同场合听到他提起过,k-means通过设置重心和移动中心两个简答的步骤,就实现了数据的聚类。下面就来介绍下k-means算法。
一、 数值属性距离度量
度量数值属性相似度最简单的方法就是计算不同数值间的“距离”,如果两个数值之间“距离”比较大,就可以认为他们的差异比较大,而相似度较低;换而言之,如果两数值之间“距离”较小,可认为他们的差异比较小,相似度较高。
例如,根据身高数据,比较数值间的距离,对未标签的篮球运动员和体操运动员的进行聚类,准确率会比较高。
令两个n维数值分别为:
和
,那么这两个数值之间的“距离”可以用如下方法进行度量:
曼哈顿距离:
曼哈顿距离之所以这么命名,就是其度量的距离类似于城市中两个点的街区距离:
欧几里德距离:
欧几里德距离就是我们常用的两点之间的直线距离:
推广到一般情况:
闵可夫斯基距离:
{\left|x_{i1}-x_{j1}\right|^{h}+\left|x_{i2}-x_{j2}\right|^{h}+...+\left|x_{in}-x_{jn}\right|^{h}}]
闵可夫斯基又称为
范式,可以看出:当h=1时,它表示曼哈顿距离(
范式);当h=2时,它表示欧几里德距离(
范式);当
时的闵可夫斯基距离又称为上确界距离(
范式、切比雪夫距离)。
一、 概述
k-means算法从字面上看分两个部分:1、k,这里的k是需要聚类的簇的数量,也就是说将样本分为k类;2、means,顾名思义,利用到求平均值。其核心思想是将样本分为K类,使得类之间的样本距离大,而类之内的样本距离小。
二、 算法
假设有训练集
,因为没有标签,k-means算法是无监督算法。
算法描述:
1. 随机初始化k个聚类重心
;
2. 将每个数据跟各重心比较,找出离此数据最近的重心,既是其所属的簇;
3. 计算每个簇的重心,并重置
;
4. 重复步骤2-4,直至收敛。
伪代码:
1. Initialize cluster centroids
2. Repeat until convergence {
For every i, set
For each j, set
}
敛散性:
我们定义失真函数(distortion function)为:
J度量的是训练集
和聚类重心
的距离的平方和。通常,通过重心的不断迭代,J的数值不断减小直至收敛至一常数。然而,由于J是非凸函数,因此,在初始化重心时需要尝试多个初始值,最后选择使J最低的初始值,以防陷入局部收敛。
时间、空间复杂度:
时间复杂度:O(tKmn),其中,t为迭代次数,K为簇的数目,m为训练样本数,n为维数;
空间复杂度:O((m+K)n),其中,K为簇的数目,m为训练样本数,n为维数。
三、 实例
(1)假设我们的原始数据如图1所示,为没有标注类别的散点。目标是运用k-means算法将这些点划分为两个不同的类。
图1
(2)随机的初始化两个类的重心(分别利用红蓝亮色的“X”号表示),如图2所示。
图2
(3)分别计算所有点和两个重心的距离(一般计算欧几里德距离),每个点和哪个重心最近,就将该点和对应的中心划分到同一个簇中。
图3
(4)重新计算每个簇的中心,将原有的中心替换。图4
图4
(5)不断重复步骤(3)(4)的方法,直到重心收敛,所得到的两个簇就是聚类结果。
下面是一个身高和体重的散点图,利用k-means算法将散点分为3个类,每个类的人群的分别适合穿着尺寸为S、M、L号的T-shirt。可以看出对于这个问题,k-means算法的聚类效果比较好。
提到k-means不得不说的许高建老师,他似乎比较偏爱使用这种聚类方法,在N个不同场合听到他提起过,k-means通过设置重心和移动中心两个简答的步骤,就实现了数据的聚类。下面就来介绍下k-means算法。
一、 数值属性距离度量
度量数值属性相似度最简单的方法就是计算不同数值间的“距离”,如果两个数值之间“距离”比较大,就可以认为他们的差异比较大,而相似度较低;换而言之,如果两数值之间“距离”较小,可认为他们的差异比较小,相似度较高。
例如,根据身高数据,比较数值间的距离,对未标签的篮球运动员和体操运动员的进行聚类,准确率会比较高。
令两个n维数值分别为:
和
,那么这两个数值之间的“距离”可以用如下方法进行度量:
曼哈顿距离:
曼哈顿距离之所以这么命名,就是其度量的距离类似于城市中两个点的街区距离:
欧几里德距离:
欧几里德距离就是我们常用的两点之间的直线距离:
推广到一般情况:
闵可夫斯基距离:
{\left|x_{i1}-x_{j1}\right|^{h}+\left|x_{i2}-x_{j2}\right|^{h}+...+\left|x_{in}-x_{jn}\right|^{h}}]
闵可夫斯基又称为
范式,可以看出:当h=1时,它表示曼哈顿距离(
范式);当h=2时,它表示欧几里德距离(
范式);当
时的闵可夫斯基距离又称为上确界距离(
范式、切比雪夫距离)。
一、 概述
k-means算法从字面上看分两个部分:1、k,这里的k是需要聚类的簇的数量,也就是说将样本分为k类;2、means,顾名思义,利用到求平均值。其核心思想是将样本分为K类,使得类之间的样本距离大,而类之内的样本距离小。
二、 算法
假设有训练集
,因为没有标签,k-means算法是无监督算法。
算法描述:
1. 随机初始化k个聚类重心
;
2. 将每个数据跟各重心比较,找出离此数据最近的重心,既是其所属的簇;
3. 计算每个簇的重心,并重置
;
4. 重复步骤2-4,直至收敛。
伪代码:
1. Initialize cluster centroids
2. Repeat until convergence {
For every i, set
For each j, set
}
敛散性:
我们定义失真函数(distortion function)为:
J度量的是训练集
和聚类重心
的距离的平方和。通常,通过重心的不断迭代,J的数值不断减小直至收敛至一常数。然而,由于J是非凸函数,因此,在初始化重心时需要尝试多个初始值,最后选择使J最低的初始值,以防陷入局部收敛。
时间、空间复杂度:
时间复杂度:O(tKmn),其中,t为迭代次数,K为簇的数目,m为训练样本数,n为维数;
空间复杂度:O((m+K)n),其中,K为簇的数目,m为训练样本数,n为维数。
三、 实例
(1)假设我们的原始数据如图1所示,为没有标注类别的散点。目标是运用k-means算法将这些点划分为两个不同的类。
图1
(2)随机的初始化两个类的重心(分别利用红蓝亮色的“X”号表示),如图2所示。
图2
(3)分别计算所有点和两个重心的距离(一般计算欧几里德距离),每个点和哪个重心最近,就将该点和对应的中心划分到同一个簇中。
图3
(4)重新计算每个簇的中心,将原有的中心替换。图4
图4
(5)不断重复步骤(3)(4)的方法,直到重心收敛,所得到的两个簇就是聚类结果。
下面是一个身高和体重的散点图,利用k-means算法将散点分为3个类,每个类的人群的分别适合穿着尺寸为S、M、L号的T-shirt。可以看出对于这个问题,k-means算法的聚类效果比较好。
相关文章推荐
- 机器学习--线性回归
- 挖地雷
- Android Studio --自动删除没有用的资源,给APK减减肥
- hdu 2685 I won't tell you this is about number theory
- Opencv笔记(1) 命名规则数据结构(CvMat,...)
- hadoop yarn 代码示例及架构
- hive sql join
- Java加密技术(二)对称加密算法DES&AES
- 内存对其
- (转载)RTorrent 命令行使用说明
- Hibernate+Spring配置
- ubuntu 关机,重启,注销命令
- recv send 阻塞和非阻塞
- PerformanceCounter
- 9. C#数据结构与算法 -- 线性存储结构(线性表之顺序表,动态数组和泛型实现)
- DIV显示和隐藏用法(二)
- SAT作文批改实例讲解
- 云计算应用与Pispower云计算平台
- cocos2d-js 热更新详解(一)
- 总结几个C语言中的坑(二)