一、算法介绍

K-means算法是最简单的也是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。算法的目的是使各个样本与所在均值的误差平方和达到最小(这也是评价K-means算法最后聚类效果的评价标准)

这里小编给大家推荐两个不错的学习链接:

网易公开课

博客

二、算法步骤解析


我们以二维点集为例:
  1. 从平面中随机选取K个点作为初始聚类中心,我们的目的是将给定的所有点集分成K类:
  2. 计算每个点到初始聚类中心的距离,并选择距离最近的归为其类;
  3. 所有点归完类后,计算每一类的质心,并求出每一类的质心与上一级的聚类中心的偏移量是否都小于给定的阈值(临界值);
  4. 若不满足则将求出的质心取代上一级聚类中心并迭代(循环)二三步骤,直到满足条件,迭代终止;
*总结就是这十四个字:求距归类,质心替聚心,最后看偏移。

三、代码实践

  • 代码中我们用正太分布来随机取点,最后一图的形式直观显示给大家看,所以我们需先引入一些模块;
import numpy
import random
import pylab as pl
  • 为求两点间距,定义一个函数;
 def cal_distance(a, b):                                #计算两点的距离
return (a[0]- b[0]) ** 2 + (a[1] - b[1]) **2
  • 我们给出三个正太分布的数据,各200个,并用列表a,b来存放;
x1 = numpy.round(numpy.random.normal(115, 10, 200),2)
y1 = numpy.round(numpy.random.normal(95, 4,200),2)
x2 = numpy.round(numpy.random.normal(100, 10, 200),2)
y2 = numpy.round(numpy.random.normal(70, 3, 200),2)
x3 = numpy.round(numpy.random.normal(150,9 , 200),2)
y3 = numpy.round(numpy.random.normal(72, 4, 200),2) a = []
b = []
for i in range(200):
a.append(x1[i])
b.append(y1[i])
for i in range(200):
a.append(x2[i])
b.append(y2[i])
for i in range(200):
a.append(x3[i])
b.append(y3[i])
  • 我们先来直观看看未分类的图像是什么样的;
    pl.figure(1)
    pl.plot(a,b,'o')
    pl.title('the initial map')

  • 按照我们说的十四字步骤,我们的代码如下;
k1 = [ random.randint(85,145) for _ in range(2)]          #任选三个为聚类中心
k2 = [ random.randint(70,150) for _ in range(2)]
k3 = [ random.randint(50,150) for _ in range(2)] clu_k1 = [] #划分三个聚类
clu_k2 = []
clu_k3 = []

while True:
clu_k1 = []
clu_k2 = []
clu_k3 = []
for i in range(600):
ab_distance1 = cal_distance(k1, [a[i], b[i]])
ab_distance2 = cal_distance(k2, [a[i], b[i]]) #计算每个样本到聚类中心的距离
ab_distance3 = cal_distance(k3, [a[i], b[i]])
if (ab_distance1 <= ab_distance2 and ab_distance1 <= ab_distance3):
clu_k1.append(i)
elif (ab_distance2 <= ab_distance1 and ab_distance2 <= ab_distance3):
clu_k2.append(i) #每个样本归于更近的聚类中心
elif (ab_distance3 <= ab_distance1 and ab_distance3 <= ab_distance2):
clu_k3.append(i)
k1_x = sum([a[i] for i in clu_k1]) / len(clu_k1) #每类样本计算质心并使之成为新的聚类中心
k1_y = sum([b[i] for i in clu_k1]) / len(clu_k1) k2_x = sum([a[i] for i in clu_k2]) / len(clu_k2)
k2_y = sum([b[i] for i in clu_k2]) / len(clu_k2) k3_x = sum([a[i] for i in clu_k3]) / len(clu_k3)
k3_y = sum([b[i] for i in clu_k3]) / len(clu_k3) k1_dis=cal_distance(k1, [k1_x, k1_y])
k2_dis=cal_distance(k2, [k2_x, k2_y])
k3_dis=cal_distance(k3, [k3_x, k3_y]) if k1_dis>0.1 or k2_dis>0.1 or k3_dis>0.1: #判断新聚类中心与上一个聚类中心的偏移量是否为0
k1 = [k1_x, k1_y]
k2 = [k2_x, k2_y]
k3 = [k3_x, k3_y] #偏移量大于0.1,则求出的质心取代原来的聚类中心
else:
break #偏移量小于等于0.1,迭代终止

kv1_x = [a[i] for i in clu_k1]                         #迭代终止后将同一类的点x,y分别以列表形式存放
kv1_y = [b[i] for i in clu_k1] kv2_x = [a[i] for i in clu_k2]
kv2_y = [b[i] for i in clu_k2] kv3_x = [a[i] for i in clu_k3]
kv3_y = [b[i] for i in clu_k3]
  • 完成迭代后,我们再以图的形式直观显示出来
pl.figure(2)
pl.title('the altered map')
pl.plot(kv1_x,kv1_y,'*')
pl.plot(kv2_x,kv2_y,'s')
pl.plot(kv3_x,kv3_y,'o')
pl.xlabel('X')
pl.ylabel('Y')
pl.show()



