聚类介绍

聚类在机器学习,数据挖掘,模式识别,图像分析以及生物信息等领域有广泛的应用。聚类是把相似的对象通过静态分类的方法分成不同的组别或者更多的子集(subset),这样让在同一个子集中的成员对象都有相似的一些属性,常见的包括在坐标系中更加短的空间距离(一般是欧式距离)等。

聚类的应用

在商务上,聚类能帮助市场分析人员从客户基本库中发现不同的客户群,并且用购买模式来刻画不同的客户群的特征。在生物学上,聚类能用于推导植物和动物的分类,对基因进行分类,获得对种群中固有结构的认识。聚类在地球观测数据库中相似地区的确定,汽车保险单持有者的分组,及根据房子的类型、价值和地理位置对一个城市中房屋的分组上也可以发挥作用。聚类也能用于对Web上的文档进行分类,以发现信息。诸如此类,聚类有着广泛的实际应用。

K-Means聚类算法简介

K-Means是发现给定数据集的 K 个簇的聚类算法, 之所以称之为 K-均值是因为它可以发现 K 个不同的簇, 且每个簇的中心采用簇中所含值的均值计算而成。簇个数 K 是用户指定的, 每一个簇通过其质心(centroid), 即簇中所有点的中心来描述。聚类与分类算法的最大区别在于, 分类的目标类别已知, 而聚类的目标类别是未知的。

K-Means聚类算法步骤

K-Means聚类步骤是一个循环迭代的算法,具体·步骤如下:

  • 1、先随机选取K个对象作为初始的聚类中心,随机选择K个初始中心点;
  • 2、计算每个对象与各个种子聚类中心之间的距离,按照距离初始中心点最小的原则,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。
  • 3、一旦全部对象都被分配了,每个聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是以下任何一个:

1)没有(或最小数目)对象被重新分配给不同的聚类。
2)没有(或最小数目)聚类中心再发生变化。
3)误差平方和局部最小。

因此得到相互分离的球状聚类,在这些聚类中,均值点趋向收敛于聚类中心。 一般会希望得到的聚类大小大致相当,这样把每个观测都分配到离它最近的聚类中心(即均值点)就是比较正确的分配方案。

K-Means的数学描述

聚类是把相似的物体聚在一起,这个相似度(或称距离)是用欧氏距离来衡量的。

给定两个样本 X=(x1,x2,...,xn)X=(x_{1},x_{2},...,x_{n})X=(x1​,x2​,...,xn​) 与 Y=(y1,y2,...,yn)Y=(y_{1},y_{2},...,y_{n})Y=(y1​,y2​,...,yn​) ,其中n表示特征数 ,X和Y两个向量间的欧氏距离(Euclidean Distance)表示为:

disted(X,Y)=∣∣X−Y∣∣2=(x1−y1)2+...+(xn−yn)22dist_{ed}(X,Y)=||X-Y||{2}=\sqrt[2]{(x_{1}-y_{1})^{2}+...+(x_{n}-y_{n})^{2}} disted​(X,Y)=∣∣X−Y∣∣2=2(x1​−y1​)2+...+(xn​−yn​)2​

k-means算法是把数据给分成不同的簇,目标是同一个簇中的差异小,不同簇之间的差异大,这个目标怎么用数学语言描述呢?我们一般用误差平方和作为目标函数(想想线性回归中说过的残差平方和、损失函数,是不是很相似),公式如下:

SSE=∑i=1K∑x∈Ci(Ci−x)2SSE=\sum_{i=1}^{K} \sum_{x \in C_{i}}\left(C_{i}-x\right)^{2} SSE=i=1∑K​x∈Ci​∑​(Ci​−x)2

其中C表示聚类中心,如果x属于CiC_{i}Ci​这个簇,则计算两者的欧式距离,将所有样本点到其中心点距离算出来,并加总,就是k-means的目标函数。实现同一个簇中的样本差异小,就是最小化SSE。

可以通过求导来求函数的极值,我们对SSE求偏导看看能得到什么结果:

∂∂CkSSE=∂∂Ck∑i=1K∑x∈Ci(Ci−x)2=∑i=1K∑x∈Ci∂∂Ck(Ci−x)2=∑x∈Ci2(Ci−x)=0\begin{aligned} \frac{\partial}{\partial C_{k}} S S E &=\frac{\partial}{\partial C_{k}} \sum_{i=1}^{K} \sum_{x \in C_{i}}\left(C_{i}-x\right)^{2} \\ &=\sum_{i=1}^{K} \sum_{x \in C_{i}} \frac{\partial}{\partial C_{k}}\left(C_{i}-x\right)^{2} \\ &=\sum_{x \in C_{i}} 2\left(C_{i}-x\right)=0 \end{aligned} ∂Ck​∂​SSE​=∂Ck​∂​i=1∑K​x∈Ci​∑​(Ci​−x)2=i=1∑K​x∈Ci​∑​∂Ck​∂​(Ci​−x)2=x∈Ci​∑​2(Ci​−x)=0​

