1 K-Means聚类收敛性怎么证明?一定会收敛???
2 聚类中止条件:迭代次数、簇中心变化率、最小平方误差MSE???
3 聚类初值的选择,对聚类结果的影响???(K-Means对初值是敏感的)
4 肘部选择法——确定聚类数K
没有所谓最好的选择聚类数的方法,通常是需要根据不同的问题,人工进行选择的。选择的时候思考我们运用 K-均值算法聚类的动机是什么,然后选择能最好服务于该目的标聚类数。当人们在讨论,选择聚类数目的方法时,有一个可能会谈及的方法叫作“肘部法则”。 关于“肘部法则”,我们所需要做的是改变 K 值,也就是聚类类别数目的总数 。我们 用一个聚类来运行 K 均值聚类方法。这就意味着,所有的数据都会分到一个聚类里,然后计算成本函数J,K 代表聚类种类 。
我们可能会得到一条类似于这样的曲线。像一个人的肘部。这就是“肘部法则”所做的,让我们来看这样一个图,看起来就好像有一个很清楚的肘在那儿。好像人的手臂,如果你伸出你的胳膊,那么这就是你的肩关节、肘关节、手。这就是“肘部法则”。你会发现这种模式,它的畸变值会迅速下降,从 1 到 2,从 2 到 3 之后,你会在 3 的时候达到一个肘点。在此之后,畸变值就下降的非常慢,看起来就像使用 3 个聚类来进行聚类是正确的,这是因为 那个点是曲线的肘点,畸变值下降得很快 ,K 等于 3 之后就下降得很慢,那么我们就选 K 等于 3。 当你应用“肘部法则”的时候,如果你得到了一个像上面这样的图,那么这将是一种用来选择聚类个数的合理方法。
uk是第k 个类的重心位置。成本函数是各个类畸变程度(distortions)之和。每个类的畸变程度等于该类重心与其内部成员位置距离的平方和。若类内部的成员彼此间越紧凑则类的畸变程度越小,反之,若类内部的成员彼此间越分散则类的畸变程度越大。求解成本函数最小化的参数就是一个重复配置每个类包含的观测值,并不断移动类重心的过程。
importnumpyasnpimportmatplotlibpyplotaspltfromsklearnclusterimportKMeansfromscipyspatialdistanceimportcdistx = nparray([1,2,3,1,5,6,5,5,6,7,8,9,7,9])y = nparray([1,3,2,2,8,6,7,6,7,1,2,1,1,3])data = nparray(list(zip(x, y)))# 肘部法则 求解最佳分类数# K-Means参数的最优解也是以成本函数最小化为目标# 成本函数是各个类畸变程度(distortions)之和。每个类的畸变程度等于该类重心与其内部成员位置距离的平方和# 画肘部图aa=[]K = range(1,10)forkinrange(1,10): kmeans=KMeans(n_clusters=k) kmeansfit(data) aaappend(sum(npmin(cdist(data, kmeanscluster_centers_,'euclidean'),axis=1))/datashape[0])pltfigure()pltplot(nparray(K), aa,'bx-')pltshow()# 绘制散点图及聚类结果中心点pltfigure()pltaxis([0,10,0,10])pltgrid(True)pltplot(x, y,'k')kmeans = KMeans(n_clusters=3)kmeansfit(data)pltplot(kmeanscluster_centers_[:,0], kmeanscluster_centers_[:,1],'r')pltshow()
5 K-Means优缺点及适用范围
K值需要预先给定,属于预先知识,很多情况下K值的估计是非常困难的,对于像计算全部微信用户的交往圈这样的场景就完全的没办法用K-Means进行 。对于可以确定K值不会太大但不明确精确的K值的场景,可以进行迭代运算,然后 找出Cost Function最小时所对应的K值,这个值往往能较好的描述有多少个簇类 。
K-Means算法对 初始选取的聚类中心点是敏感的 ,不同的随机种子点得到的聚类结果完全不同
K-Means算法 并不是适用所有的样本类型 。它 不能处理非球形簇、不同尺寸和不同密度的簇 。
K-Means算法对离群点的数据进行聚类时,K均值也有问题,这种情况下,离群点检测和删除有很大的帮助。( 异常值对聚类中心影响很大,需要离群点检测和剔除 )
5K-Means算法对噪声和离群点敏感,最重要是结果不一定是全局最优,只能保证局部最优。
6 从K-Means 到 Gaussian Mixture Model
数据表示
在 k-means 中,我们用单个点来对 cluster 进行建模,这实际上是一种最简化的数据建模形式。这种用点来对 cluster 进行建模实际上就已经假设了各 cluster 的数据是呈圆形(或者高维球形)分布的。但在实际生活中,很少能有这种情况。 所以在 GMM 中,我们使用一种更加一般的数据表示,也就是高斯分布。
数据先验
在 k-means 中,我们假设各个 cluster 的先验概率是一样的,但是各个 cluster 的数据量可能是不均匀的。举个例子,cluster A 中包含了10000个样本,cluster B 中只包含了100个。那么对于一个新的样本,在不考虑其与 A B cluster 相似度的情况,其属于 cluster A 的概率肯定是要大于 cluster B的。 在 GMM 中,同样对数据先验进行了建模。
相似度衡量
在 k-means 中,我们通常采用 欧氏距离来衡量样本与各个 cluster 的相似度 。这种距离实际上假设了数据的 各个维度对于相似度的衡量作用是一样的 。 但在 GMM 中,相似度的衡量使用的是后验概率
通过引入协方差矩阵,我们就可以对各维度数据的不同重要性进行建模。
数据分配
在 k-means 中,各个 样本点只属于与其相似度最高的那个cluster ,这实际上是一种 hard clustering 。 在 GMM 中则使用的是后验概率来对各个cluster 按比例分配,是一种 fuzzy clustering 。
Hierarchical Clustering 与 K-Means 和 GMM 这一派系的聚类算法不太相同:
K-Means 与 GMM 更像是一种 top-down 的思想,它们首先要解决的问题是,确定 cluster 数量,也就是 k 的取值。在确定了 k 后,再来进行数据的聚类。
Hierarchical Clustering 则是一种 bottom-up 的形式,先有数据,然后通过不断选取最相似的数据进行聚类。
K-Means业界用得多的原因之一就是 收敛快 ,现在还能通过分布式计算加速,别的原因有调参就一个K。
链接:>
以下介绍的课程主要针对零基础大数据工程师每个阶段进行通俗易懂简易介绍,方面大家更好的了解大数据学习课程。课程框架是科多大数据的零基础大数据工程师课程。
一、第一阶段:静态网页基础(HTMLCSS)
1难易程度:一颗星
2课时量(技术知识点阶段项目任务综合能力)
3主要技术包括:html常用标签、CSS常见布局、样式、定位等、静态页面的设计制作方式等
4描述如下:
从技术层面来说,该阶段使用的技术代码很简单、易于学习、方便理解。从后期课程层来说,因为我们重点是大数据,但前期需要锻炼编程技术与思维。经过我们多年开发和授课的项目经理分析,满足这两点,目前市场上最好理解和掌握的技术是J2EE,但J2EE又离不开页面技术。所以第一阶段我们的重点是页面技术。采用市场上主流的HTMlCSS。
二、第二阶段:JavaSEJavaWeb
1难易程度:两颗星
2课时量(技术知识点阶段项目任务综合能力)
3主要技术包括:java基础语法、java面向对象(类、对象、封装、继承、多态、抽象类、接口、常见类、内部类、常见修饰符等)、异常、集合、文件、IO、MYSQL(基本SQL语句 *** 作、多表查询、子查询、存储过程、事务、分布式事务)JDBC、线程、反射、Socket编程、枚举、泛型、设计模式
4描述如下:
称为Java基础,由浅入深的技术点、真实商业项目模块分析、多种存储方式的设计
与实现。该阶段是前四个阶段最最重要的阶段,因为后面所有阶段的都要基于此阶段,也是学习大数据紧密度最高的阶段。本阶段将第一次接触团队开发、产出具有前后台(第一阶段技术第二阶段的技术综合应用)的真实项目。
三、第三阶段:前端框架
1难易程序:两星
2课时量(技术知识点阶段项目任务综合能力):64课时
3主要技术包括:Java、Jquery、注解反射一起使用,XML以及XML解析、解析dom4j、jxab、jdk80新特性、SVN、Maven、easyui
4描述如下:
前两个阶段的基础上化静为动,可以实现让我们网页内容更加的丰富,当然如果从市场人员层面来说,有专业的前端设计人员,我们设计本阶段的目标在于前端的技术可以更直观的锻炼人的思维和设计能力。同时我们也将第二阶段的高级特性融入到本阶段。使学习者更上一层楼。
四、第四阶段:企业级开发框架
1难易程序:三颗星
2课时量(技术知识点阶段项目任务综合能力)
3主要技术包括:Hibernate、Spring、SpringMVC、log4jslf4j整合、myBatis、struts2、Shiro、redis、流程引擎activity,爬虫技术nutch,lucene,、Tomcat集群和热备、MySQL读写分离
4描述如下:
如果将整个JAVA课程比作一个糕点店,那前面三个阶段可以做出一个武大郎烧饼(因为是纯手工-太麻烦),而学习框架是可以开一个星巴克(高科技设备-省时省力)。从J2EE开发工程师的任职要求来说,该阶段所用到的技术是必须掌握,而我们所授的课程是高于市场(市场上主流三大框架,我们进行七大框架技术传授)、而且有真实的商业项目驱动。需求文档、概要设计、详细设计、源码测试、部署、安装手册等都会进行讲解。
五、第五阶段:初识大数据
1难易程度:三颗星
2课时量(技术知识点阶段项目任务综合能力)
3主要技术包括:大数据前篇(什么是大数据,应用场景,如何学习大数据库,虚拟机概念和安装等)、Linux常见命令(文件管理、系统管理、磁盘管理)、LinuxShell编程(SHELL变量、循环控制、应用)、Hadoop入门(Hadoop组成、单机版环境、目录结构、HDFS界面、MR界面、简单的SHELL、java访问hadoop)、HDFS(简介、SHELL、IDEA开发工具使用、全分布式集群搭建)、MapRece应用(中间计算过程、Java *** 作MapRece、程序运行、日志监控)、Hadoop高级应用(YARN框架介绍、配置项与优化、CDH简介、环境搭建)、扩展(MAP端优化,COMBINER使用方法见,TOPK,SQOOP导出,其它虚拟机VM的快照,权限管理命令,AWK与SED命令)
4描述如下:
该阶段设计是为了让新人能够对大数据有一个相对的大概念怎么相对呢在前置课程JAVA的学习过后能够理解程序在单机的电脑上是如何运行的。现在,大数据呢大数据是将程序运行在大规模机器的集群中处理。大数据当然是要处理数据,所以同样,数据的存储从单机存储变为多机器大规模的集群存储。
(你问我什么是集群好,我有一大锅饭,我一个人可以吃完,但是要很久,现在我叫大家一起吃。一个人的时候叫人,人多了呢是不是叫人群啊!)
那么大数据可以初略的分为:大数据存储和大数据处理所以在这个阶段中呢,我们课程设计了大数据的标准:HADOOP大数据的运行呢并不是在咋们经常使用的WINDOWS7或者W10上面,而是现在使用最广泛的系统:LINUX。
六、第六阶段:大数据数据库
1难易程度:四颗星
2课时量(技术知识点阶段项目任务综合能力)
3主要技术包括:Hive入门(Hive简介、Hive使用场景、环境搭建、架构说明、工作机制)、HiveShell编程(建表、查询语句、分区与分桶、索引管理和视图)、Hive高级应用(DISTINCT实现、groupby、join、sql转化原理、java编程、配置和优化)、hbase入门、HbaseSHELL编程(DDL、DML、Java *** 作建表、查询、压缩、过滤器)、细说Hbase模块(REGION、HREGIONSERVER、HMASTER、ZOOKEEPER简介、ZOOKEEPER配置、Hbase与Zookeeper集成)、HBASE高级特性(读写流程、数据模型、模式设计读写热点、优化与配置)
4描述如下:
该阶段设计是为了让大家在理解大数据如何处理大规模的数据的同时。简化咋们的编写程序时间,同时提高读取速度。
怎么简化呢在第一阶段中,如果需要进行复杂的业务关联与数据挖掘,自行编写MR程序是非常繁杂的。所以在这一阶段中我们引入了HIVE,大数据中的数据仓库。这里有一个关键字,数据仓库。我知道你要问我,所以我先说,数据仓库呢用来做数据挖掘分析的,通常是一个超大的数据中心,存储这些数据的呢,一般为ORACLE,DB2,等大型数据库,这些数据库通常用作实时的在线业务。
总之,要基于数据仓库分析数据呢速度是相对较慢的。但是方便在于只要熟悉SQL,学习起来相对简单,而HIVE呢就是这样一种工具,基于大数据的SQL查询工具,这一阶段呢还包括HBASE,它为大数据里面的数据库。纳闷了,不是学了一种叫做HIVE的数据“仓库”了么HIVE是基于MR的所以查询起来相当慢,HBASE呢基于大数据可以做到实时的数据查询。一个主分析,另一个主查询
七、第七阶段:实时数据采集
1难易程序:四颗星
2课时量(技术知识点阶段项目任务综合能力)
3主要技术包括:Flume日志采集,KAFKA入门(消息队列、应用场景、集群搭建)、KAFKA详解(分区、主题、接受者、发送者、与ZOOKEEPER集成、Shell开发、Shell调试)、KAFKA高级使用(java开发、主要配置、优化项目)、数据可视化(图形与图表介绍、CHARTS工具分类、柱状图与饼图、3D图与地图)、STORM入门(设计思想、应用场景、处理过程、集群安装)、STROM开发(STROMMVN开发、编写STORM本地程序)、STORM进阶(java开发、主要配置、优化项目)、KAFKA异步发送与批量发送时效,KAFKA全局消息有序,STORM多并发优化
4描述如下:
前面的阶段数据来源是基于已经存在的大规模数据集来做的,数据处理与分析过后的结果是存在一定延时的,通常处理的数据为前一天的数据。
举例场景:网站防盗链,客户账户异常,实时征信,遇到这些场景基于前一天的数据分析出来过后呢是否太晚了。所以在本阶段中我们引入了实时的数据采集与分析。主要包括了:FLUME实时数据采集,采集的来源支持非常广泛,KAFKA数据数据接收与发送,STORM实时数据处理,数据处理秒级别
八、第八阶段:SPARK数据分析
1难易程序:五颗星
2课时量(技术知识点阶段项目任务综合能力)
3主要技术包括:SCALA入门(数据类型、运算符、控制语句、基础函数)、SCALA进阶(数据结构、类、对象、特质、模式匹配、正则表达式)、SCALA高级使用(高阶函数、科里函数、偏函数、尾迭代、自带高阶函数等)、SPARK入门(环境搭建、基础结构、运行模式)、Spark数据集与编程模型、SPARKSQL、SPARK进阶(DATAFRAME、DATASET、SPARKSTREAMING原理、SPARKSTREAMING支持源、集成KAFKA与SOCKET、编程模型)、SPARK高级编程(Spark-GraphX、Spark-Mllib机器学习)、SPARK高级应用(系统架构、主要配置和性能优化、故障与阶段恢复)、SPARKMLKMEANS算法,SCALA隐式转化高级特性
4描述如下:
同样先说前面的阶段,主要是第一阶段。HADOOP呢在分析速度上基于MR的大规模数据集相对来说还是挺慢的,包括机器学习,人工智能等。而且不适合做迭代计算。SPARK呢在分析上是作为MR的替代产品,怎么替代呢先说他们的运行机制,HADOOP基于磁盘存储分析,而SPARK基于内存分析。我这么说你可能不懂,再形象一点,就像你要坐火车从北京到上海,MR就是绿皮火车,而SPARK是高铁或者磁悬浮。而SPARK呢是基于SCALA语言开发的,当然对SCALA支持最好,所以课程中先学习SCALA开发语言。
在科多大数据课程的设计方面,市面上的职位要求技术,基本全覆盖。而且并不是单纯的为了覆盖职位要求,而是本身课程从前到后就是一个完整的大数据项目流程,一环扣一环。
比如从历史数据的存储,分析(HADOOP,HIVE,HBASE),到实时的数据存储(FLUME,KAFKA),分析(STORM,SPARK),这些在真实的项目中都是相互依赖存在的。
以下是一个使用Python编写的k-means聚类算法的示例代码,其中使用了NumPy和Matplotlib库。
import numpy as npimport matplotlibpyplot as pltdef k_means(X, K, max_iters): """
k-means聚类算法
:param X: 数据集,每一行代表一个样本
:param K: 聚类数
:param max_iters: 最大迭代次数
:return: 聚类中心和每个样本所属的簇
"""
m, n = Xshape # 初始化聚类中心
centroids = X[nprandomchoice(m, K, replace=False), :] # 迭代更新聚类中心
for i in range(max_iters): # 计算每个样本距离所有聚类中心的距离
distances = npsqrt(npsum((X[:, npnewaxis, :] - centroids) 2, axis=2)) # 找到距离每个样本最近的聚类中心
labels = npargmin(distances, axis=1) # 更新聚类中心
for j in range(K):
centroids[j, :] = npmean(X[labels == j, :], axis=0) return centroids, labels# 生成随机数据集X = nprandomrand(100, 2)# 调用k-means聚类算法centroids, labels = k_means(X, 3, 10)# 可视化结果pltscatter(X[:, 0], X[:, 1], c=labels)
pltscatter(centroids[:, 0], centroids[:, 1], c='r', marker='x')
pltshow()
该示例代码中,k_means函数接受三个参数:数据集X、聚类数K和最大迭代次数max_iters。在函数内部,首先随机选择K个样本作为初始聚类中心,然后迭代更新聚类中心,直到达到最大迭代次数或者聚类中心不再变化。在每次迭代中,计算每个样本距离所有聚类中心的距离,找到距离最近的聚类中心,并更新聚类中心的位置。最终返回聚类中心和每个样本所属的簇。
在示例代码中,我们生成了一个随机数据集,并将聚类数设置为3。运行程序后,可以看到数据集被分成了3个簇,并且聚类中心用红色的叉号表示。
兰德指数(Adjusted Rand index, ARI)
优点:对于均匀分布的数据,ARI接近于0;ARI的范围介入-1到1之间,-1表示分类效果不好,1表示分类效果好;不需要对簇结构进行预先估计,可以对不同的聚类算法进行评估。
缺点:需要知道数据的真实分类。
对兰德指数进行改进的原因是,原来的兰德指数不能保证即使在随机分类时,如在处理k=n此类型问题时趋近于0。对其进行改进之后可以避免这个缺陷。
互信息(Mutual Information based scores,MI)
互信息用来衡量两个分布一致性,并且忽略顺序。
直观上,互信息度量 X 和 Y 共享的信息:它度量知道这两个变量其中一个,对另一个不确定度减少的程度。例如,如果 X 和 Y 相互独立,则知道 X 不对 Y 提供任何信息,反之亦然,所以它们的互信息为零。
优点:随机的预测AMI会接近于0;最大上界为1,说明预测完全正确。
缺点:需要预先知道样本所属类,而类间差SSE不需要。
同质性(homogeneity),完整性(completeness),V-度量(V-measure)
同质性是指每个群集只包含单个类的成员。
完整性是指给定类的所有成员都分配给同一个群集。
V-度量是以上两者的调和平均数。
优点:0代表差,1代表好;不需要对簇结构进行假设,可以对不同聚类算法进行比较。
缺点:当簇数目比较大时,这三者的值都不会趋近于0;当样本数多于1000或者簇数目少于10时可以避免这个问题,其他情况可以选择适用ARI;另外这三个指标需要知道样本的真实分类。
Fowlkes-Mallows分数,简称FMI
FMI定义为成对精度和召回率的几何平均值。
优点:随机预测值趋近于0;上限为1,表示预测完全正确;不需要对簇类型进行假设。
缺点:需要知道样本类别。
轮廓系数
在K-Means(一)中有详细说明,此处从简。
优点:不需要知道样本标签;-1表示存在错误聚类,0表示有交叉的簇,1表示高密度聚类。
缺点:凸形簇的轮廓系数通常高于其他类型的簇。
Calinski-Harabaz Index,简称CHI
如果不知道样本的标签,CHI可以用来评估模型。值越高说明聚类效果越好。该指数基于类间差和类内差,并且对k的增加有惩罚。
优点:易计算(比轮廓系数快很多);当类聚合地很好,类间差距很大时,该值增大,反映了簇的标准概念。
缺点:对于凸形簇,该值会很大,但是对于其他类型簇,如基于密度型,该值无可奈何。
Davies-Bouldin Index,简称DBI
真实分类未知,可以用DBI来评估聚类效果。值越小越好,最佳值为0,代表分类完全正确。
优点:计算较轮廓系数简单;该指数只计算与数据集固有的数量和特征。
缺点:对于凸性簇,该值会高一点;质心距离限制距离度量欧氏空间;良好的值并不意味着最好的分类结果。
总结:共有7类度量方法,有监督的4类,无监督的3类,加上SSE,无监督也有4类。
参 考文献:
23 Clustering >
A=imread('1jpg');
figure;
imshow(A);
title('Hawk');
cform=makecform('srgb2lab');
lab_A=applycform(A,cform); 这里为什么要转去lab空间,其他的转换不好用吗?对于颜色分割的吧 lab空间相互分量联系性比较小 利于分割
ab = double(lab_A(:,:,2:3));
nrows = size(ab,1);
ncols = size(ab,2);
ab = reshape(ab,nrowsncols,2);矩阵转换类型转换为double型,这里的转换有其他的灵活用法吗?
nColors =2;
% 采用k-means方法实现聚类,重复三次
[cluster_idx cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean',
'Replicates',3); 这一段东西后面的省略号是啥意思啊?省略号表示一行写不完 分行的 意思就是kmeans(ab,nColors,'distance','sqEuclidean', 'Replicates',3); 一样的
%对不同的类别进行标志
pixel_labels = reshape(cluster_idx,nrows,ncols); 这里也是矩阵转换吗?恩师矩阵转化 你最好看看help
figure;
imshow(pixel_labels,[]), title('聚类以后的现实');
%分类后的矩阵
segmented_images = cell(1,3);
rgb_label = repmat(pixel_labels,[1 1 3]);
for k = 1:nColors
color = A;
color(rgb_label ~= k) = 0;
segmented_images{k} = color;
end
figure;
imshow(segmented_images{1}), title('objects in cluster 1');
figure;
imshow(segmented_images{2}), title('objects in cluster 2');
这段代码运行,对于有什么要求吗,这点很重要,请高手一定要指点下,小弟感恩不尽。我运行后显示
ans =
import javautilScanner;
public class Factor {
public static void main(String[] args) {
Scanner in = new Scanner(Systemin);
int a = innextInt();
Systemoutprint(a+"的所有因子是:");
int k; boolean result;
for(int i = 1;i<=a;i++){
if(a%i==0){
k=i;
result = isPrime(k);//调用方法要传参数
if(result == true){
Systemoutprintln(" "+k);//这个是java程序。不能用C++的显示方式
}
}
}
}
//isPrime()是一个方法,不能在方法内定义,而且要带参数的时候,要带类型
public static boolean isPrime(int k)
{
long m= Mathround(Mathsqrt(k));
if(k==2)return true;
for(int j = 3; j<=m; j++){
if (k%j==0)return false;
}
return true;
}
}
问题导入
假如有这样一种情况,在一天你想去某个城市旅游,这个城市里你想去的有70个地方,现在你只有每一个地方的地址,这个地址列表很长,有70个位置。事先肯定要做好攻略,你要把一些比较接近的地方放在一起组成一组,这样就可以安排交通工具抵达这些组的“某个地址”,然后步行到每个组内的地址。那么,如何确定这些组,如何确定这些组的“某个地址”?答案就是聚类。而本文所提供的k-means聚类分析方法就可以用于解决这类问题。
一,聚类思想
所谓聚类算法是指将一堆没有标签的数据自动划分成几类的方法,属于无监督学习方法,这个方法要保证同一类的数据有相似的特征,如下图:
根据样本之间的距离或者说相似性,把越相似,差异越小的样本聚成一类(簇),最后形成多个簇,使同一个簇内部的样本相似度高,不同簇之间差异性高。
二,K-Means聚类分析算法
K-Means是一种基于自下而上的聚类分析方法,基本概念就是空间中有N个点,初始选择K个点作为中心聚类点,将N个点分别与K个点计算距离,选择自己最近的点作为自己的中心点,不断地更新中心聚集点。
相关概念:
K值:要得到的簇的个数
质心:每个簇的均值向量,即向量各维取品军即可
距离度量:常用欧几里得距离和余弦相似度(先标准化)
两点之间的距离:
算法流程:
1 首先确定一个K值,即我们希望将数据集经过聚类得到 K个集合;
2 从数据集中随机选择K个数据点作为质心;
3 对数据集中每一个点,计算其与每个质心的距离(如欧式距离),离哪个质心近,就划分到哪个质心所属的集合
4 把所有数据归好集合,一共有K个集合,然后重新计算每个集合的质心;
5 如果新计算出来的质心和原来的质心之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),我们可以认为聚类已经达到期望的结果,算法终止。
6 如果新质心和原质心距离变化大,需要迭代3-5步骤
K-means实现过程
K-means 聚类算法是一种非监督学习算法,被用于非标签数据(data without defined categories or groups)。该算法使用迭代细化来产生最终结果。算法输入的是集群的数量 K 和数据集。数据集是每个数据点的一组功能。
算法从 Κ 质心的初始估计开始,其可以随机生成或从数据集中随机选择 。然后算法在下面两个步骤之间迭代:
1数据分配:
每个质心定义一个集群。在此步骤中,基于平方欧氏距离将每个数据点分配到其最近的质心。更正式一点, ci 属于质心集合 C ,然后每个数据点 x 基于下面的公式被分配到一个集群中。
其中 dist(·)是标准(L2)欧氏距离。让指向第 i 个集群质心的数据点集合定为 Si 。
2 质心更新:
在此步骤中,重新计算质心。这是通过获取分配给该质心集群的所有数据点的平均值来完成的。公式如下:
K-means 算法在步骤 1 和步骤 2 之间迭代,直到满足停止条件(即,没有数据点改变集群,距离的总和最小化,或者达到一些最大迭代次数)。
K 值的选择
上述算法找到特定预选 K 值和数据集标签。为了找到数据中的集群数,用户需要针对一系列 K 值运行 K-means 聚类算法并比较结果。通常,没有用于确定 K 的精确值的方法,但是可以使用以下技术获得准确的估计。
Elbow point 拐点方法
通常用于比较不同 K 值的结果的度量之一是数据点与其聚类质心之间的平均距离。由于增加集群的数量将总是减少到数据点的距离,因此当 K 与数据点的数量相同时,增加 K 将总是减小该度量,达到零的极值。因此,该指标不能用作唯一目标。相反,绘制了作为 K 到质心的平均距离的函数,并且可以使用减小率急剧变化的“拐点”来粗略地确定 K 。
DBI(Davies-Bouldin Index)
DBI 是一种评估度量的聚类算法的指标,通常用于评估 K-means 算法中 k 的取值。简单的理解就是:DBI 是聚类内的距离与聚类外的距离的比值。所以,DBI 的数值越小,表示分散程度越低,聚类效果越好。
还存在许多用于验证 K 的其他技术,包括交叉验证,信息标准,信息理论跳跃方法,轮廓方法和 G 均值算法等等。
三,数学原理
K-Means采用的启发式很简单,可以用下面一组图来形象的描述:
上述a表达了初始的数据集,假设 k=2 。在图b中,我们随机选择了两个 k 类所对应的类别质点,即图中的红色质点和蓝色质点,然后分别求样本中所有点到这两个质心的距离,并标记每个样本类别为和该样本距离最小的质心的类别,如图c所示,经过计算样本和红色质心和蓝色质心的距离,我们得到了所有样本点的第一轮迭代后的类别。此时我们对我们当前标记为红色和蓝色的点分别求其新的质心,如图d所示,新的红色质心和蓝色质心大热位置已经发生了变化。图e和图f重复了我们在图c和图d的过程,即将所有点的类别标记为距离最近的质心的类别并求出新的质心。最终我们得到的两个类别如图f
四,实例
坐标系中有六个点:
1、我们分两组,令K等于2,我们随机选择两个点:P1和P2
2、通过勾股定理计算剩余点分别到这两个点的距离:
3、第一次分组后结果:
组A:P1
组B:P2、P3、P4、P5、P6
4、分别计算A组和B组的质心:
A组质心还是P1=(0,0)
B组新的质心坐标为:P哥=((1+3+8+9+10)/5,(2+1+8+10+7)/5)=(62,56)
5、再次计算每个点到质心的距离:
6、第二次分组结果:
组A:P1、P2、P3
组B:P4、P5、P6
7、再次计算质心:
P哥1=(133,1)
P哥2=(9,833)
8、再次计算每个点到质心的距离:
9、第三次分组结果:
组A:P1、P2、P3
组B:P4、P5、P6
可以发现,第三次分组结果和第二次分组结果一致,说明已经收敛,聚类结束。
五、K-Means的优缺点
优点:
1、原理比较简单,实现也是很容易,收敛速度快。
2、当结果簇是密集的,而簇与簇之间区别明显时, 它的效果较好。
3、主要需要调参的参数仅仅是簇数k。
缺点:
1、K值需要预先给定,很多情况下K值的估计是非常困难的。
2、K-Means算法对初始选取的质心点是敏感的,不同的随机种子点得到的聚类结果完全不同 ,对结果影响很大。
3、对噪音和异常点比较的敏感。用来检测异常值。
4、采用迭代方法, 可能只能得到局部的最优解,而无法得到全局的最优解 。
六、细节问题
1、K值怎么定?
答:分几类主要取决于个人的经验与感觉,通常的做法是多尝试几个K值,看分成几类的结果更好解释,更符合分析目的等。或者可以把各种K值算出的 E 做比较,取最小的 E 的K值。
2、初始的K个质心怎么选?
答:最常用的方法是随机选,初始质心的选取对最终聚类结果有影响,因此算法一定要多执行几次,哪个结果更reasonable,就用哪个结果。 当然也有一些优化的方法,第一种是选择彼此距离最远的点,具体来说就是先选第一个点,然后选离第一个点最远的当第二个点,然后选第三个点,第三个点到第一、第二两点的距离之和最小,以此类推。第二种是先根据其他聚类算法(如层次聚类)得到聚类结果,从结果中每个分类选一个点。
3、关于离群值?
答:离群值就是远离整体的,非常异常、非常特殊的数据点,在聚类之前应该将这些“极大”“极小”之类的离群数据都去掉,否则会对于聚类的结果有影响。但是,离群值往往自身就很有分析的价值,可以把离群值单独作为一类来分析。
4、单位要一致!
答:比如X的单位是米,Y也是米,那么距离算出来的单位还是米,是有意义的。但是如果X是米,Y是吨,用距离公式计算就会出现“米的平方”加上“吨的平方”再开平方,最后算出的东西没有数学意义,这就有问题了。
5、标准化
答:如果数据中X整体都比较小,比如都是1到10之间的数,Y很大,比如都是1000以上的数,那么,在计算距离的时候Y起到的作用就比X大很多,X对于距离的影响几乎可以忽略,这也有问题。因此,如果K-Means聚类中选择欧几里德距离计算距离,数据集又出现了上面所述的情况,就一定要进行数据的标准化(normalization),即将数据按比例缩放,使之落入一个小的特定区间。
以上就是关于K-Means聚类若干问题全部的内容,包括:K-Means聚类若干问题、Java循环创建多个对象后导致内存溢出!、做Java开发都需要学什么怎么学等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)