《机器学习实战》kMeans算法(K均值聚类算法)

机器学习中有两类的大问题,一个是分类,一个是聚类。分类是根据一些给定的已知类别标号的样本,训练某种学习机器,使它能够对未知类别的样本进行分类。这属于supervised learning(监督学习)。而聚类指事先并不知道任何样本的类别标号,希望通过某种算法来把一组未知类别的样本划分成若干类别,这在机器学习中被称作 unsupervised learning (无监督学习)。在本文中,我们关注其中一个比较简单的聚类算法:k-means算法。

k-means算法是一种很常见的聚类算法,它的基本思想是:通过迭代寻找k个聚类的一种划分方案,使得用这k个聚类的均值来代表相应各类样本时所得的总体误差最小。

其Python实现的代码如下:

  1. #encoding:utf-8
  2. from numpy import *
  3. def loadDataSet(filename):
  4. dataMat = []          #创建元祖
  5. fr = open(filename)
  6. for line in fr.readlines():
  7. curLine = line.strip().split("\t")
  8. fltLine = map(float,curLine) #使用map函数将curLine里的数全部转换为float型
  9. dataMat.append(fltLine)
  10. return dataMat
  11. def distEclud(vecA,vecB):          #计算两个向量的欧式距离
  12. return sqrt(sum(power(vecA-vecB,2)))
  13. def randCent(dataSet,k):            #位给定数据集构建一个包含k个随机质心的集合
  14. n = shape(dataSet)[1]   #shape函数此时返回的是dataSet元祖的列数
  15. centroids = mat(zeros((k,n)))       #mat函数创建k行n列的矩阵,centroids存放簇中心
  16. for j in range(n):
  17. minJ = min(dataSet[:,j])           #第j列的最小值
  18. rangeJ = float(max(dataSet[:,j]) - minJ)
  19. centroids[:,j] = minJ + rangeJ * random.rand(k,1)  #random.rand(k,1)产生shape(k,1)的矩阵
  20. return centroids
  21. def kMeans(dataSet,k,disMeas = distEclud,createCent = randCent):
  22. m = shape(dataSet)[0] #shape函数此时返回的是dataSet元祖的行数
  23. clusterAssment = mat(zeros((m,2)))      #创建一个m行2列的矩阵,第一列存放索引值,第二列存放误差,误差用来评价聚类效果
  24. centroids = createCent(dataSet,k)  #创建k个质心,调用createCent()函数
  25. clusterChanged =True #标志变量,若为true则继续迭代
  26. print "质心位置更新过程变化:"
  27. while clusterChanged:
  28. clusterChanged = False
  29. for i in range(m):
  30. minDist = inf #inf为正无穷大
  31. minIndex = -1  #创建索引
  32. for j in range(k):
  33. #寻找最近的质心
  34. disJI = disMeas(centroids[j,:],dataSet[i,:]) #计算每个点到质心的欧氏距离
  35. if disJI(array([0, 0, 1]), array([0, 2, 0]))
  36. #print array(nonzero(b2))
  37. #=>[[0, 0, 1],[0, 2, 0]]
  38. centroids[cent,:] = mean(ptsInClust,axis=0)  #计算所有点的均值,选项axis=0表示沿矩阵的列方向进行均值计算
  39. return centroids,clusterAssment  #返回所有的类质心与点分配结果
  40. datMat = mat(loadDataSet('data.txt'))
  41. myCentroids,clustAssing = kMeans(datMat,2)
  42. print "最终质心:\n",myCentroids
  43. print "索引值和均值:\n",clustAssing

k-means算法比较简单,但也有几个比较大的缺点:
1)k值的选择是用户指定的,不同的k得到的结果会有挺大的不同,如下图所示,左边是k=3的结果,这个就太稀疏了,蓝色的那个簇其实是可以再划分成两个簇的。而右图是k=5的结果,可以看到红色菱形和蓝色菱形这两个簇应该是可以合并成一个簇的:

2)对k个初始质心的选择比较敏感,容易陷入局部最小值。例如,我们上面的算法运行的时候,有可能会得到不同的结果,如下面这两种情况。K-means也是收敛了,只是收敛到了局部最小值:

3)存在局限性,如下面这种非球状的数据分布就搞不定了

4)数据库比较大的时候,收敛会比较慢.

K均值聚类中簇的值k是用户预先定义的一个参数,那么用户如何才能知道k的选择是否正确?如何才能知道生成的簇比较好?在计算的过程中保留了每个点的误差,即该点到簇质心的距离平方值,下面将讨论利用该误差来评价聚类质量好坏的方法,引入度量聚类效果的指标SSE(sum of squared Error,误差平方和),SSE值越小,越接近于他们的质心,聚类效果也越好,有一种可以肯定减小SSE值得方法是增加k的数目,但这个违背了聚类的目标,聚类的目标是在保持簇数目不变的情况下提高簇的质量。

接下来要讨论的是利用簇划分技术得到更好的聚类效果——二分K-均值算法