∑x∈Ci2(Ci−x)=0⇒miCi=∑x∈Cix⇒Ci=1mi∑x∈Cix\sum_{x \in C_{i}} 2\left(C_{i}-x\right)=0 \Rightarrow m_{i} C_{i}=\sum_{x \in C_{i}} x \Rightarrow C_{i}=\frac{1}{m_{i}} \sum_{x \in C_{i}} x x∈Ci​∑​2(Ci​−x)=0⇒mi​Ci​=x∈Ci​∑​x⇒Ci​=mi​1​x∈Ci​∑​x

式中m是簇中点的数量,发现了没有,这个C的解,就是X的均值点。多点的均值点应该很好理解吧,给定一组点 X1,...,XmX_{1},...,X_{m}X1​,...,Xm​ ,其中 Xi=(xi1,xi2,...,xin)X_{i}=(x_{i1},x_{i2},...,x_{in})Xi​=(xi1​,xi2​,...,xin​) ,这组点的均值向量表示为:

C=(x11+...+x1nm,...,xm1+...+xmnm)C=(\frac{x_{11}+...+x_{1n}}{m},...,\frac{x_{m1}+...+x_{mn}}{m}) C=(mx11​+...+x1n​​,...,mxm1​+...+xmn​​)

K-Means伪代码

function K-Means(输入数据,中心点个数K)获取输入数据的维度Dim和个数N随机生成K个Dim维的点while(算法未收敛)对N个点:计算每个点属于哪一类。对于K个中心点:1,找出所有属于自己这一类的所有数据点2,把自己的坐标修改为这些数据点的中心点坐标end输出结果:
end

K-Means优缺点

优点:

  • 属于无监督学习,无须准备训练集
  • 原理简单,实现起来较为容易
  • 结果可解释性较好

缺点:

  • 聚类数目k是一个输入参数。选择不恰当的k值可能会导致糟糕的聚类结果。这也是为什么要进行特征检查来决定数据集的聚类数目了。
  • 可能收敛到局部最小值, 在大规模数据集上收敛较慢
  • 对于异常点、离群点敏感

K-Means算法实现

from collections import defaultdict
from random import uniform
from math import sqrtdef point_avg(points):"""Accepts a list of points, each with the same number of dimensions.NB. points can have more dimensions than 2Returns a new point which is the center of all the points."""dimensions = len(points[0])new_center = []for dimension in xrange(dimensions):dim_sum = 0  # dimension sumfor p in points:dim_sum += p[dimension]# average of each dimensionnew_center.append(dim_sum / float(len(points)))return new_centerdef update_centers(data_set, assignments):"""Accepts a dataset and a list of assignments; the indexes of both lists correspond to each other.Compute the center for each of the assigned groups.Return `k` centers where `k` is the number of unique assignments."""new_means = defaultdict(list)centers = []for assignment, point in zip(assignments, data_set):new_means[assignment].append(point)for points in new_means.itervalues():centers.append(point_avg(points))return centersdef assign_points(data_points, centers):"""Given a data set and a list of points betweeen other points,assign each point to an index that corresponds to the indexof the center point on it's proximity to that point. Return a an array of indexes of centers that correspond toan index in the data set; that is, if there are N pointsin `data_set` the list we return will have N elements. AlsoIf there are Y points in `centers` there will be Y uniquepossible values within the returned list."""assignments = []for point in data_points:shortest = ()  # positive infinityshortest_index = 0for i in xrange(len(centers)):val = distance(point, centers[i])if val < shortest:shortest = valshortest_index = iassignments.append(shortest_index)return assignmentsdef distance(a, b):""""""dimensions = len(a)_sum = 0for dimension in xrange(dimensions):difference_sq = (a[dimension] - b[dimension]) ** 2_sum += difference_sqreturn sqrt(_sum)def generate_k(data_set, k):"""Given `data_set`, which is an array of arrays,find the minimum and maximum for each coordinate, a range.Generate `k` random points between the ranges.Return an array of the random points within the ranges."""centers = []dimensions = len(data_set[0])min_max = defaultdict(int)for point in data_set:for i in xrange(dimensions):val = point[i]min_key = 'min_%d' % imax_key = 'max_%d' % iif min_key not in min_max or val < min_max[min_key]:min_max[min_key] = valif max_key not in min_max or val > min_max[max_key]:min_max[max_key] = valfor _k in xrange(k):rand_point = []for i in xrange(dimensions):min_val = min_max['min_%d' % i]max_val = min_max['max_%d' % i]rand_point.append(uniform(min_val, max_val))centers.append(rand_point)return centersdef k_means(dataset, k):k_points = generate_k(dataset, k)assignments = assign_points(dataset, k_points)old_assignments = Nonewhile assignments != old_assignments:new_centers = update_centers(dataset, assignments)old_assignments = assignmentsassignments = assign_points(dataset, new_centers)return zip(assignments, dataset)# points = [
#     [1, 2],
#     [2, 1],
#     [3, 1],
#     [5, 4],
#     [5, 5],
#     [6, 5],
#     [10, 8],
#     [7, 9],
#     [11, 5],
#     [14, 9],
#     [14, 14],
#     ]
# print k_means(points, 3)

