一.聚类算法的简介

对于"监督学习"(supervised learning),其训练样本是带有标记信息的,并且监督学习的目的是:对带有标记的数据集进行模型学习,从而便于对新的样本进行分类。而在“无监督学习”(unsupervised learning)中,训练样本的标记信息是未知的,目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律,为进一步的数据分析提供基础。对于无监督学习,应用最广的便是"聚类"(clustering)。
        "聚类算法"试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个“簇”(cluster),通过这样的划分,每个簇可能对应于一些潜在的概念或类别。
        我们可以通过下面这个图来理解:

        上图是未做标记的样本集,通过他们的分布,我们很容易对上图中的样本做出以下几种划分。
                当需要将其划分为两个簇时,即 k=2时:

        当需要将其划分为四个簇时,即 k=4 时:

二.K-means聚类算法

kmeans算法又名k均值算法,K-means算法中的k表示的是聚类为k个簇,means代表取每一个聚类中数据值的均值作为该簇的中心,或者称为质心,即用每一个的类的质心对该簇进行描述。
        其算法思想大致为:先从样本集中随机选取 k个样本作为簇中心,并计算所有样本与这 k个“簇中心”的距离,对于每一个样本,将其划分到与其距离最近的“簇中心”所在的簇中,对于新的簇计算各个簇的新的“簇中心”。
        根据以上描述,我们大致可以猜测到实现kmeans算法的主要四点:
          (1)簇个数 k 的选择
          (2)各个样本点到“簇中心”的距离
          (3)根据新划分的簇,更新“簇中心”
          (4)重复上述2、3过程,直至"簇中心"没有移动
        优缺点:

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

三.K-means算法步骤详解

Step1.K值的选择

k 的选择一般是按照实际需求进行决定,或在实现算法时直接给定 k 值。

说明:
A.质心数量由用户给出,记为k,k-means最终得到的簇数量也是k
B.后来每次更新的质心的个数都和初始k值相等
C.k-means最后聚类的簇个数和用户指定的质心个数相等,一个质心对应一个簇,每个样本只聚类到一个簇里面
D.初始簇为空

Step2.距离度量

将对象点分到距离聚类中心最近的那个簇中需要最近邻的度量策略,在欧式空间中采用的是欧式距离,在处理文档中采用的是余弦相似度函数,有时候也采用曼哈顿距离作为度量,不同的情况实用的度量公式是不同的。

2.1.欧式距离

2.2.曼哈顿距离

2.3.余弦相似度

A与B表示向量(x1,y1),(x2,y2)
        分子为A与B的点乘,分母为二者各自的L2相乘,即将所有维度值的平方相加后开方。

说明:
A.经过step2,得到k个新的簇,每个样本都被分到k个簇中的某一个簇
B.得到k个新的簇后,当前的质心就会失效,需要计算每个新簇的自己的新质心

Step3.新质心的计算

对于分类后的产生的k个簇,分别计算到簇内其他点距离均值最小的点作为质心(对于拥有坐标的簇可以计算每个簇坐标的均值作为质心)

说明:
A.比如一个新簇有3个样本:[[1,4], [2,5], [3,6]],得到此簇的新质心=[(1+2+3)/3, (4+5+6)/3]
B.经过step3,会得到k个新的质心,作为step2中使用的质心

Step4.是否停止K-means

质心不再改变,或给定loop最大次数loopLimit

说明:
A当每个簇的质心,不再改变时就可以停止k-menas
B.当loop次数超过looLimit时,停止k-means
C.只需要满足两者的其中一个条件,就可以停止k-means
C.如果Step4没有结束k-means,就再执行step2-step3-step4
D.如果Step4结束了k-means,则就打印(或绘制)簇以及质心

四.python实现+代码详解

以下是python得实例代码以及代码的详解,应该可以理解的。

