互联网
聚类分析案例(一篇文章透彻解读聚类分析及案例实操)

【限时优惠福利】数据定义未来,2016年5月12日-14日DTCC2016中国数据库技术大会登陆北京!大会云集了国内外数据行业顶尖专家,设定2个主会场,24个分会场,将吸引共3000多名IT人士参会!马上领取数盟专属购票优惠88折上折,猛戳文末“阅读原文”抢先购票!

1 聚类分析介绍

聚类就是一种寻找数据之间一种内在结构的技术。聚类把全体数据实例组织成一些相似组,而这些相似组被称作聚类。处于相同聚类中的数据实例彼此相同,处于不同聚类中的实例彼此不同。聚类技术通常又被称为无监督学习,因为与监督学习不同,在聚类中那些表示数据类别的分类或者分组信息是没有的。

一篇文章透彻解读聚类分析及案例实操nerror="javascript:errorimg.call(this);">

目前在存在大量的聚类算法,算法的选择取决于数据的类型、聚类的目的和具体应用。大体上,主要的聚类算法分为几大类。

聚类算法的目的是将数据对象自动的归入到相应的有意义的聚类中。追求较高的类内相似度和较低的类间相似度是聚类算法的指导原则。一个聚类算法的优劣可以从以下几个方面来衡量:

(2)处理不同类型属性的能力:许多算法是针对基于区间的数值属性而设计的,但是有些应用需要针对其它数据类型(如符号类型、二值类型等)进行处理;

(4)输入参数的最小化:要求用户输入重要的参数不仅加重了用户的负担,也使聚类的质量

(5)对输入顺序的不敏感:不能因为有不同的数据提交顺序而使聚类的结果不同;

或三维数据,而需要在高维空间中发现有意义的聚类;

有较好聚类质量的算法也是一项重要的任务;

1.3 聚类应用

2 kmeans 算法

划分聚类算法是根据给定的n 个对象或者元组的数据集,构建k 个划分聚类的方法。每个划分即为一个聚簇,并且k n。该方法将数据划分为k 个组,每个组至少有一个对象,每个对象必须属于而且只能属于一个组。1该方法的划分采用按照给定的k 个划分要求,先给出一个初始的划分,然后用迭代重定位技术,通过对象在划分之间的移动来改进划分。

2.2 算法步骤

步骤一:将所有对象随机分配到k 个非空的簇中。

步骤三:根据每个对象与各个簇中心的距离,分配给最近的簇。

其中, k 表示需要聚集的类的数目, Cj表示第j 个聚类,mj表示聚类Cj的聚类中心,

SAS kmeans 实现主要是通过proc fastclus 过程实现,示例如下:

delimiter=’09’x;

run;

run;

var Mpg Weight Drive_Ratio Horsepower Displacement;

proc fastclus data=stdcars summary maxc=5 maxiter=99

id Car;

run;

k-means 算法对于大型的数据库是相对高效的,一般情况下结束于局部最优解。但是,k-means 算法必须在平均值有意义的情况下才能使用,对分类变量不适用,事先还要给定生成聚类的数目,对异常数据和数据噪声比较敏感,不能对非凸面形状的数据进行处理。另外,k-means 算法在聚类过程中可能有的聚类中心没有被分配任何数据而使得某些聚类变为空,这些聚类通常被称为空聚类。为了解决空聚类问题,我们可以选择一个数据点作为替代的聚类中心。例如,某一个含有大量数据的聚类的聚簇中心最远的数据点。如果算法的终止条件取决于误差平方和,具有最大误差平方和的聚类可以被用来寻找另外的聚类中心。

3.1 基本思想

层次聚类技术是一种无监督学习的技术,因此可能没有确定的、一致的正确答案。正是由于这个原因,并且在聚类的特定应用的基础之上,可以设计出较少或较多数量的簇。定义了一个聚类层次,就可以选择希望数量的簇。在极端的情况下,所有的对象都自成一簇。在这样的情形下,聚类的对象之间非常相似,并且不同于其他的聚类。当然,这种聚类技术就失去了实际意义,因为聚类的目的是寻找数据集中的有意义的模式,方便用户理解,而任何聚类的数目和数据对象一样多的聚类算法都不能帮助用户更好地理解数据,挖掘数据隐藏的真实含义。这样,关于聚类的很重要的一点就是应该比原先的数据的数目更少的簇。到底要形成多少个聚类数目,要根据实际业务的理解,这是如何解释实际项目的事情。层次聚类算法的好处是它可以让用户从这些簇中选择所感兴趣的簇,这样更具有灵活性。

基于层次的聚类算法方法比较简单,但是缺乏伸缩性,一旦一个合并或者分裂被执行,就不能撤销。为了改进层次聚类的效果,可以将层次聚类算法和其他聚类算法结合使用,形成多阶段的聚类算法。

层次聚类(hierarchical clustering)算法递归的对对象进行合并或者分裂,直到满足某一终止条件为止。层次聚类分为两种,按自底向上层次分解称为聚合的层次聚类,反之,称为分解的层次聚类。层次聚类算法的计算复杂度为O(n2),适合小型数据集的分类。

SAS实例

title h = 1 j = l ‘File: cluster.mammalsteeth.sas’;

data teeth;

@wf0007 (v1-v8) (1.);

v2=’Bottom incisors’

v4=’Bottom canines’

v6=’Bottom premolars’

v8=’Bottom molars’;

BROWN BAT 23113333

SILVER HAIR BAT 23112333

