1.聚类的思想:

将一个有N个对象的数据集,构造成k(k<=n)个划分,每个划分代表一个簇。使得每个簇包含一个对象,每个对象有且仅属于一个簇。
对于给定的k,算法首先给出一个初始的划分方法,以后通过反复迭代的方法改变划分,使得每一次改进之后的划分方案都较前一次更好

2.K-means聚类

2.1K-means聚类的思想

K-means算法使用广泛,有时候也作为其他聚类算法的基础。
算法首先随机选择k个对象,每个对象初始地代表了一个簇的平均值和中心。对剩余的每个对象根据其与各个簇中心的距离,将它赋给最近的簇。然后重新计算每个簇的平均值。这个过程不断重复,直到准则函数(常常使用最小平方误差)收敛。
其损失函数表达式为\(\sum_{i=1}^k \sum_{x_j \in S_j} \left(x_j - \mu_j \right)^2\)

2.2K-means聚类的算法步骤

  1. 输入:n个样本数据,分别为$x_1,x_2,\cdots,x_n$
  2. 1. 随机选择k个聚类中心,$\mu_1,\mu_2,\cdots,\mu_k \in \mathbb{R}^{n}$
  3. 2. 针对剩余的样本数据,将其类别标签设为距离其最近的聚类中心的标签。
  4. 3. 将每个聚类中心的值更新为与该类所有样本的平均值。
  5. 4. 重复以上步骤,直到聚类中心的变化小于规定的阈值即可。

2.3K-means聚类代码实现

2.3.1随机构造二维数据集

  1. # -*- coding:utf-8 -*-
  2. import matplotlib.pyplot as plt
  3. from numpy import *
  4. import random
  5. flag = ['b*','g+','rs','sb', 'db', '<b', 'pb']
  6. def create():
  7. num = 100
  8. data = [[],[],[]]
  9. dataCenter = [(2,3),(2.5,3),(2,2.5)]
  10. for i in xrange(len(data)):
  11. for j in xrange(num):
  12. data[i].append((dataCenter[i][0]+random.uniform(-1,1)**2*random.uniform(-1,1), dataCenter[i][1]+random.uniform(-1,1)**2*random.uniform(-1,1)))
  13. ##draw picture
  14. global flag
  15. for i in xrange(len(data)):
  16. for j in data[i]:
  17. plt.plot(j[0],j[1],flag[i])
  18. plt.show()
  19. return data[0]+data[1]+data[2]

2.3.2K-means聚类python实现

  1. # -*- coding:utf-8 -*-
  2. import matplotlib.pyplot as plt
  3. from numpy import *
  4. import random
  5. ##计算两个点之间的距离,这里采用的是欧式距离,关于距离的选择,看场景。
  6. def distEclud(vecA, vecB):
  7. return sqrt(sum(power(vecA-vecB,2)))
  8. ##初始化选择k个质心,这里选用的是从n个点中随机选出k个质心。
  9. def initCenter(data, k=2):
  10. n = shape(data)[1]
  11. centers = mat(zeros((k,n)))
  12. for i in xrange(k):
  13. index = int(random.uniform(0,len(data)))
  14. centers[i] = data[index]
  15. return centers
  16. ##计算上次和本次质心的距离偏差
  17. def deltaCenter(centers, centersNext):
  18. return sqrt(sum(power(centers-centersNext,2)))
  19. def KMeans(data,k=2):
  20. centers = initCenter(data, k)
  21. centersNext = mat(zeros((k,shape(data)[1])))
  22. dataNum = shape(data)[0]
  23. clusterRes = mat(zeros((dataNum,2)))
  24. eps = 0.01
  25. delta = inf
  26. freq = 10
  27. while eps < delta and freq>0:
  28. freq -= 1
  29. ##针对每个点划分类别
  30. for i in xrange(dataNum):
  31. mindist = inf
  32. for j in xrange(k):
  33. dist = distEclud(centers[j],data[i])
  34. if dist<mindist:
  35. mindist = dist
  36. minIndex = j
  37. clusterRes[i] = [minIndex,mindist]
  38. ##recalc the center of cluster
  39. for j in xrange(k):
  40. clusterData = data[nonzero(clusterRes[:,0].A==j)[0]]
  41. centers[j] = mean(clusterData, axis=0)
  42. ##计算上一次聚类中心和这一次的变动
  43. delta = deltaCenter(centers,centersNext)
  44. ##draw results
  45. # global flag
  46. # for i in xrange(k):
  47. # clusterData = data[nonzero(clusterRes[:,0].A==i)[0]]
  48. # for j in clusterData:
  49. # plt.plot(j[0,0],j[0,1],flag[i])
  50. # plt.show()
  51. return centers,clusterRes
  52. if __name__ == '__main__':
  53. data = create()
  54. KMeans(mat(data),3)


