• K-means算法 (无监督算法,聚类算法)
  • 1-1 基本流程
      • 一、概念:
      • 二、主要特点:
      • 三、算法流程:
      • kmeans作用:去除奇异值
    • 小结:
  • 1-2 算法效果衡量标准
    • 一、K值确定:
    • 二、轮廓系数:
    • 三、Canopy算法配合初始聚类:
      • 1、Canopy简介:
      • 2、Canopy+Kmeans:
    • 四、Calinski-Harabasz Index:
  • 1-3 K-means算法优化
    • 一、K-means++:
    • 二、ISODATA:
    • 三、Kernel k-means:
    • 四、二分K-means:
    • 五、Mini Batch K-Means(适合大数据的聚类算法)

K-means算法 (无监督算法,聚类算法)

1-1 基本流程

一、概念:

K-means:事先确定常数K,常数K意味着最终的聚类类别数,首先随机选定初始点为质心,并通过计算每一个样本与质心之间的相似度(这里为欧式距离),将样本点归到最相似的类中,接着,重新计算每个类的质心(即为类中心),重复这样的过程,知道质心不再改变,最终就确定了每个样本所属的类别以及每个类的质心。由于每次都要计算所有的样本与每一个质心之间的相似度,故在大规模的数据集上,K-Means算法的收敛速度比较慢。
最常用的无监督算法,选将军模型 。也是随机算法,用到了随机试验。

聚类算法:是一种典型的无监督学习算法,主要用于将相似的样本自动归到一个类别中。
聚类算法与分类算法最大的区别是:聚类算法是无监督的学习算法,而分类算法属于监督的学习
算法。
在聚类算法中根据样本之间的相似性,将样本划分到不同的类别中,对于不同的相似度计算方法,会得到不同的聚类结果,常用的相似度计算方法有欧式距离法。

二、主要特点:

常用距离
a.欧式距离
b.曼哈顿距离
应用:
a.去除孤立点,离群点,只针对度量算法,解决方法(常用归一化预处理方法 )
b.离散化

三、算法流程:

1.选择聚类的个数k(kmeans算法传递超参数的时候,只需设置最大的K值)
2.任意产生k个聚类,然后确定聚类中心,或者直接生成k个中心。
3.对每个点确定其聚类中心点。
4.再计算其聚类新中心。
5.重复以上步骤直到满足收敛要求。(通常就是确定的中心点不再改变。)

kmeans作用:去除奇异值

==应为EM算法,kmeans肯定会稳定到K个中心点==
kmeans算法k个随机初始值怎么选?
要多选几次,比较,找出最好的那个。
a.bi-kmeans方法,依次补刀
b.层次聚类 k = 5,找到5个中心点,接着把这个5个中心点喂给kmeans,初始中心点不同,收敛的结果也可能不一样的

小结:

优点:
1、原理简单(靠近中心点) ,实现容易
2、聚类效果中上(依赖K的选择)
3、空间复杂度o(N)时间复杂度o(I*K*N)
N为样本点个数,K为中心点个数,I为迭代次数
缺点:
1、对离群点, 噪声敏感 (中心点易偏移)
2、很难发现大小差别很大的簇及进行增量计算
3、结果不一定是全局最优,只能保证局部最优(与K的个数及初值选取有关)

1-2 算法效果衡量标准

一、K值确定:

Elbow method就是“肘”方法,对于n个点的数据集,迭代计算k from 1 to n,每次聚类完成后计算每个点到其所属的簇中心的距离的平方和,可以想象到这个平方和是会逐渐变小的,直到k==n时平方和为0,因为每个点都是它所在的簇中心本身。但是在这个平方和变化过程中,会出现一个拐点也即“肘”点,下图可以看到下降率突然变缓时即认为是最佳的k值。

肘方法的核心指标是SSE(sum of the squared errors,误差平方和), Ci是第i个簇,
p是Ci中的样本点, mi是Ci的质心(Ci中所有样本的均值), SSE是所有样本的聚
类误差,代表了聚类效果的好坏。

SSE=∑i=1k∑p∈Ci|p−mi|2SSE=∑i=1k∑p∈Ci|p−mi|2

SSE=\sum_{i=1}^{k}\sum_{p\in C_i}|p-m_i|^2

肘方法的核心思想:
随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。这也是该方法被称为肘方法的原因。

聚类效果怎么判断?
1、SSE误差平方和越小越好,肘部拐点的地方。
2、也可用轮廓系数表示 系数越大,聚类效果越好,簇与簇之间距离越远

kmeans算法的最大弱点:只能处理球形的簇(理论)

代码实现:

