经典机器学习算法

开通VIP,畅享免费电子书等14项超值服

首页

好书

留言交流

下载APP

联系客服

2023.02.27湖南

所谓聚类算法是指将一堆没有标签的数据自动划分成几类的方法,属于无监督学习方法。监督学习有特征有标签。无监督学习只有特征没有标签,两者的区别在这里。

1.1算法思想

K均值聚类又叫做(k-means算法)是属于无监督学习里的一种最基础最常用聚类算法。所谓聚类即人以类聚、物以群分,将样本按照各自的特点分为不同的类别,所谓无监督即事先不知道任何样本属于哪个类别。如下图所示一些样本被分为了绿色,红色,蓝色的三类。聚类的应用非常广泛包括客户群体的划分,推荐系统,文本聚类中,国家电网用户画像,基于用户位置信息的商业选址等。

那么K均值聚类究竟是如何把这些样本聚成不同的类别的呢?答案是:样本到聚类中心的距离。(这里使用的就是欧式距离,至于其他的距离度量感兴趣的读者可以问一下度娘,小编在以后也会介绍到)。它的基本思想是,通过迭代方式寻找K个簇的一种划分方案,使得聚类结果对应的代价函数最小。代价函数如下所示可以定义为样本距离所属簇中心点的误差平方和(欧氏距离)。

1.2算法流程

下面给出K均值算法的具体步骤:

(1)首先确定一个k值,即我们希望将数据集经过聚类得到k个集合。

(2)从数据集中随机选择k个数据点作为质心。

(3)对数据集中每一个点,计算其与每一个质心的距离(如欧式距离),离哪个质心近,就划分到那个质心所属的集合。

(4)把所有数据归好集合后,一共有k个集合。然后重新计算每个集合的质心(求均值)。

(5)如果新计算出来的质心和原来的质心之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛,即损失函数J收敛),我们可以认为聚类已经达到期望的结果,算法终止。

(6)如果新质心和原质心距离变化很大,需要迭代3~5步骤。

在迭代时,分别先固定簇中心,调整样本所属的类别来让J函数减少,再固定类别,调整簇中心使J函数减少。这两个过程可以交替进行。是不是晕了呢,下面的流程图相信会帮助你理解的:

如果不想看上述公式可以看下图的过程:

(1),首先空间里的一些样本点(a);

(2)随机初始换两个中心(b),中心为图中的×;

(3)计算当前样本属于的类别(c);

(4)依据每个类别中的样本重新计算聚类中心(d);

(5)迭代此过程(e),(f)。

1.3优缺点

说了这么多,那么真正要掌握K-means算法还要知道其优缺点以及如何调整。

K均值聚类有很多优点,对于大数据集,K均值聚类是高效的,它的计算复杂度O(NKt)接近于线性,其中N是样本数目,K是聚类簇数,t是迭代次数。

但是它依然存在一些缺点,该算法受初始值和离群点的影响每次结果不稳定,通常的结果不是全局最优解而是局部最优解,无法很好的解决数据簇分布差别比较大的情况(比如一个类的样本是另一个类的100倍),不太适用于离散类,K值依据人为选取缺乏客观性等。

针对其缺点调优可以考虑一下步骤:

(1)进行数据归一化和离群点的处理(少量的噪声会对均值产生较大的影响)

(2)选择合理的K值,我们可以采用手肘法,如下图所示纵轴为误差平方和,横轴为不同的K值,这里我们选取K=3,因为K<3曲线下降的熟虑大于k>3。

(3)采用核函数,将空间中的样本点映射到更高的维度进行聚类,该方法又称为核K均值聚类,这样可以增加该样本点线性可分的概率。

当然还有其他的一些好方法比如Gapstatistic方法,感兴趣的读者可以自行百度。

K-means++算法和ISODATA算法就是基于此改进的模型。K-means++算法的思想是在迭代时选取第n+1个聚类中心时,距离当前n个聚类中心越远的点会有更高的概率会被选为第n+1个聚类中心。

ISODATA算法的思想也很简单,当某个类别的样本数过少时,把该类去除;当属于某个类别的样本数过多、分散程度较大时,把该类分成两个子类别。

1.4怎么样设置合理的K值

1.4.1按需选择

简单地说就是按照建模的需求和目的来选择聚类的个数。比如说,一个游戏公司想把所有玩家做聚类分析,分成顶级、高级、中级、菜鸟四类,那么K=4;如果房地产公司想把当地的商品房分成高中低三档,那么K=3。按需选择虽然合理,但是未必能保证在做K-Means时能够得到清晰的分界线。

1.4.2观察法

就是用肉眼看,看这些点大概聚成几堆。这个方法虽然简单,但是同时也模棱两可。

左上角是原始点。右上角分成了两类。左下角是三类,左下角是四类。至于K到底是选3还是选4,可能每个人都有不同的选择。

观察法的另一个缺陷就是:原始数据维数要低,一般是两维(平面散点)或者三维(立体散点),否则人类肉眼则无法观察。对于高维数据,我们通常利用PCA降维,然后再进行肉眼观察。