import random
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt# 计算欧拉距离
def calcDis(dataSet, centroids, k):clalist=[]for data in dataSet:diff = np.tile(data, (k, 1)) - centroids  #相减   (np.tile(a,(2,1))就是把a先沿x轴复制1倍,即没有复制,仍然是 [0,1,2]。 再把结果沿y方向复制2倍得到array([[0,1,2],[0,1,2]]))squaredDiff = diff ** 2     #平方squaredDist = np.sum(squaredDiff, axis=1)   #和  (axis=1表示行)distance = squaredDist ** 0.5  #开根号clalist.append(distance) clalist = np.array(clalist)  #返回一个每个点到质点的距离len(dateSet)*k的数组return clalist# 计算质心
def classify(dataSet, centroids, k):# 计算样本到质心的距离clalist = calcDis(dataSet, centroids, k)# 分组并计算新的质心minDistIndices = np.argmin(clalist, axis=1)    #axis=1 表示求出每行的最小值的下标newCentroids = pd.DataFrame(dataSet).groupby(minDistIndices).mean() #DataFramte(dataSet)对DataSet分组,groupby(min)按照min进行统计分类,mean()对分类结果求均值newCentroids = newCentroids.values# 计算变化量changed = newCentroids - centroidsreturn changed, newCentroids# 使用k-means分类
def kmeans(dataSet, k):# 随机取质心centroids = random.sample(dataSet, k)# 更新质心 直到变化量全为0changed, newCentroids = classify(dataSet, centroids, k)while np.any(changed != 0):changed, newCentroids = classify(dataSet, newCentroids, k)centroids = sorted(newCentroids.tolist())   #tolist()将矩阵转换成列表 sorted()排序# 根据质心计算每个集群cluster = []clalist = calcDis(dataSet, centroids, k) #调用欧拉距离minDistIndices = np.argmin(clalist, axis=1)  for i in range(k):cluster.append([])for i, j in enumerate(minDistIndices):   #enymerate()可同时遍历索引和遍历元素cluster[j].append(dataSet[i])return centroids, cluster# 创建数据集
def createDataSet():return [[1, 1], [1, 2], [2, 1], [6, 4], [6, 3], [5, 4]]if __name__=='__main__': dataset = createDataSet()centroids, cluster = kmeans(dataset, 2)print('质心为:%s' % centroids)print('集群为:%s' % cluster)for i in range(len(dataset)):plt.scatter(dataset[i][0],dataset[i][1], marker = 'o',color = 'green', s = 40 ,label = '原始点')#  记号形状       颜色      点的大小      设置标签for j in range(len(centroids)):plt.scatter(centroids[j][0],centroids[j][1],marker='x',color='red',s=50,label='质心')plt.show()

五.K-means算法补充

1.对初始化敏感,初始质点k给定的不同,可能会产生不同的聚类结果。如下图所示,右边是k=2的结果,这个就正好,而左图是k=3的结果,可以看到右上角得这两个簇应该是可以合并成一个簇的。

改进:
对k的选择可以先用一些算法分析数据的分布,如重心和密度等,然后选择合适的k

2.使用存在局限性,如下面这种非球状的数据分布就搞不定了:

3.数据集比较大的时候,收敛会比较慢

4.最终会收敛。不管初始点如何选择,最终都会收敛。可是是全局收敛,也可能是局部收敛。

六.小结

1. 聚类是一种无监督的学习方法。聚类区别于分类,即事先不知道要寻找的内容,没有预先设定好的目标变量。

2. 聚类将数据点归到多个簇中,其中相似的数据点归为同一簇,而不相似的点归为不同的簇。相似度的计算方法有很多,具体的应用选择合适的相似度计算方法

3. K-means聚类算法,是一种广泛使用的聚类算法,其中k是需要指定的参数,即需要创建的簇的数目,K-means算法中的k个簇的质心可以通过随机的方式获得,但是这些点需要位于数据范围内。在算法中,计算每个点到质心得距离,选择距离最小的质心对应的簇作为该数据点的划分,然后再基于该分配过程后更新簇的质心。重复上述过程,直至各个簇的质心不再变化为止。

