K-means聚类算法

算法优缺点:

优点:容易实现
缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢
使用数据类型:数值型数据

算法思想

k-means算法实际上就是通过计算不同样本间的距离来判断他们的相近关系的,相近的就会放到同一个类别中去。

1.首先我们需要选择一个k值,也就是我们希望把数据分成多少类,这里k值的选择对结果的影响很大,Ng的课说的选择方法有两种一种是elbow method,简单的说就是根据聚类的结果和k的函数关系判断k为多少的时候效果最好。另一种则是根据具体的需求确定,比如说进行衬衫尺寸的聚类你可能就会考虑分成三类(L,M,S)等

2.然后我们需要选择最初的聚类点(或者叫质心),这里的选择一般是随机选择的,代码中的是在数据范围内随机选择,另一种是随机选择数据中的点。这些点的选择会很大程度上影响到最终的结果,也就是说运气不好的话就到局部最小值去了。这里有两种处理方法,一种是多次取均值,另一种则是后面的改进算法(bisecting K-means)

3.终于我们开始进入正题了,接下来我们会把数据集中所有的点都计算下与这些质心的距离,把它们分到离它们质心最近的那一类中去。完成后我们则需要将每个簇算出平均值,用这个点作为新的质心。反复重复这两步,直到收敛我们就得到了最终的结果。

函数

loadDataSet(fileName)
从文件中读取数据集
distEclud(vecA, vecB)
计算距离,这里用的是欧氏距离,当然其他合理的距离都是可以的
randCent(dataSet, k)
随机生成初始的质心,这里是虽具选取数据范围内的点
kMeans(dataSet, k, distMeas=distEclud, createCent=randCent)
kmeans算法,输入数据和k值。后面两个事可选的距离计算方式和初始质心的选择方式
show(dataSet, k, centroids, clusterAssment)
可视化结果

    1. #coding=utf-
    2. from numpy import *
    3.  
    4. def loadDataSet(fileName):
    5. dataMat = []
    6. fr = open(fileName)
    7. for line in fr.readlines():
    8. curLine = line.strip().split('\t')
    9. fltLine = map(float, curLine)
    10. dataMat.append(fltLine)
    11. return dataMat
    12.  
    13. #计算两个向量的距离,用的是欧几里得距离
    14. def distEclud(vecA, vecB):
    15. return sqrt(sum(power(vecA - vecB, )))
    16.  
    17. #随机生成初始的质心(ng的课说的初始方式是随机选K个点)
    18. def randCent(dataSet, k):
    19. n = shape(dataSet)[]
    20. centroids = mat(zeros((k,n)))
    21. for j in range(n):
    22. minJ = min(dataSet[:,j])
    23. rangeJ = float(max(array(dataSet)[:,j]) - minJ)
    24. centroids[:,j] = minJ + rangeJ * random.rand(k,)
    25. return centroids
    26.  
    27. def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
    28. m = shape(dataSet)[]
    29. clusterAssment = mat(zeros((m,)))#create mat to assign data points
    30. #to a centroid, also holds SE of each point
    31. centroids = createCent(dataSet, k)
    32. clusterChanged = True
    33. while clusterChanged:
    34. clusterChanged = False
    35. for i in range(m):#for each data point assign it to the closest centroid
    36. minDist = inf
    37. minIndex = -
    38. for j in range(k):
    39. distJI = distMeas(centroids[j,:],dataSet[i,:])
    40. if distJI < minDist:
    41. minDist = distJI; minIndex = j
    42. if clusterAssment[i,] != minIndex:
    43. clusterChanged = True
    44. clusterAssment[i,:] = minIndex,minDist**
    45. print centroids
    46. for cent in range(k):#recalculate centroids
    47. ptsInClust = dataSet[nonzero(clusterAssment[:,].A==cent)[]]#get all the point in this cluster
    48. centroids[cent,:] = mean(ptsInClust, axis=) #assign centroid to mean
    49. return centroids, clusterAssment
    50.  
    51. def show(dataSet, k, centroids, clusterAssment):
    52. from matplotlib import pyplot as plt
    53. numSamples, dim = dataSet.shape
    54. mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr']
    55. for i in xrange(numSamples):
    56. markIndex = int(clusterAssment[i, ])
    57. plt.plot(dataSet[i, ], dataSet[i, ], mark[markIndex])
    58. mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '<b', 'pb']
    59. for i in range(k):
    60. plt.plot(centroids[i, ], centroids[i, ], mark[i], markersize = )
    61. plt.show()
    62.  
    63. def main():
    64. dataMat = mat(loadDataSet('testSet.txt'))
    65. myCentroids, clustAssing= kMeans(dataMat,)
    66. print myCentroids
    67. show(dataMat, , myCentroids, clustAssing)
    68.  
    69. if __name__ == '__main__':
    70. main()