1.4.3手肘法

将所有的的点按照K个分类计算距离总和。总和越大分类越不合理。手肘法本质上也是一种间接的观察法。我们将得到K个聚类的中心点Mi,i=1,2,,K。以及每个原始点所对应的聚类Ci,i=1,2,,K。我们通常采用所有样本点到它所在的聚类的中心点的距离的和作为模型的度量,记为DK。

这里距离可以采用欧式距离。

对于不同的K,最后我们会得到不同的中心点和聚类,所有会有不同的度量。

我们把上面的例子用不同的K去计算,会得到不同的结果。把K作为横坐标,DK作为纵坐标,我们可以得到下面的折线。

K为分类的个数DK为每一分类到质心的距离之和再相加。

很显然K越大,距离和越小。但是我们注意到K=3是一个拐点,就像是我们的肘部一样,K=1到3下降很快,K=3之后趋于平稳。手肘法认为这个拐点就是最佳的K。

手肘法是一个经验方法,而且肉眼观察也因人而异,特别是遇到模棱两可的时候。相比于直接观察法,手肘法的一个优点是,适用于高维的样本数据。有时候人们也会把手肘法用于不同的度量上,如组内方差组间方差比。

1.4.4GapStatistic方法

这里我们要继续使用上面的DK。GapStatistic的定义为:

这里E(logDk)指的是logDk的期望。对于一个聚类个数k,首先利用k-means聚类将样本聚成k类,然后计算k类中各类内各点与类中心的距离加和W(ki),进而计算k类的距离加和W(k)=sum(W(k1),…,W(ki),…,W(kk));根据原始数据的特点产生B个均匀分布的参考数据集,对于每个数据集都计算W(sk),计算B个数据集的平均E.W(k)=mean(W(1k),…,W(sk),…,W(bk));那么对于每个k就有:gap(k)=log(E.W(k))-log(W(k));然后选取最小的k,使得gap(k)为局部最大值,并且超出了其邻居1个标准差,即gap(k)-gap(k+1)>0.25*sd(W(s(k+1)))

用上图的例子,我们计算了K=1,2,…9对应的GapStatisitc.

参数:

n_clusters:整形,缺省值=8【生成的聚类数,即产生的质心(centroids)数。】

max_iter:整形,缺省值=300执行一次k-means算法所进行的最大迭代数。

n_init:整形,缺省值=10用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。

init:有三个可选值:’k-means++’,'random’,或者传递一个ndarray向量。此参数指定初始化方法,默认值为'k-means++’。

(1)'k-means++’用一种特殊的方法选定初始质心从而能加速迭代过程的收敛(即上文中的k-means++介绍)

(2)'random’随机从训练数据中选取初始质心。

(3)如果传递的是一个ndarray,则应该形如(n_clusters,n_features)并给出初始质心。

precompute_distances:三个可选值,'auto’,True或者False。预计算距离,计算速度更快但占用更多内存。

(1)'auto’:如果样本数乘以聚类数大于12million的话则不预计算距离。Thiscorrespondstoabout100MBoverheadperjobusingdoubleprecision.

(2)True:总是预先计算距离。

(3)False:永远不预先计算距离。

tol:float形,默认值=1e-4与inertia结合来确定收敛条件。

n_jobs:整形数。指定计算所用的进程数。内部原理是同时进行n_init指定次数的计算。

(1)若值为-1,则用所有的CPU进行运算。若值为1,则不进行并行运算,这样的话方便调试。

(2)若值小于-1,则用到的CPU数为(n_cpus+1+n_jobs)。因此如果n_jobs值为-2,则用到的CPU数为总CPU数减1。

random_state:整形或numpy.RandomState类型,可选用于初始化质心的生成器(generator)。如果值为一个整数,则确定一个seed。此参数默认值为numpy的随机数生成器。

copy_x:布尔型,默认值=True,当我们precomputingdistances时,将数据中心化会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。

属性:

cluster_centers_:向量,[n_clusters,n_features](聚类中心的坐标)

Labels_:每个点的分类

inertia_:float形

每个点到其簇的质心的距离之和。

Notes:

这个k-means运用了Lioyd’s算法,平均计算复杂度是O(k*n*T),其中n是样本量,T是迭代次数。