3个聚类中心依次为:[1.95408899 2.44211387] [ 1.97371672 3.04483904][ 2.59031316 2.9787235 ]

2.4K-means聚类缺点

初值敏感
对噪声敏感
不适于发现非凸面形状的簇或大小差别很大的簇
无法保证收敛到全局最优
有可能会出现某个聚类中心没有任何样本

3.二分K-means

3.1二分K-means算法步骤

由于K-means算法有时候容易收敛到局部最小值,因此就提出了二分K-means。
该算法是将所有点作为一个簇,然后将该簇一分为二,之后选择其中一个簇进行划分,选择哪一个簇进行划分取决于对其划分是否可以最大程度降低SSE(误差平方和)的值,直到得到指定的簇数目为止。
聚类的SSE能够衡量聚类的性能,该值越小表示数据点越接近于它们的质心,聚类效果越好。所以

  1. 将所有数据看成一个簇,对该簇进行二分K-means
  2. 当簇的数目小于k
  3. 对每一个簇
  4. 进行K-means划分,其中K=2
  5. 计算划分后的总误差
  6. 选择总误差最小的那个簇进行划分

3.2二分K-means代码实现

  1. # -*- coding:utf-8 -*-
  2. ########################################
  3. # kmeans: k-means cluster
  4. # Author : xuke
  5. # Date : 2015-09-14
  6. ########################################
  7. import matplotlib.pyplot as plt
  8. from numpy import *
  9. import random
  10. flag = ['b*','g+','rs','sb', 'db', '<b', 'pb']
  11. def biKmeans(data,k=2):
  12. dataNum = shape(data)[0]
  13. clusterRes = mat(zeros((dataNum,2)))
  14. center0 = mean(data,axis=0).tolist()[0]
  15. centers = [center0]
  16. ##计算一簇的簇心
  17. for i in xrange(dataNum):
  18. clusterRes[i,1] = distEclud(mat(center0), data[i])
  19. while (len(centers) < k):
  20. minSSE = inf
  21. ##遍历每个簇,划分每个簇,求得每个簇的SSE
  22. for i in xrange(len(centers)):
  23. dataNow = data[nonzero(clusterRes[:,0].A==i)[0],:]
  24. centerTemp, clusterResTemp = KMeans(dataNow,2)
  25. dataSSE = sum(clusterResTemp[:,1])
  26. dataNoSSE = sum(clusterRes[nonzero(clusterRes[:,0].A!=i)[0],1])
  27. if dataSSE + dataNoSSE < minSSE:
  28. bestCluster = i
  29. bestCenter = centerTemp
  30. bestClusterResTemp = clusterResTemp.copy()
  31. minSSE = dataSSE + dataNoSSE
  32. ##为选择出的最佳划分簇,打上类别,假设第2簇需要划分,且现在共有4簇,则第2簇打上2,4label。
  33. bestClusterResTemp[nonzero(bestClusterResTemp[:,0].A == 1)[0],0] = len(centers)
  34. bestClusterResTemp[nonzero(bestClusterResTemp[:,0].A == 0)[0],0] = bestCluster
  35. ##将最佳质心append进centers这个list
  36. centers[bestCluster] = bestCenter[0,:].tolist()[0]
  37. centers.append(bestCenter[1,:].tolist()[0])
  38. clusterRes[nonzero(clusterRes[:,0].A == bestCluster)[0],:] = bestClusterResTemp
  39. ##draw results
  40. global flag
  41. for i in xrange(k):
  42. clusterData = data[nonzero(clusterRes[:,0].A==i)[0]]
  43. for j in clusterData:
  44. plt.plot(j[0,0],j[0,1],flag[i])
  45. plt.show()
  46. return mat(centers), clusterRes
  47. if __name__ == '__main__':
  48. data = create()
  49. # print KMeans(mat(data), 4)[0]
  50. print biKmeans(mat(data), 3)[0]