4. K-means算法虽然有效,但是容易受到初始簇质心的情况而影响,有可能陷入局部最优解。为了解决这个问题,可以使用另外一种称为二分K-means的聚类算法。二分K-means算法首先将所有数据点分为一个簇;然后使用K-means(k=2)对其进行划分;下一次迭代时,选择使得SSE下降程度最大的簇进行划分;重复该过程,直至簇的个数达到指定的数目为止。实验表明,二分K-means算法的聚类效果要好于普通的K-means聚类算法。

K-means聚类算法原理及python实现相关推荐

  1. python kmeans聚类 对二维坐标点聚类_Kmeans均值聚类算法原理以及Python如何实现

    第一步.随机生成质心 由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给定两个质心,我们这个算法的目的就是将这一堆点根据它们自身的坐标特征分为两类,因此选取了两个质 ...

  2. K-means聚类算法原理及python具体实现

    文章目录 1 快速理解 1.1 算法步骤 1.2 一个例子 2 K-means步骤详解 2.1 K值的选择 2.2 距离度量 2.3 新质心的计算 2.4 停止条件 3 K-means算法实现 3.1 ...

  3. K-Means聚类算法原理及其python和matlab实现

    (一)何谓聚类 还是那句"物以类聚.人以群分",如果预先知道人群的标签(如文艺.普通.2B),那么根据监督学习的分类算法可将一个人明确的划分到某一类:如果预先不知道人群的标签,那就 ...

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

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

  5. k means聚类算法_K-Means 聚类算法 20210108

    说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...

  6. python(scikit-learn)实现k均值聚类算法

    k均值聚类算法原理详解 示例为链接中的例题 直接调用python机器学习的库scikit-learn中k均值算法的相关方法 from sklearn.cluster import KMeans imp ...

  7. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  8. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  9. k均值聚类算法python_K均值和其他聚类算法:Python快速入门

    k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...

  10. Kmean聚类算法原理python实现

    Kmean聚类算法原理python实现 Kmean聚类算法是基于距离对对象进行分类的算法,该算法实现步骤如下: 1.确定初始数据簇质心,质心的数量与需要分的类的数量一致: 2.将数据集中的每一个对象与 ...

最新文章

  1. WPF Multi-Touch 开发:惯性效果(Inertia)
  2. Xilinx网站资源导读
  3. 基于Python的信用评分卡模型分析
  4. 三层路由中限制VLAN间转发,但其他转发正常事例
  5. 三种python序列类型
  6. html5 logo svg,HTML5新特性之用SVG绘制微信logo
  7. Asp.Net Core MVC控制器和视图之间传值
  8. [Python人工智能] 二十三.基于机器学习和TFIDF的情感分类(含详细的NLP数据清洗)
  9. javascript编程风格(粗略笔记)
  10. tensorflow动态设置trainable
  11. 微信公众号-接口配置信息url和tokken
  12. 隐式差分matlab程序,油藏数值模拟隐式差分MATLAB源程序
  13. Python爬虫QQ空间
  14. AIL(Android init Language)
  15. Java反射 二三事
  16. 大国的崛起:第二集:小国大业 荷兰
  17. android 关闭来电铃声,Android删除除自定义铃声后,来电铃声显示是一串数字
  18. 【图像分类】实战——使用ResNet实现猫狗分类(pytorch)
  19. Arduino和C51开发LCD1602显示屏
  20. [附源码]Python计算机毕业设计SSM快递代收系统(程序+LW)

热门文章

  1. 宇宙也能测量,破解未解之谜的三维地图出炉
  2. 8.(高级)CSS形状之:菱形图片
  3. ubuntu 20.04 安装 微信最新方式
  4. android 侧滑删除方法,Android 基于RecyclerView的Item侧滑删除
  5. 2020年最全各省市矢量数据下载(含城市道路、铁路、高速、省道、县道、乡道等+河流水系网+建筑轮廓+铁路网等shp矢量数据+矢量量边界+wgs84坐标
  6. Linux下几种定时器的使用
  7. 尝试校园网多拨速度叠加与复盘
  8. 2021年9款优秀的大数据可视化BI软件
  9. 经典文献阅读之--lris(优于Scan Context的回环检测)
  10. 科目二倒车入库学车技巧_学车必看_保过。