import numpy as np
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
import matplotlib.pyplot as plt
cluster1 = np.random.uniform(0.5, 1.5, (2, 10))
cluster2 = np.random.uniform(3.5, 4.5, (2, 10))X = np.hstack((cluster1, cluster2)).T'''
参数的意义:
n_clusters:簇的个数,即你想聚成几类
init: 初始簇中心的获取方法
n_init: 获取初始簇中心的更迭次数
max_iter: 最大迭代次数(因为kmeans算法的实现需要迭代)
tol: 容忍度,即kmeans运行准则收敛的条件
precompute_distances:是否需要提前计算距离
verbose: 冗长模式(不太懂是啥意思,反正一般不去改默认值)
random_state: 随机生成簇中心的状态条件。
copy_x: 对是否修改数据的一个标记,如果True,即复制了就不会修改数据。
n_jobs: 并行设置
algorithm: kmeans的实现算法,有:'auto', 'full', 'elkan', 其中 'full'表示用EM方式实现
'''
K = range(1, 10)
# print(X)
meandistortions = []
for k in K:kmeans = KMeans(n_clusters=k)kmeans.fit(X)meandistortions.append(sum(np.min(cdist(X,kmeans.cluster_centers_, 'euclidean'), axis=1)) / X.shape[0])'''# cdist(X, kmeans.cluster_centers_, 'euclidean')  求出X到cluster_centers_之间的距离#np.min(cdist(X,kmeans.cluster_centers_, 'euclidean'), axis=1)   按行的方向,对每一行求出一个最小值#sum(np.min(cdist(X,kmeans.cluster_centers_, 'euclidean'), axis=1)) 求出每次得到最小值列表的和# 求出每次最小值列表和的平均值'''
print(meandistortions)
plt.plot(K, meandistortions, 'bx-')
plt.xlabel('k')
# plt.ylabel('平均畸变程度',fontproperties=font)
plt.ylabel('Ave Distor')
# plt.title('用肘部法则来确定最佳的K值',fontproperties=font);
plt.title('Elbow method value K');
plt.show()

二、轮廓系数:

( Silhouette Coefficient)结合了聚类的凝聚度( Cohesion)和分离度
( Separation),用于评估聚类的效果。该值处于-1~1之间,值越大,表示聚类效果
越好。

S=(b−a)max(a,b)S∈[−1,1]S=(b−a)max(a,b)S∈[−1,1]

S=\frac{(b-a)}{max(a,b)} S \in [-1,1]
a是Xi与同簇的其他样本的平均距离,称为凝聚度;
b是Xi与最近簇中所有样本的平均距离,称为分离度。

最近簇的定义:

Cj=argminCk1n∑p∈Ck|p−Xi|2Cj=argminCk1n∑p∈Ck|p−Xi|2

C_j=arg min_{Ck}\frac{1}{n}\sum_{p \in C_k}|p-X_i|^2
其中p是某个簇Ck中的样本。即,用Xi到某个簇所有样本平均距离作为衡量该点到该簇的距离后,选择离Xi最近的一个簇作为最近簇。
求出所有样本的轮廓系数后再求平均值就得到了平均轮廓系数。平均轮廓系数的取值范围为[-1,1],且簇内样本的距离越近,簇间样本距离越远,平均轮廓系数越大,聚类效果越好。
代码实现:

import numpy as np
from sklearn.cluster import KMeans
from sklearn import metrics
import matplotlib.pyplot as plt# 分割出6个子图, 并在1号作图
plt.figure(figsize=(8, 10))
plt.subplot(3, 2, 1)
# 初始化原始数字点
x1 = np.array([1, 2, 3, 1, 5, 6, 5, 5, 6, 7, 8, 9, 7, 9])
x2 = np.array([1, 3, 2, 2, 8, 6, 7, 6, 7, 1, 2, 1, 1, 3])
X = np.array(list(zip(x1, x2))).reshape(len(x1), 2)
# 在1号子图做出原始数据点阵的分布
# xlim 坐标的刻度
plt.xlim([0, 10])
plt.ylim([0, 10])
plt.title('Sample')
plt.scatter(x1, x2)# 点的颜色
colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'b']
# 点的标号
markers = ['o', 's', 'D', 'v', '^', 'p', '*', '+']
# 簇的个数
tests = [2, 3, 4, 5, 8]
subplot_counter = 1  # 训练模型
for t in tests:subplot_counter += 1plt.subplot(3, 2, subplot_counter)kmeans_model = KMeans(n_clusters=t).fit(X)for i, l in enumerate(kmeans_model.labels_):plt.plot(x1[i], x2[i], color=colors[l], marker=markers[l], ls='None')plt.xlim([0, 10])plt.ylim([0, 10])# silhouette_score计算所有样本的平均轮廓系数。# kmeans_model.labels_ 每个样本的预测标签。即预测的类的标签# metric='euclidean' 用的方法为欧式距离plt.title('K = %s, SCoefficient = %.03f' % (t, metrics.silhouette_score(X, kmeans_model.labels_, metric='euclidean')))
plt.show()