20150913K-means聚类的更多相关文章

  1. 转载 | Python AI 教学│k-means聚类算法及应用

    关注我们的公众号哦!获取更多精彩哦! 1.问题导入 假如有这样一种情况,在一天你想去某个城市旅游,这个城市里你想去的有70个地方,现在你只有每一个地方的地址,这个地址列表很长,有70个位置.事先肯定要 ...

  2. k-means算法Java一维实现

    这里的程序稍微有点变形.k_means方法返回K-means聚类的若干中心点.代码: import java.util.ArrayList; import java.util.Collections; ...

  3. 对于传统scnece-classfication的分析

    BoW模型最初应用于文本处理领域,用来对文档进行分类和识别.BoW 模型因为其简单有效的优点而得到了广泛的应用.其基本原理可以用以下例子来给予描述.给定两句简单的文档: 文档 1:“我喜欢跳舞,小明也 ...

  4. R 语言实战-Part 4 笔记

    R 语言实战(第二版) part 4 高级方法 -------------第13章 广义线性模型------------------ #前面分析了线性模型中的回归和方差分析,前提都是假设因变量服从正态 ...

  5. 软件——机器学习与Python,聚类,K——means

    K-means是一种聚类算法: 这里运用k-means进行31个城市的分类 城市的数据保存在city.txt文件中,内容如下: BJ,2959.19,730.79,749.41,513.34,467. ...

  6. K-means算法

    K-means算法很简单,它属于无监督学习算法中的聚类算法中的一种方法吧,利用欧式距离进行聚合啦. 解决的问题如图所示哈:有一堆没有标签的训练样本,并且它们可以潜在地分为K类,我们怎么把它们划分呢?  ...

  7. K-Means 聚类算法原理分析与代码实现

    前言 在前面的文章中,涉及到的机器学习算法均为监督学习算法. 所谓监督学习,就是有训练过程的学习.再确切点,就是有 "分类标签集" 的学习. 现在开始,将进入到非监督学习领域.从经 ...

  8. [聚类算法] K-means 算法

    聚类 和 k-means简单概括. 聚类是一种 无监督学习 问题,它的目标就是基于 相似度 将相似的子集聚合在一起. k-means算法是聚类分析中使用最广泛的算法之一.它把n个对象根据它们的属性分为 ...

  9. 利用模拟退火提高Kmeans的聚类精度

    http://www.cnblogs.com/LBSer/p/4605904.html Kmeans算法是一种非监督聚类算法,由于原理简单而在业界被广泛使用,一般在实践中遇到聚类问题往往会优先使用Km ...

  10. 转载: scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法

    版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ================== ...

随机推荐

  1. 一些CSS技巧

    1.网页LOGO背景居中 html {   background: #f5f7f9 url(img/logo.png) no-repeat center center fixed;   backgro ...

  2. QTP之对测试用例的自动化过程的分解

    第一部分:自动化一个测试用例 当你要开始自动化一个测试用例的时候,有一些重要的事情需要完成.当你完成所有这些事情的时候,测试脚本的自动化也随之完成. 在这里,我们将首先在大部分的自动化测试用例里找出所 ...

  3. Apache端口配置

    找到配置文件 httpd.conf  并用编辑器打开. 在添加端口之前,我们可以查看端口是否已经被开启,命令如下: window查看端口: # 查看所有端口$ netstat -n -a# 查看 80 ...

  4. Git for windows 中文乱码解决方案

    1.git status时显示乱码,如下: \316\304\261\276\316\304\265\265.txt 解决方案: $ git config --global core.quotepat ...

  5. Awesome Algorithms

    Awesome Algorithms A curated list of awesome places to learn and/or practice algorithms. Inspired by ...

  6. 启动PL/SQL Developer 报字符编码不一致错误 Database character set (AL32UTF8) and Client character set (ZHS16GBK) are different. Character set conversion may cause unexpected results. Note: you can set the client

    今天写hibernate时候遇到一些异常 代码: 出现异常情况: 出现以上原因是Session关闭 如果不是使用的SessionFactory.getSession()来获得Session. 而是使用 ...

  7. 使用Quartz创建定时任务

    项目开发中经常需要定时循环执行某些任务 比如定时发送报表,定时发送邮件,亦或者定时清理缓存,定时更新数据等等 有些时候可以简单地利用Windows Server的计划任务执行程序 Linux也有相应的 ...

  8. POJ 1276 (多重背包) Cash Machine

    题意: 有n种纸币,已知每种纸币的面值和数量,求所能凑成的不超过cash的最大总面值. 分析: 这道题自己写了一下TLE了,好可耻.. 找了份比较简洁的代码抄过来了..poj1276 #include ...

  9. BZOJ_1627_[Usaco2007_Dec]_穿越泥地_(bfs)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1627 网格图,给出起点,终点,障碍,求最短路. 分析 简单的宽搜. #include < ...

  10. POJ 2549 Sumsets

    Sumsets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10593   Accepted: 2890 Descript ...