HOUSE BAT 23111233

PIKA 21002233

BEAVER 11002133

GRAY SQUIRREL 11001133

PORCUPINE 11001133

BEAR 33114423

MARTEN 33114412

WOLVERINE 33114412

RIVER OTTER 33114312

JAGUAR 33113211

FUR SEAL 32114411

GREY SEAL 32113322

REINDEER 04103333

DEER 04003333

;

var v1-v8;

proc cluster data=teeth2 method=average outtree=ttree

var v1-v8;

id mammal;

proc tree data=ttree out=ttree2 nclusters=4;

id mammal;

proc sort data=teeth2;

by mammal;

proc sort data=ttree2;

by mammal;

data teeth3;

by mammal;

symbol1 c=black f=, v=’1′;

symbol3 c=black f=, v=’3′;

proc gplot;

plot prin2*prin1=cluster;

proc sort;

by cluster;

proc print;

var mammal prin1 prin2;

4 SAS聚类分析案例

考虑下面案例,一个棒球管理员希望根据队员们的兴趣相似性将他们进行分组。显然,在该例子中,没有响应变量。管理者希望能够方便地识别出队员的分组情况。同时,他也希望了解不同组之间队员之间的差异性。

一篇文章透彻解读聚类分析及案例实操nerror="javascript:errorimg.call(this);">

2 聚类方法概述

1) 建立初始数据流

2) 设置输入数据源结点

从SAMPSIO库中选择DMAbase数据集

探索变量的分布和描述性统计信息

关闭输入数据源结点,并保存信息。

虽然并不是总是要处理缺失值,但是有时候缺失值的数量会影响聚类结点产生的聚类解决方案。为了产生初始聚类,聚类结点往往需要一些完整的观测值。当缺失值太多的时候,需要用替代结点来处理。虽然这并不是必须的,但是在本例中使用到了。

打开聚类结点,激活变量选项卡。K-means聚类对输入数据是敏感的。一般情况下,考虑对数据集进行标准化处理。

选择聚类选项卡

关闭聚类结点

5) 聚类结果

一篇文章透彻解读聚类分析及案例实操nerror="javascript:errorimg.call(this);">

打开聚类结点

在聚类数目选择部分,点击选择标准按钮

点击ok,关闭聚类结点

7)结果解释

一篇文章透彻解读聚类分析及案例实操nerror="javascript:errorimg.call(this);">

一篇文章透彻解读聚类分析及案例实操nerror="javascript:errorimg.call(this);">

一篇文章透彻解读聚类分析及案例实操nerror="javascript:errorimg.call(this);">

同理,可以根据该方法对其他类别进行解释。

Insight结点可以用来比较不同属性之间的异常。打开insight结点,选择整个数据集,关闭结点。

变量_SEGMNT_标识类别,distance标识观测值到所在类别中心的距离。运用insight窗口的analyze工具评估和比较聚类结果。

R语言篇

###### 代码清单 #######

iris.hc <- hclust( dist(iris[,1:4]))

plclust( iris.hc, labels = FALSE, hang = -1)

iris.id <- cutree(iris.hc, 3)

###### 运行结果 #######

Species

1 50 0 0

3 0 27 1

一篇文章透彻解读聚类分析及案例实操nerror="javascript:errorimg.call(this);">

仍以R基础包自带的鸢尾花(Iris)数据进行K-均值聚类分析,分析代码如下:

library(fpc)

df<-iris[,c(1:4)]

(kmeans <- kmeans(na.omit(df), 3)) # 显示K-均值聚类结果

生成的图如下:

一篇文章透彻解读聚类分析及案例实操nerror="javascript:errorimg.call(this);">

Python运行条件:

2.Matplotlib.pyplot图形库,可用于快速绘制2D图表,与matlab中的plot命令类似,而且用法也基本相同。

##

程序:kmeans算法

import matplotlib.pyplot as plt

import numpy

#dotOringalNum为各个分类最初的大小

#dotAddNum最后测试点的数目

fig = plt.figure

sets=

#第一个分类,颜色为蓝色,在左下角

txx=0.0

for i in range(0,dotOringalNum):

ty=float(random.randint(1000,3000))/100

txx+=tx

#ax.plot([tx],[ty],color=colors[0],linestyle=”,marker=’.’)

a.insert(0,[txx,tyy])

#第二个分类,颜色为绿色,在右上角

txx=0.0

for i in range(0,dotOringalNum):

ty=float(random.randint(4000,6000))/100

txx+=tx

#ax.plot([tx],[ty],color=colors[1],linestyle=”,marker=’.’)

sets.append(b)

c=

txx=0.0

for i in range(0,dotOringalNum):

ty=float(random.randint(4000,6000))/100

c.append([tx,ty])

txx+=tx

#ax.plot([tx],[ty],color=colors[2],linestyle=”,marker=’.’)

c.insert(0,[txx,tyy])

#第四个分类,颜色为黄色,在右下角

txx=0

for i in range(0,dotOringalNum):

ty=float(random.randint(1000,3000))/100

txx+=tx

#ax.plot([tx],[ty],color=colors[3],linestyle=”,marker=’.’)

sets.append(d)

for i in range(0,dotAddNum):

ty=float(random.randint(0,7000))/100

setBelong=0

length=len(sets[j])-1

centY=sets[j][0][1]/length

运行效果:

一篇文章透彻解读聚类分析及案例实操nerror="javascript:errorimg.call(this);">


顶一下()     踩一下()

热门推荐

发表评论
0评