三、Canopy算法配合初始聚类:

1、Canopy简介:

Canopy聚类最大的特点是不需要事先指定k值(即clustering的个数),因此具有很大的实际应用价值。 Canopy聚类虽然精度较低,但其在速度上有很大优势,因此可以使用Canopy聚类先对数据进行“粗”聚类, 得到k值后再使用K-means进行进一步“细”聚类。

2、Canopy+Kmeans:

a. 聚类最耗费计算的地方是计算对象相似性的时候,Canopy聚类在第一阶段选择简单、计算代价较低的方法计算对象相似性,将相似的对象放在一个子集中,这个子集被叫做Canopy,通过系列计算得到若干Canopy,Canopy之间可以是重叠的,但不会存在某个对象不属于任何Canopy的情况, 可以把这一阶段看做数据预处理;
b . 在各个Canopy 内使用传统的聚类方法(如K-means),不属于同一Canopy的对象之间不进行相似性计算。 (即, 根据Canopy算法产生的Canopies代替初始的K个聚类中心点,由于已经将所有数据点进行Canopies有覆盖划分,在计算数据离哪个k-center最近时,不必计算其到所有k-centers的距离, 只计算和它在同一个Canopy下的k-centers这样可以提高效率)
c、Canopy详解:
1, 首先选择两个距离阈值: T1和T2, 其中T1 > T2
2, 从list中任取一点P,用低计算成本方法快速计算点P与所有Canopy之间的距离(如果当前不存在Canopy,则把点P作为一个Canopy),如果点P与某个Canopy距离在T1以内,则将点P加入到这个Canopy
3, 如果点P曾经与某个Canopy的距离在T2以内,则需要把点P从list中删除,这一步是认为点P此时与这个Canopy已经够近了, 因此它不可以再做其它Canopy的中心了
4, 重复步骤2、 3, 直到list为空结束

优点:
1、 Kmeans对噪声抗干扰较弱,通过Canopy对比,将较小的NumPoint的Cluster直接去掉有利于抗干扰。
2、 Canopy选择出来的每个Canopy的centerPoint作为K会更精确。
3、 只是针对每个Canopy的内做Kmeans聚类, 减少相似计算的数量。
缺点:
算法中 T1、 T2(T2 < T1) 的确定问题

四、Calinski-Harabasz Index:

Calinski-Harabasz:类别内部数据的协方差越小越好,类别之间的协方差越大越好,这样的Calinski-Harabasz分数s会高, 分数s高则聚类效果越好

s(k)=tr(Bk)tr(Wk)m−kk−1s(k)=tr(Bk)tr(Wk)m−kk−1

s(k) = \frac{tr(B_k)}{tr(W_k)}\frac{m-k}{k-1}
其中m为训练集样本数, k为类别数。 Bk为类别之间的协方差矩阵, Wk为类别内部数据的协方差矩阵。 tr为矩阵的迹。

1-3 K-means算法优化

一、K-means++:

假设已经选取了n个初始聚类中心(0 < n < k), 则在选取第n+1个聚类中心时: 距离当前n个聚类中心越远的点会有更高的概率被选为第n+1个聚类中心。 在选取第一个聚类中心(n=1)时同样通过随机的方法。 可以说这也符合我们的直觉: 聚类中心当然是互相离得越远越好。可以用相对距离,P=D(x)2/totalD(x)2P=D(x)2/totalD(x)2P=D(x)^2/total_D(x)^2, p越小,表明样本被分配到别的类的概率小。

二、ISODATA:

  1. 类别数目随着聚类过程而变化;
  2. 对类别数的“合并”: ( 当聚类结果某一类中样本数太少, 或两个类间的距离太近时)
  3. “分裂”( 当聚类结果中某一类的类内方差太大, 将该类进行分裂)
    太少或太散都可能会被分裂,打散的类不一定被分到其他同一类.

三、Kernel k-means:

kernel k-means实际上公式上, 就是将每个样本进行一个投射到高维空间的处理, 然
后再将处理后的数据使用普通的k-means算法思想进行聚类。

四、二分K-means:

首先将所有点作为一个簇, 然后将该簇一分为二。 一分为二后,计算两个簇的误差平方和,把误差平方和差的那个簇再一分为二,再比较这两个簇和之前的一个簇哪个的误差平方和最大,把最大的那个簇再继续一分为二,依次下去直到簇的数目等于k为止。
因为聚类的误差平方和能够衡量聚类性能, 该值越小表示数据点越接近于他们的质心, 聚类效果就越好。 所以我们就需要对误差平方和最大的簇进行再一次划分, 因为误差平方和越大, 表示该簇聚类效果越不好, 越有可能是多个簇被当成了一个簇, 所以我们首先需要对这个簇进行划分。
二分k-means算法优点:二分K均值算法可以加速K-means算法的执行速度, 因为它的相似度计算少了不受初始化问题的影响, 因为这里不存在随机点的选取, 且每一步都保证了误差最小。