四、算法局限性

  1. 上面所举的代码中,k=3,如果我们设k=4,5,6….,结果会有挺大的不同;
  2. 对k个初始质心的选择是随机的,容易陷入局部最小值;
  3. 数据库比较大的时候,收敛会比较慢;
  4. 不是所有的数据分布都能搞定;

python机器学习(1:K_means聚类算法)的更多相关文章

  1. 【Python机器学习实战】聚类算法(1)——K-Means聚类

    实战部分主要针对某一具体算法对其原理进行较为详细的介绍,然后进行简单地实现(可能对算法性能考虑欠缺),这一部分主要介绍一些常见的一些聚类算法. K-means聚类算法 0.聚类算法算法简介 聚类算法算 ...

  2. 【Python机器学习实战】聚类算法(2)——层次聚类(HAC)和DBSCAN

    层次聚类和DBSCAN 前面说到K-means聚类算法,K-Means聚类是一种分散性聚类算法,本节主要是基于数据结构的聚类算法--层次聚类和基于密度的聚类算法--DBSCAN两种算法. 1.层次聚类 ...

  3. Python实现 K_Means聚类算法

    使用 Python实现 K_Means聚类算法: 问题定义 聚类问题是数据挖掘的基本问题,它的本质是将n个数据对象划分为 k个聚类,以便使得所获得的聚类满足以下条件: 同一聚类中的数据对象相似度较高 ...

  4. python机器学习笔记:EM算法

    EM算法也称期望最大化(Expectation-Maximum,简称EM)算法,它是一个基础算法,是很多机器学习领域的基础,比如隐式马尔科夫算法(HMM),LDA主题模型的变分推断算法等等.本文对于E ...

  5. 机器学习六--K-means聚类算法

    机器学习六--K-means聚类算法 想想常见的分类算法有决策树.Logistic回归.SVM.贝叶斯等.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别 ...

  6. Python机器学习笔记 K-近邻算法

    K近邻(KNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一. 所谓K最近邻,就是K个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表.KNN算法的 ...

  7. 机器学习sklearn19.0聚类算法——Kmeans算法

    一.关于聚类及相似度.距离的知识点 二.k-means算法思想与流程 三.sklearn中对于kmeans算法的参数 四.代码示例以及应用的知识点简介 (1)make_blobs:聚类数据生成器 sk ...

  8. 机器学习:K-Means聚类算法

    本文来自同步博客. 前面几篇文章介绍了回归或分类的几个算法,它们的共同点是训练数据包含了输出结果,要求算法能够通过训练数据掌握规律,用于预测新输入数据的输出值.因此,回归算法或分类算法被称之为监督学习 ...

  9. Python机器学习笔记:K-Means算法,DBSCAN算法

    K-Means算法 K-Means 算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛.K-Means 算法有大量的变体,本文就从最传统的K-Means算法学起,在其基础上学习 ...

随机推荐

  1. Python MySQL 创建表

    章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...

  2. CodeForces - 404B Marathon(精度)

    题意:一个人绕着一个长度为a的正方形逆时针跑,以(0,0)为起点,喝一次水可以跑d米,问每喝一次水可以跑到的位置坐标. 分析:这道题卡精度卡的太厉害了. 设l是正方形的周长,只有d对l取余且每次跑d米 ...

  3. web.xml中filter加载顺序出现的问题

    刚刚遇到了一个问题,项目中需要用到characterEncodingFilter和HiddenHttpMethodFilter,但是post请求还是会中文乱码,找了半天原因,后来发现,filter加载 ...

  4. UITextFeild的基本属性

    textField 基本属性   _textField.frame = CGRectMake(0, 0, 200, 50); _textField.delegate = self; _textFiel ...

  5. 利用IIS6提权获得管理员权限

    IIS6也是一个比较古老的提权EXP了,是通过利用WMI的权限来执行命令. 目标机:漏洞巨多的Win2003 下面说一下通过IIS6在已用菜刀连接上的服务器上运用IIS6获得管理员权限的过程. 1.将 ...

  6. pyCharm中设置查看运行过程中的变量实时情况

    1.点击运行栏的这个灰色向下剪头: 2.单击“Edit Configurations”, 3.在出现的窗口上,勾选上:“Show command line afterwards” 或 “run wit ...

  7. 吴裕雄--天生自然 PHP开发学习:字符串变量

    <?php $txt="Hello world!"; echo $txt; ?> <?php $txt1="Hello world!"; $t ...

  8. SUCTF 2019-EasySQL

    0x00 知识点: 1:堆叠注入 2:sql_mode : 它定义了 MySQL 应支持的 SQL 语法,以及应该在数据上执行何种确认检查,其中的 PIPES_AS_CONCAT 将 || 视为字符串 ...

  9. VC6.0 The value of ESP was not properly saved across a function call 错误解决方法

    调用DLL函数,出现错误 Run-Time Check Failure #0 - The value of ESP was not properly saved across a function c ...

  10. DRF项目之JWT认证方式的简介及使用

    什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ...