Boosting集合算法详解(一)

本文是关于聚类算法的第二篇K-means,感兴趣的同学可以前往http://ihoge.cn/2018/clustering.html
阅读完整版。

二、K-means

1. 算法步骤

<1> 选择KK个点作为初始质心
<2> Repeat:
<3> 将每个点指派到最近的质心,形成K个簇
<4> 重新计算每个簇的质心
<5> Until: 质心不发生变化终止

2. 距离的度量

闵可夫斯基距离

闵可夫斯基距离不是一种距离,而是一类距离的定义。对于 n 维空间中的两个点 x(x1,x2,x3,...,xn)x(x1,x2,x3,...,xn)y(y1,y2,y3,...,yn)y(y1,y2,y3,...,yn),那么xxy亮点之间的闵可夫斯基距离为:

dxy=i=1n(xiyi)pdxy=∑i=1n(xi−yi)p

其中p是一个可变参数:

  • 当p=1时,被称为曼哈顿距离
  • 当p=2时,被称为欧式距离
  • 当p=时,被称为切比雪夫距离。

余弦相似度

cos(Θ)=aTb|a||b|cos(Θ)=aTb|a|∗|b|

  • a,ba,b表示两个向量,|a||a||b||b|表示向量的模。 余弦相似度一般衡量两个向量的相似情况,常用与文本处理。余弦角越小越相似。

杰卡德(Jaccard)相似系数

J(A,B)=|AB||AB|J(A,B)=|A⋂B||A⋃B|

  • 这里,ABA、B表示集合,ABA⋂B表示两个集合公共元素的个数,ABA⋃B表示两个集合并集元素的个数。 Jaccard 相似系数适用于度量两个集合的相似程度,取值在 0~1 之间,越大越相似。在推荐系统中常用衡量客户或商品的相似度。

3. 变量标准化

在聚类前,通常需要对个连续变量进行标准化,因为方差大的变量比方差晓得变量对距离或相似度的影响更大,从而对聚类结果的影响更大。

常用的方法有:

正态标准化xi=ximean(X)std(Xxi=xi−mean(X)std(X
归一化xi=ximin(X)max(X)min(X)xi=xi−min(X)max(X)−min(X)

4. 变量的维度分析

假设一组变量中,一个维度有5个变量,二另一个维度只有1个变量,则第一个维度的权重被明显提高了。一般情况下,每个维度上使用的变量个数应该是一样的,不过分析人员要结合具体场景不同维度提供不同数量的变量个数,这相当于加大了一些维度的权重。

除了机遇业务定义进行变量的选择,另一种常用的方法是在聚类之前进行主成分分析。

5. 质心的目标函数

5.1 SSE 误差平方和

聚类的目标通常用一个目标函数表示,该函数依赖于点之间,或点到簇的质心的临近性;
如,考虑临近性度量为欧几里得距离的数据,我们使用误差平方和(SSE)作为度量聚类质量的目标函数,即最小化簇中点到质心的距离平方和。 SSE也称散布(scatter),定义如下:

SSE=Ki=1xCidist(ci,x)2SSE=∑i=1K∑x∈Cidist(ci,x)2

其中, distdist是欧几里得空间中两个对象之间的标准欧几里得距离。

给定这些假设,实际上可以证明:对 SSE 求导,另导数为 0 求解 ckck使簇的 SSE 最小的质心是均值

ckSSE=ckKi=1xCi(ci,x)2=0∂∂ckSSE=∂∂ck∑i=1K∑x∈Ci(ci,x)2=0

最终得到:

xCk2(ckxk)=0mkck=xCkxkck=1mkxCkxk∑x∈Ck2(ck−xk)=0⟹mkck=∑x∈Ckxk⟹ck=1mk∑x∈Ckxk

文档数据

考虑文档数据和余弦相似性度量。这里我们假定文档数据用文档——词矩阵表示,我们的目标是最大化簇中文档与簇的质心的相似性;该量乘坐簇的凝聚度(cohesion)。对于该目标,可以证明,与欧几里得数据一样,簇的质心是均值。总 SSE 的类似量是总凝聚度(total cohesion):

TotalCohesion=Ki=1xCicosine(ci,x)TotalCohesion=∑i=1K∑x∈Cicosine(ci,x)

关于凝聚度的知识,会在下文模型评估里面详细介绍

5.2 SAE 绝对误差和

为了表明KK均值可以用各种不同的目标函数,我们考虑如何将数据分成K个簇,使得点到其簇中心的曼哈顿距离之和最小。如下式绝对误差和(SAE)

SAE=Ki=1xCi|cix|SAE=∑i=1K∑x∈Ci|ci−x|

ckSAE=ckKi=1xCi|cix|=0∂∂ckSAE=∂∂ck∑i=1K∑x∈Ci|ci−x|=0

最终得到:

xCkck|ckx|=0xCksign(xck)=0ck=median{xCk}∑x∈Ck∂∂ck|ck−x|=0⟹∑x∈Cksign(x−ck)=0⟹ck=median{x∈Ck}

即簇中点的中位数。一组点的中位数的计是直截了当的,并且减少受离群值的影响。

5.3 常见的邻近度、质心和目标函数组合

邻近度函数质心目标函数
曼哈顿距离中位数最小化对象与质心的绝对误差和SAE
平方欧几里得距离均值最小化对象与质心的误差平方和SSE
余弦均值最大化对象与质心的余弦相似度和
Bregman散度均值最小化对象到质心的Bregman散度和

Bregman散度实际上是一类紧邻性度量,包括平方欧几里得距离。Bregman散度函数的重要性在于,任意这类函数都可以用作以均值为质心的 K-means 类型的聚类算法的基础。

6. 选择初始质心

当质心随机初始化时,K-means 将产生不同的总 SEE。选择适当的初始质心是基本 K-menas 过程的关键步骤。常见的是随机选取,但这种情况下簇的质量常常很差。考虑什么情况下选择的初始质心能找到最优解?答案是:每个簇刚好分到一个质心。事实证明发生这种情况的概率是非常非常低的。

常见一种技术是:多次运行,然后选取具有最小 SEE 的簇集。该策略虽然简单,但是效果可能不太好,依然是概率事件。

另一种有效的技术是:取一个样本,并使用层次聚类技术对他聚类。从层次聚类中提取 KK 个簇,并用这些簇的质心作为初始质心。该方法虽然有效,但仅对下列情况有效:(1)样本相对较小,例如数百到数千(层次聚类开销较大);(2)K 相对与样本大小较小。

还有一种方法是:随机选择第一个点或者所有点到质心作为第一个点。然后对于每个候机初始质心,选择里已经选取的初始质心最远的点,并且把该方法应用与点样本。 这样可以大大缓解可能会选择离群点作为质心的可能,并且大大减小计算量。

另外,我们也可以采用对初始化问题不太敏感的 K-means 的变种,二分K-means、使用后处理来“修补”
所产生的簇集

7. 时间复杂性和空间复杂性

  • 所需空间:O((m+K)n)O((m+K)n),m 是点数, n 是属性数

  • 所需时间:O(IKmn)O(I∗K∗m∗n)II<script type="math/tex" id="MathJax-Element-34">I</script> 是收敛所需迭代次数,通常很小,可以是有界的。

8. K-means 其他问题

8.1 处理空簇

K-means 存在的问题之一是:如果所有的点在指派的步骤都为分配到某个簇,就会得到空簇。这种情况下需要选择一个替补质心,否则误差将会偏大。

  • 方法一: 选择一个距离当前任何质心最远的点
  • 方法二: 从具有最大 SSE 的簇中选择一个替补质心。浙江分裂簇并降低聚类的总 SSE。

8.2 离群点

当然我们想到的第一反应是删除离群点,但是有些聚类应用,不能删除离群点。在某些情况下(财经分析),明显的离群点可能是最令人感兴趣的点。

那么问题来了,如何识别离群点?

  • 方法一:聚类前删除离群点
  • 方法二:后处理离群点。如删除那些具有不寻常影响的点(尤其是多次运行算法时),另外也可以删除那些很小的簇,他们尝尝代表离群点的组。

8.3 后处理降低 SSE

  • 增加簇个数

    • 分裂一个簇:通常选择具有最大 SSE 的簇,页可以分裂在特定属性上具有最大标准差的簇。
    • 引进一个新的质心:通常选择离所有质心最远的点。
  • 减少簇个数

    • 拆散一个簇: 通常选择拆散使总 SSE 增加最少的簇, 删除对应的质心
    • 合并两个簇: 通常选择合并质心最接近的两个簇,或者合并两个导致总 SSE 增加最少的簇。这两种方法与层次聚类使用的方法相同,分别乘坐质心方法和 Ward 方法。

9. 二分 K-means

二分 K-means 算法时基于 K-means 算法的直接扩充,它基于一种简单想法:为了得到 K 个簇,将所有点的集合分裂成两个簇,从这些簇中选取一个继续分裂,如此下去,知道产生 K 个簇。

算法实现步骤:

<1> 初始化簇表,是指包含有所有的点组成的簇。
<2> Repeat

<3> 从簇表中取出一个簇
<4> 对选出的簇进行多次二分“实验”
<5> for i = 1 to 试验次数 do:
<6> 使用基本 K-means,二分选定的簇
<7> end for
<8> 从二分实验中选择具有最小 SSE 的两个簇
<9> 将这两个簇添加到簇表中

<10> Until 簇表包含 K 个簇。

待分裂的簇有许多不同的选择方法。可以选择最大的簇,选择具有最大 SSE 的簇,或者使用一个基于大小和 SSE 的标准进行选择。不同的选择导致不同的簇。

我们通常使用结果簇的质心作为基本 K-means 的初始质心,对结果逐步求精。 因为尽管 K-means 可以保证找到使 SSE 局部最小的聚类,但是自二分 K-means 算法中,我们“局部地”使用了 K-means ,即二分个体簇。因此,最终的簇集并不代表使 SSE 局部最小的聚类。

10. K-means优缺点

10.1 优点

  • 简单并且可以用于各种数据类型;
  • 具备适合的空间复杂度和计算负责度,适用于大样本数据;
  • K-means 某些变种甚至更有效 (二分K-means)且不受初始化问题影响。

10.2 缺点

  • 不能处理非球形簇、不同尺寸和不同密度的簇;
  • 对离群点敏感;
  • K-means 仅限于具有中心(质心)概念的数据。有一种相关的 K-中心点聚类技术没有这种限制,但是开销更大。

参考文献:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292912.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一款不错的网站压力测试工具webbench

webbench最多可以模拟3万个并发连接去测试网站的负载能力  1、适用系统&#xff1a;Linux  2、编译安装&#xff1a; wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gztar zxvf webbench-1.5.tar.gzcd webbench-1.5make && make installUnbun…

WindowsPhone8可缩放图片控件的实现

xaml中添加: <ViewportControl x:Name"viewport" DoubleTap"OnDoubleTap"ManipulationStarted"OnManipulationStarted" ManipulationDelta"OnManipulationDelta" ManipulationCompleted"OnManipulationCompleted" Viewpo…

python导入自定义模块_Python3 导入自定义的包

什么是包&#xff1f; 要想知道什么是包&#xff0c;得先了解一下模块的概念。 模块是一个包含所有你定义的函数和变量的文件&#xff0c;其后缀名是 .py。模块可以被别的程序引入&#xff0c;以使用该模块中的函数等功能。 知道了模块&#xff0c;那紧接着看看包&#xff1a; …

Android之ComponentName的用法

ComponentName(组件名称)是用来打开其他应用程序中的Activity或服务的、 ComponentName,顾名思义,就是组件名称,通过调用Intent中的setComponent方法,我们可以打开另外一个应用中的Activity或者服务。 实例化一个ComponentName需要两个参数,第一个参数是要启动应用的包…

Linux入门之进程管理(4)之进程与文件

Linux入门之进程管理(4)之进程与文件前面使用进程相关命令管理工具都是根据进程编号或者进程名称及其其它属性信息来查看和处理相关进程的&#xff0c;但是在某些情况下&#xff0c;想要查看某个文件或者某个设备被哪些进程所使用&#xff0c;使用ps、pgrep等命令查询的是不够准…

巧用Hive自带函数进行多字段分别去重计数统计

巧用Hive自带函数进行多字段分别去重计数统计 1-group by 和 distinct 大前提&#xff1a;大表统计能使用group by就不要使用distinct&#xff01;&#xff01; 尤其是在数据量非常大的时候&#xff0c;distinct会将所有的统计信息加载到一个reducer里取执行&#xff0c;这就是…

初识MASA Blazor

MASA Blazor是一个Blazor的UI组件库。就像大家写前端熟知的Bootstrap, Ant Design一样。MASA Blazor官网地址&#xff1a;https://blazor.masastack.comMASA Blazor Github地址&#xff1a;https://github.com/BlazorComponent/MASA.BlazorMASA Blazor Pro演示地址&#xff1a;…

Thread.sleep还是TimeUnit.SECONDS.sleep

刚看到TimeUnit.SECONDS.sleep()方法时觉得挺奇怪的&#xff0c;这里怎么也提供sleep方法&#xff1f;public void sleep(long timeout) throws InterruptedException {if (timeout > 0) {long ms toMillis(timeout);int ns excessNanos(timeout, ms);Thread.sleep(ms, ns…

win7技巧

win7鼠标右键菜单清理 win7右键菜单设置 |浏览&#xff1a;7659|更新&#xff1a;2014-03-04 14:23|标签&#xff1a; windows7 鼠标 1234567分步阅读虽然我们现在打开某个软件都是双击解决完事&#xff0c;但是偶尔我们需要右键属性的时候&#xff0c;可以看到右键菜单拖拖拉拉…

shell基础一

Shell支持自定义变量。 定义变量 定义变量时&#xff0c;变量名不加美元符号&#xff08;$&#xff09;&#xff0c;如&#xff1a; variableName"value" 注意&#xff0c;变量名和等号之间不能有空格&#xff0c;这可能和你熟悉的所有编程语言都不一样。 同时&…

python画方波_python实现周期方波信号频谱图

在学习傅里叶变换的时候遇到了求周期方波信号频谱图的例子&#xff0c;在书上和网上查阅了一些资料&#xff0c;发现大都是讨论的都是下图左边的周期信号的频谱&#xff0c;课程老师的PPT中也只列出了另一种周期信号频谱图的结论&#xff0c;没有在进行傅里叶变换&#xff0c;自…

基于Python的电商平台淘宝商品评论数据采集与分析

引言 在电商竞争日益激烈的情况下&#xff0c;商家既要提高产品质量&#xff0c;又要洞悉客户的想法和需求&#xff0c;关注客户购买商品后的评论&#xff0c;而第三方API接口商家获取商品评价主要依赖于人工收集&#xff0c;不但效率低&#xff0c;而且准确度得不到保障。通过…

《Pyflink》Flink集群安装,Python+Flink调研

Flink集群安装&#xff0c;PythonFlink调研 Flink集群部署 下载对应版本安装包&#xff1a;https://flink.apache.org/downloads.html 实验环境为hadoop2.7&#xff0c; scala2.11 所以下载flink-1.7.1-bin-hadoop27-scala_2.11.tgz 配置conf/flink-conf.yaml jobmanager.rpc…

项目手札2---关于分页显示时地址栏的风格

在控制器里&#xff0c;用RequestMapping("")时我们可能用RESTFUL风格的来映射&#xff0c;也有可能是用其他的方式&#xff0c;用或不用RESTFUL风格在分页显示时的地址栏里有些不同。首先来看不用RESTFUL时地址栏的样子&#xff1a; <li><a href"show…

shell基础二

前面已经讲到&#xff0c;变量名只能包含数字、字母和下划线&#xff0c;因为某些包含其他字符的变量有特殊含义&#xff0c;这样的变量被称为特殊变量。例如&#xff0c;$ 表示当前Shell进程的ID&#xff0c;即pid&#xff0c;看下面的代码&#xff1a; $echo $$ 运行结果 29…

hdu 4539(状压dp)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4539 思路&#xff1a;跟poj1185简直就是如出一辙&#xff01; 1 #include<iostream>2 #include<cstdio>3 #include<cstring>4 #include<algorithm>5 using namespace std;6 7 int row…

万字长文入门 Redis 命令、事务、锁、订阅、性能测试

Redis 基本数据类型Redis 中&#xff0c;常用的数据类型有以下几种&#xff1a;String&#xff1a;字符串类型&#xff0c;二进制安全字符串&#xff1b;Hash&#xff1a;哈希表&#xff1b;List 列表&#xff1a;链表结构&#xff0c;按照插入顺序排序的字符串元素的集合&…