五、Mini Batch K-Means(适合大数据的聚类算法)

Mini Batch KMeans使用了一个种叫做Mini Batch(分批处理) 的方法对数据点之间
的距离进行计算。Mini Batch的好处是计算过程中不必使用所有的数据样本,而是从
不同类别的样本中抽取一部分样本来代表各自类型进行计算。 由于计算样本量少,所
以会相应的减少运行时间, 但另一方面抽样也必然会带来准确度的下降。
该算法的迭代步骤有两步:
1: 从数据集中随机抽取一些数据形成小批量, 把他们分配给最近的质心
2: 更新质心

机器学习十大算法之一:K-means算法相关推荐

  1. 机器学习十大算法(二)

    文章来源:https://www.dezyre.com/article/top-10-machine-learning-algorithms/202 本人自行翻译,如有错误,还请指出.后续会继续补充实 ...

  2. 新手入门机器学习十大算法

    新手入门机器学习十大算法 2018年9月17日 磐石 TensorFlowNews, 机器学习 0 在机器学习的世界中,有一种被称为"无免费午餐"的定理. 它意在说明没有哪种算法能 ...

  3. 机器学习十大算法汇总

    机器学习十大算法汇总 目录: 机器学习十大算法汇总 前言: 机器学习的十大算法: 总结 前言: 什么是机器学习算法? 它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域,它 ...

  4. 机器学习十大算法之Matlab-9降维算法

    机器学习十大算法之Matlab-9降维算法 降维算法 PCA算法 对数据集进行PCA后再重构 PCA降维-Matlab代码 例子1-系统pca做降维pca_mat.m 例子2-系统pca对简单数据集降 ...

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

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

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

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

  7. 机器学习十大算法之Matlab-5决策树

    机器学习十大算法之Matlab-5决策树 决策树 Matlab代码 例子1-fitctree,三分类 例子2-fitctree,二分类 决策树 Matlab代码 例子1-fitctree,三分类 利用 ...

  8. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  9. 机器学习第七章之K近邻算法

    K近邻算法(了解) 7.1 K近邻算法 7.1.1 K近邻算法的原理介绍 7.1.2 K近邻算法的计算步骤及代码实现 7.2 数据预处理之数据归一化 7.2.1 min-max标准化 7.2.2 Z- ...

  10. 数学建模当中常用的十大模型及各对应算法

    数学建模当中常用的十大模型及各对应算法 图文展示:

最新文章

  1. JS数字金额转为大写金额
  2. Java服务器热部署的实现原理
  3. Windows中SQLite的编译及编程
  4. 《学得少考得好》读书笔记
  5. SpringBoot应用之消息队列rabbitmq
  6. [LeetCode] Move Zeroes - 整数数组处理问题
  7. 2017 多校2 hdu 6053 TrickGCD
  8. 隐藏search parameter在configuration tab里不相关的field
  9. sscanf 连续相同编辑符_基于单调栈的滑动窗口法求解“和至少为 K 的最短连续子数组”...
  10. 2021了,不会还有测试人员认为Jmeter就等于性能测试吧!
  11. alibaba cloud sdk使用工作笔记0001---通过alibaba cloud sdk动态操作自己的阿里云产品,设置,或者查询信息
  12. ./configure,make,make install 的作用
  13. SQL Server schema 用法
  14. db模块未绑定 Uncaught TypeError: Cannot read property 'openDatabase' of undefined
  15. Visual Studio 2019安装MFC开发工具包
  16. Java多窗口编程示例
  17. 计算机操作系统|汤小丹|第四版|习题答案
  18. 数据仓库--数据分层(ETL、ODS、DW、APP、DIM)
  19. html设置ie兼容性视图,如何用脚本配置IE兼容性视图设置
  20. C#方法名前的方括号是干嘛用的呀?

热门文章

  1. mac屏幕录制软件Camtasia2018安装激活图文教程
  2. 软件无线电之数字下变频(Matlab实例)
  3. 车削加工振刀打刀的现象如何处理?
  4. 抖音短视频SEO优化排名,抖音SEO搜索关键字排名
  5. 21、ZigBee 开发教程之基础篇—继电器模块
  6. 关于kriging算法的结构分析
  7. h5 获取当前地理位置信息
  8. html手机扫描条形码,在HTML5/JavaScript中扫描条形码
  9. python多线程下载编程软件_python抖音多线程下载无水印视频
  10. 首页小房子图标html代码,html5及css3做的3D小房子