机器学习中的K-means算法的python实现的更多相关文章

  1. Fuzzy C Means 算法及其 Python 实现——写得很清楚,见原文

    Fuzzy C Means 算法及其 Python 实现 转自:http://note4code.com/2015/04/14/fuzzy-c-means-%E7%AE%97%E6%B3%95%E5% ...

  2. 分类算法——k最近邻算法(Python实现)(文末附工程源代码)

    kNN算法原理 k最近邻(k-Nearest Neighbor)算法是比较简单的机器学习算法.它采用测量不同特征值之间的距离方法进行分类,思想很简单:如果一个样本在特征空间中的k个最近邻(最相似)的样 ...

  3. 机器学习03:K近邻算法

    本文来自同步博客. P.S. 不知道怎么显示数学公式以及排版文章.所以如果觉得文章下面格式乱的话请自行跳转到上述链接.后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱.看原博客地址会有更 ...

  4. 《机器学习实战》-k近邻算法

    目录 K-近邻算法 k-近邻算法概述 解析和导入数据 使用 Python 导入数据 实施 kNN 分类算法 测试分类器 使用 k-近邻算法改进约会网站的配对效果 收集数据 准备数据:使用 Python ...

  5. 02机器学习实战之K近邻算法

    第2章 k-近邻算法 KNN 概述 k-近邻(kNN, k-NearestNeighbor)算法是一种基本分类与回归方法,我们这里只讨论分类问题中的 k-近邻算法. 一句话总结:近朱者赤近墨者黑! k ...

  6. 机器学习:1.K近邻算法

    1.简单案例:预测男女,根据身高,体重,鞋码 import numpy as np import matplotlib import sklearn from skleran.neighbors im ...

  7. 机器学习实战笔记--k近邻算法

    #encoding:utf-8 from numpy import * import operator import matplotlib import matplotlib.pyplot as pl ...

  8. 机器学习随笔01 - k近邻算法

    算法名称: k近邻算法 (kNN: k-Nearest Neighbor) 问题提出: 根据已有对象的归类数据,给新对象(事物)归类. 核心思想: 将对象分解为特征,因为对象的特征决定了事对象的分类. ...

  9. 机器学习基础——简单易懂的K邻近算法,根据邻居“找自己”

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天的文章给大家分享机器学习领域非常简单的模型--KNN,也就是K Nearest Neighbours算法,翻译过来很简单,就是K最近邻居 ...

  10. 机器学习-- 入门demo1 k临近算法

    1.k-近邻法简介 k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法. 它的工作原理是:存在一个样本数据集合,也称作为 ...

随机推荐

  1. 小程序 for循环 报错 Cannot read property 'total' of undefined

    for循环一直报错  Cannot read property 'total' of undefined,但total在起初是有定义的,后来找到了问题,是i<=的问题,改为<不报错了. i ...

  2. NOIP2015 D2T3 洛谷2680 BZOJ4326 运输计划 解题报告

    前言:个人认为这是历年NOIP中比较简单的最后一题了,因此将自己的思路与大家分享. 题目大意: 给一棵无根树,给出m条路径.允许将树上的一条边的权值改为0.求m条路径长度最大值的最小值.n,m< ...

  3. 利用CVE-2017-11882拿到持久性shell

    利用CVE-2017-11882拿到持久性shell 近日微软又爆出一个严重漏洞,利用该漏洞可以直接拿到目标机shell.这么好玩的东西怎么能错过了,于是搭建环境复现了一把. 首先去GitHub上下载 ...

  4. smoking的安装和配置

    yum install -y perl perl-Net-Telnet perl-Net-DNS perl-LDAP perl-libwww-perl perl-IO-Socket-SSL perl- ...

  5. OpenStack中的rabbitmq的配置方法

    OpenStack中的rabbitmq的配置方法 author:headsen chen   2017-10-11  17:24:58 个人原创,允许转载,转载请注明作者,出处,否则依法追究法律责任 ...

  6. 第三方工具 - echarts中 设置x||y轴文案、提示文字等为固定字数,超出显示"..."

    起初看到这种需求的时候,我是这个状态 对,我是拒绝的,人家echats画出来就是一个canvas,你让我怎么加... 但是,作为一个"有点追求的"前端,我得想招试试总结下来,唯一的 ...

  7. ssh 提示Connection closed by * 的解决方案

    使用ssh方式连接linux系统时,发现一直上报这个错误: Connection closed by 192.168.3.71 port 22 刚开始还以为是端口被防火墙禁止了呢,通过关闭和查看,并没 ...

  8. SpringBoot 自定义Banner

    在2016年的最后一天,借用Spring Boot的Banner向各位程序猿同仁们问候一声:Happy New Year. 接下来我们就来介绍一下这个轻松愉快的自定义banner功能.实现的方式非常简 ...

  9. 设计模式 --> (5)适配器模式

    适配器模式 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作.比如说我的hp笔记本,美国产品,人家美国的电压是110V的,而我们中国的 ...

  10. JQuery代码实现上拉加载(不使用插件)

    <script type="text/javascript"> $(window).scroll(function() { //已经滚动到上面的页面高度 var sl_ ...