这里是聚类结果,还是很不错的啦
但是有时候也会收敛到局部最小值,就像下面这样,就是不幸收敛到局部最优了
 
 
 

机器学习笔记索引

k-means聚类算法python实现的更多相关文章

  1. k均值聚类算法原理和(TensorFlow)实现

    顾名思义,k均值聚类是一种对数据进行聚类的技术,即将数据分割成指定数量的几个类,揭示数据的内在性质及规律. 我们知道,在机器学习中,有三种不同的学习模式:监督学习.无监督学习和强化学习: 监督学习,也 ...

  2. K均值聚类算法

    k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个 ...

  3. 机器学习实战---K均值聚类算法

    一:一般K均值聚类算法实现 (一)导入数据 import numpy as np import matplotlib.pyplot as plt def loadDataSet(filename): ...

  4. 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)

    其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...

  5. K均值聚类算法的MATLAB实现

    1.K-均值聚类法的概述    之前在参加数学建模的过程中用到过这种聚类方法,但是当时只是简单知道了在matlab中如何调用工具箱进行聚类,并不是特别清楚它的原理.最近因为在学模式识别,又重新接触了这 ...

  6. (数据科学学习手札09)系统聚类算法Python与R的比较

    上一篇笔者以自己编写代码的方式实现了重心法下的系统聚类(又称层次聚类)算法,通过与Scipy和R中各自自带的系统聚类方法进行比较,显然这些权威的快捷方法更为高效,那么本篇就系统地介绍一下Python与 ...

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

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

  8. K-means聚类算法及python代码实现

    K-means聚类算法(事先数据并没有类别之分!所有的数据都是一样的) 1.概述 K-means算法是集简单和经典于一身的基于距离的聚类算法 采用距离作为相似性的评价指标,即认为两个对象的距离越近,其 ...

  9. 【机器学习】:Kmeans均值聚类算法原理(附带Python代码实现)

    这个算法中文名为k均值聚类算法,首先我们在二维的特殊条件下讨论其实现的过程,方便大家理解. 第一步.随机生成质心 由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给 ...

随机推荐

  1. iOS多线程的详情使用示例--简进祥

    大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能 ...

  2. VOC2007检测任务的评估标准

    VOC2007数据集使用mAP值作为检测算法检测结果的性能评估得分.mAP意思是mean Average Precision,Precision是指精度,Average Precision是指11个等 ...

  3. winston写日志(译)

    使用 有两种方式去使用winston,直接通过默认的logger,或者实例化自己的Logger,前者设计的目的是在你的应用程序中共享logger比较方便. 使用默认Logger 使用默认的logger ...

  4. jquery,php之间的ajax关系以及json

    1.最简介写法 function AjaxDepotGoods(id){ $.ajax({ url:"{:U('stock/depot_goods')}", success:fun ...

  5. ecshop后台权限审核列表

    1.权限语言包 languages\zh_cn\admin\priv_action.php //微仓 $_LANG['depot'] = '微仓管理'; $_LANG['depot_list_is_c ...

  6. [小程序]那些icons

    摘要 为了提供更友好的提示信息,会使用icon+信息的方式,向用户提示当前操作的成功,失败或者一些警告信息.小程序也为我们定义了一些icons,足够大部分情况的使用了. 那些icons 我们新建一个名 ...

  7. javascript数据结构与算法--链表

    链表与数组的区别?  1. 定义: 数组又叫做顺序表,顺序表是在内存中开辟一段连续的空间来存储数据,数组可以处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小. ...

  8. Excel 自动更正

    当有复杂的字段需要重复填写怎么办呢,比如××银行卡号,××电话号码,××公司地址等.可以使用excel的"自动更正"功能解决. 1. Excel 2010的自动更正选项在哪里呢 2 ...

  9. python解析git log后生成页面显示git更新日志信息

    使用git log可以查到git上项目的更新日志. 如下两个git项目,我想把git的日志信息解析成一个便于在浏览器上查看的页面. https://github.com/gityf/lua https ...

  10. jquery 扩展插件方法

    分析插件jquery.countdown.js (function($) { $.fn.countdown = function(options) { // default options var d ...