参考文献

https://zhuanlan.zhihu.com/p/75477709

机器学习十大经典算法之K-Means聚类算法相关推荐

  1. 机器学习十大经典算法之岭回归和LASSO回归

    机器学习十大经典算法之岭回归和LASSO回归(学习笔记整理:https://blog.csdn.net/weixin_43374551/article/details/83688913

  2. 机器学习十大经典算法:深入浅出聊贝叶斯决策(贝叶斯公式,最小风险贝叶斯,最小错误贝叶斯)

    前言    常听人说,在学习一个东西时,如果能够深入浅出的讲给别人听,才算是真的懂了.最近正好在学模式识别,于是就用它来练笔了.贝叶斯决策(Bayes Decision) 是十大经典机器学习算法之一, ...

  3. pagerank数据集_机器学习十大经典算法-PageRank(附实践代码)

    Yo, yo, check it out. 保证看完不晕倒... 如果公式让你脑瓜疼,请忽略公式,或者忽略脑瓜. Kagging咖金:推荐系统之关联规则(附实践代码)​zhuanlan.zhihu.c ...

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

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

  5. pythonk均值实现_python实现k均值算法示例(k均值聚类算法)

    简易完成平面图的点K平均值剖析,应用欧几里得间距,并且用pylab展现. 编码以下: import pylab as pl #calc Euclid squire def calc_e_squire( ...

  6. 机器学习十大经典算法之决策树

    机器学习经典十大算法 机器学习/人工智能的子领域在过去几年越来越受欢迎.目前大数据在科技行业已经炙手可热,而基于大量数据来进行预测或者得出建议的机器学习无疑是非常强大的.一些最常见的机器学习例子,比如 ...

  7. 机器学习十大经典算法

    本文介绍了机器学习新手需要了解的 10 大算法,包括线性回归.Logistic 回归.朴素贝叶斯.K 近邻算法等. 在机器学习中,有一种叫做「没有免费的午餐」的定理.简而言之,它指出没有任何一种算法对 ...

  8. 机器学习十大经典算法之朴素贝叶斯分类

    贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类.而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法. 分类问题 从数学角度来说,分类问题可做如下定义:已 ...

  9. k means聚类算法_一文读懂K-means聚类算法

    1.引言 什么是聚类?我们通常说,机器学习任务可以分为两类,一类是监督学习,一类是无监督学习.监督学习:训练集有明确标签,监督学习就是寻找问题(又称输入.特征.自变量)与标签(又称输出.目标.因变量) ...

最新文章

  1. 增强现实系统的三大关键技术是什么?
  2. Java分布式内存开源实现:Hazelcast
  3. 什么叫“碳达峰、碳中和”?一副漫画看明白
  4. Unity C# namespace 命名空间的使用
  5. 如何提高安卓代码的质量和语法
  6. 这是80%的程序员都看过的python教程,你掌握了么?
  7. python亿级mysql数据库导出_Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法...
  8. 【统计学】10个必知必会的统计学问题 (附答案)
  9. 锁失效_分布式锁的解决方案(二)
  10. linux awk使用详解
  11. Spring Cloud Alibaba Nacos之服务配置中心
  12. mix2线刷开发板救砖_小米小米Mix 2手机快速救砖,线刷教程分享,小白轻松救活手机...
  13. 计算机联锁图册计算公式,计算机联锁图册认识文档
  14. linux 有道 离线词典,180720_有道词典离线增强版添加词库(小众知识)
  15. 中青杯数学建模竞赛是什么级别的比赛_2020年第三届中青杯全国大学生数学建模竞赛...
  16. python开发cms企业官网用python php_基于Django的Python CMS
  17. 全球及中国回转窑扫描仪行业发展动态与前景趋势预测报告2022-2028年
  18. PC端浏览器启动本地应用
  19. equals == equals(null) ==null区别
  20. PS里面的快速选区工具

热门文章

  1. php(2)—基础补充
  2. sparkUI使用与扩展
  3. 安卓开发1-质量管理app-技术预演
  4. 说说我在项目中为什么不用实体框架,如果说我在诋毁你所爱的EF,请进来.
  5. iPhone开发经典语录
  6. 浅析Lambda 表达式
  7. 移位运算符 实现 二进制数的 高低位翻转(完整逻辑代码)
  8. 二叉树——求先序排列(洛谷 P1030)
  9. 数组——询问学号(洛谷 P3156)
  10. 基于ubuntu18.04使用 Azure Kinect 传感器 SDK 录制