计算复杂读在最坏的情况下为O(n^(k+2/p)),其中n是样本量,p是特征个数。(D.ArthurandS.Vassilvitskii,'Howslowisthek-meansmethod’SoCG2006)

在实践中,k-means算法时非常快的,属于可实践的算法中最快的那一类。但是它的解只是由特定初始值所产生的局部解。所以为了让结果更准确真实,在实践中要用不同的初始值重复几次才可以。

Methods:

fit(X[,y]):

计算k-means聚类。

fit_predictt(X[,y]):

计算簇质心并给每个样本预测类别。

fit_transform(X[,y]):

计算簇并transformXtocluster-distancespace。

get_params([deep]):

取得估计器的参数。

predict(X):predict(X)

给每个样本估计最接近的簇。

score(X[,y]):

计算聚类误差

set_params(**params):

为这个估计器手动设定参数。

transform(X[,y]):将X转换为群集距离空间。

在新空间中,每个维度都是到集群中心的距离。请注意,即使X是稀疏的,转换返回的数组通常也是密集的。

THE END
1.MLGuruSupreme:机器学习菜鸟的福音来啦!这个Python 库属实让我眼前一亮!写机器学习代码再也不用绞尽脑汁啦。它把那些复杂的算法都打包好了,咱们导入就能用,关键是连调参都帮你搞定。不管你是刚入门的小白,还是搞科研的老手,这个库都能帮你省不少事。 1. 安装超简单 pip install mlgurusupreme https://www.jianshu.com/p/bee48bb44a7f
2.pythonAI源码mob649e815a6b81的技术博客我们将通过一个简单的机器学习示例,使用Python的scikit-learn库来创建一个分类模型,该模型用于识别鸢尾花(Iris flower)的类别。 首先,我们需要安装scikit-learn库,可以通过以下命令进行安装: pipinstallscikit-learn 1. 接下来,我们将编写代码加载数据、训练模型并进行预测。 https://blog.51cto.com/u_16175458/12901267
3.深度学习入门篇(二)从理论到实战:LeNet代码实现与MNIST数据集深度学习入门篇(二) 从理论到实战:LeNet代码实现与MNIST数据集训练(PyTorch) 上篇文章讲解了LeNet的具体细节:深度学习入门篇--来瞻仰卷积神经网络的鼻祖LeNet 这次给大家带来卷积神经网络入门级网络LeNet的代码详解,并一步步的实现,并给同学们总结出pytorch的代码【查看原文】http://aigcdaily.cn/news/b24i7solbfipdcz/
4.Lesson6.1ScikitLearn快速入门如果是首次安装 sklearn,可参考上述代码在命令行中进行安装。 官网还指出,可以通过后面的代码查看 sklearn 的安装情况,其中第一行是查看目前安装的 sklearn 版本以及安装位置,第二行代码是查看安装好的第三方库(在当前虚拟环境下),第三行代码则是查看当前已经安装好的 sklearn 版本。 https://blog.csdn.net/weixin_45891612/article/details/128905266
5.使用X++代码调用.NET库Learn 登录 保存 添加到集合 添加到计划 使用英语阅读 第11 单元(共 13 个单元) 已完成100 XP 2 分钟 Visual Studio 中的财务和运营应用包含 X++ 代码,可与以其他 .NET 语言编写的代码顺利交互。 您可以通过执行以下步骤,从财务和运营应用项目创建对 C# 类库或生成程序集的任何类型的 C# 项目的引用: https://docs.microsoft.com/zh-cn/learn/modules/get-started-xpp-finance-operations/9-dotnet
6.机器学习KMeans聚类分析详解腾讯云开发者社区代码语言:javascript 复制 sklearn.cluster.KMeans(n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='auto', verbose=0, random_state=None, copy_x=True, n_jobs=None, algorithm='auto') 参数与接口详解见文末附录 例: 代码语言:javascript 复制 >>>https://cloud.tencent.com/developer/article/1838408
7.C++Compass::learnoffsets方法代码示例本文整理汇总了C++中Compass::learn_offsets方法的典型用法代码示例。如果您正苦于以下问题:C++ Compass::learn_offsets方法的具体用法?C++ Compass::learn_offsets怎么用?C++ Compass::learn_offsets使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Compass的用法示例。 https://vimsky.com/examples/detail/cpp-ex---Compass-learn_offsets-method.html
8.c++源代码LearnCandC++ProgrammingThe best site for C and C++ programming. Popular, beginner-friendly C and C++ tutorials to help you become an expert!https://cprogramming.com/
9.LearnC++LearnCPlusPlus.org is a free website designed to help you learn how to program Windows C++ apps. Tutorials, resources, videos, books and more for programmers.https://learncplusplus.org/
10.python中kmeans和kmeans++原理及实现python本文主要介绍了python中k-means和k-means++原理及实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 + 目录 前言 k-means算法是无监督的聚类算法,实现起来较为简单,k-means++可以理解为k-means的增强版,在初始化中心点的方式上比k-meanshttps://www.jb51.net/article/247661.htm
11.C源码,VC源码,VC++源码,Java源码,PHP源码,C++源码,C#源码,Python领先的源码共享下载网站,20万源码免费下载,内容涵盖:网站源码,C,VC,VC++,Java,PHP,C++,C#,Python,ASPX,.NET,JSP,VB,Delphi,JavaScript,行业源码http://www.verysource.com/
12.史上最全wow3.35单机代码命令.docx===%.Learn20573坚韧抵抗昏迷的几率提高15%.Learn20574斧专精+,、魅惑、催眠,+%.%.+++10%.Learnun弓专精++%到30%.Learn20557野兽杀手对野兽的伤害+5%+++10%.+10%.Learn20600感知提高侦测潜行能力,++%,免疫流血、毒药、疾病, 史上最全wow3.35单机代码命令 来自淘豆网www.taodocs.com转载请标明出处. 文档信https://www.taodocs.com/p-211757761.html