4月 17, 2011

Posted by in 统计应用 | 11 条评论

SAS多元分析之聚类(2)–proc fastclus

本文主要对SAS做聚类分析的proc fastclus步的应用做一个简单的摘录,相关的理论知识细节,请参见SAS help文档及其他统计学相关文献等。

1.简介

proc fastclus为动态聚类(又称快速聚类),以迭代思想为理论基础,先对样本观测粗略分类,然后按某种最优准则逐步修改分类至最优为止,其适用于观测量大的数据。
步骤为:

  1. 选择若干观测为初始“凝聚点”。(注:凝聚点必须是完整观测,即该观测的各个变量值不能有缺失存在。)

1) 系统顺序选取
2) 系统随机选取
3) 指定初始凝聚点

  1. 根据初始“凝聚点”进行初始分类。

1) 按批初始分类
2) 逐个初始分类

  1. 对分类进行逐步修改优化。

1) 按批修改法
2) 逐个修改法

  1. 确定最优分类。

2.proc fastclus

常用语法格式:

PROC FASTCLUS MAXCLUSTERS=n | RADIUS=t ;
VAR variables ;
ID variables ;

必须至少定义maxclusters=或radius=中的一个。

常用选项及语句说明:

data= 指定聚类过程的输入数据集,该数据集必须是观测样本(坐标数据)。

maxclusters=k 指定所允许的最大分类个数(最大凝聚点个数),缺省时假定为100。
radius=r 指定选取新凝聚点的最小距离准则,缺省是假定为0。

初始凝聚点系统顺序选取时,总是将第一个完整的观测选取为第一个凝聚点,再顺序选取需满足下面2个条件的完整观测为接下来的凝聚点:

1.凝聚点的个数未达到“maxclusters=”指定值;
2.与所有已有凝聚点间的距离均大于“radius=”指定值

直到不满足条件是为止。

replace=full|part|none|random 控制初始凝聚点选取的替换检验。

上述初始凝聚点系统顺序选取中:
若满足条件1而不满足条件2时,停止凝聚点的选取。
若满足条件2而不满足条件1时,对已选凝聚点进行替换检验。2种方式:

替换检验1:若当前观测(记obs)与自身最近的已选凝聚点之间的距离d大于已选凝聚点间相互的最小距离d_min(d_i,d_j)时,用当前观测替换已选凝聚点间距离最近的两个凝聚点中的一个,使得替换后当前观测与另一个凝聚点距离最远。
替换检验2:在不满足替换检验1的情况下,若obs到除最近凝聚点外的所有其他凝聚点的最小距离大于最近凝聚点到所有其他凝聚点的最小距离,则用obs替换与之距离最近的凝聚点。

“full”为缺省值,指定两种检验都进行;“part”指定进行第一种检验;“none”指定不进行检验


replace= random 指定初始凝聚点为系统随机选取

常与选项random=n一起使用,n为正整数,为生成伪随机数提供种子值,缺省时由计算机时间提供。

seed= 指定一个数据集,在其中选取初始凝聚点,即为指定初始凝聚点法

没有此选项时,将从“data=”指定的数据集中选取k个观测作为k类得初始凝聚点。

drift 指定逐个初始分类,并要求执行逐个修改法,缺省时执行按批修改法。

按批修改法准则是使所有的样品点与其凝聚点距离最近,等全部药品调整完毕后才改变类得凝聚点。逐个修改法是每个样品一旦调整后立即改变凝聚点,其又称为“K-means”,即K均值聚类。

maxiter= 指定修改法的最大迭代次数,缺省时为1,即样本初始分类。

converge=c 指定聚类迭代收敛的判别准则,当凝聚点改变的最大距离小于或等于初始凝聚点间的最小距离乘以c时,认为该聚类过程收敛,迭代结束,缺省时c为0.02。

out= 指定过程输出的数据集。

3.实例

仍使用多元分析之聚类(1)–proc cluster中摘用的《统计分析与SAS》(张晓冉 编著)的例11.1.1问题:根据2004年我国31个省市农民人均年生活消费支出情况,进行分类。

并且根据多元分析之聚类(1)–proc cluster中proc cluster的系统聚类法得到的分类数为5,设定proc fastclus最大分类上限maxclusters=5。

程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
data consume2004;
	input area$ x1-x8;
	label area="地区" x1='食品' x2='衣着' x3='居住' x4='家庭设备及服务' x5='医疗保健' x6='交通和通讯' x7='文教娱乐' x8='其他商品及服务';
datalines;
北京 1495.09 308.85 746.04 227.27 507.55 512.23 743.72 76.18
天津 1017.72 181.21 508.06 108.51 177.10 230.41 376.87 42.23
河北 780.09 127.06 340.88 80.42 115.97 176.60 182.56 31.33
山西 748.90 171.69 179.22 59.27 84.20 130.00 235.01 28.17
内蒙古 889.05 133.54 266.43 69.91 154.51 241.90 291.98 35.25
辽宁 962.00 154.97 290.08 72.58 145.19 186.77 217.95 43.42
吉林 899.00 133.54 216.82 62.08 161.16 214.97 237.34 46.31
黑龙江 750.57 123.87 388.87 49.87 131.04 175.85 188.51 28.78
上海 2191.15 279.73 1446.15 344.41 424.55 720.37 805.56 116.94
江苏 1317.88 163.53 467.62 141.43 163.16 293.07 373.39 72.47
浙江 1838.57 258.58 798.88 242.09 326.12 496.86 597.96 100.05
安徽 861.34 86.87 299.82 75.97 91.95 163.93 199.95 33.88
福建 1408.54 159.60 430.14 154.44 136.40 306.06 313.09 107.32
江西 1125.13 107.19 234.69 66.89 110.32 171.89 237.28 42.10
山东 1000.13 139.18 365.97 110.12 155.85 221.93 298.23 97.85
河南 808.27 108.08 268.72 63.68 95.22 121.17 168.04 30.91
湖北 1076.35 93.52 274.10 75.11 110.73 162.65 245.68 50.85
湖南 1338.65 112.38 293.23 92.37 124.12 174.53 279.96 57.05
广东 1581.68 116.83 494.89 131.17 153.17 350.27 314.34 98.44
广西 1047.58 64.42 311.48 64.87 83.64 140.13 178.83 37.65
海南 1027.90 58.96 134.00 83.16 86.57 133.77 164.42 56.59
重庆 1039.00 79.08 201.03 74.81 115.31 119.68 198.65 26.38
四川 1123.18 92.87 234.31 79.15 117.40 127.60 209.68 31.54
贵州 754.39 55.63 165.95 41.48 47.19 70.41 140.21 21.07
云南 848.30 61.87 239.29 61.78 87.66 105.52 143.20 23.42
西藏 941.08 157.87 118.55 75.55 28.93 89.16 37.84 21.72
陕西 686.38 91.78 237.32 65.46 118.12 126.13 258.83 34.04
甘肃 703.41 82.33 179.86 58.91 85.33 130.22 202.64 21.64
青海 813.35 121.83 233.16 65.48 126.60 176.41 108.14 31.48
宁夏 808.54 122.50 325.21 65.30 186.90 155.26 217.06 46.05
新疆 763.43 138.88 304.81 56.03 141.97 131.59 126.92 26.28
;
run;
proc fastclus data=consume2004 maxclusters=5 radius=0 replace=full out=fast_out outiter outseed=fast_seed
				maxiter=50 converge=0.001 drift distance;
	var x1-x8;
	id area;
run;
proc sort data=fast_out out=out(keep=area CLUSTER);
	by CLUSTER;
run;

下图为选取的初始凝聚点

即为系统顺序选取法,先选取第一条完整观测(北京)为第一初始凝聚点,向下顺序选取,并采用逐个修改法,知道迭代结束。

得到的聚类结果为:

  • 第一类:北京
  • 第二类:上海
  • 第三轮:浙江
  • 第四类:重庆 四川 江西 湖北 安徽 河南 贵州 云南 陕西 甘肃 广西 海南 西藏 河北 黑龙江 内蒙古 吉林 青海 新疆 辽宁 宁夏 山西 山东
  • 第五类:天津 福建 广东 江苏 湖南

将此聚类结果与proc cluster的系统聚类结果对比,发现有一定差异,可能原因是因为fastclus的初始点选取方法对异常值敏感,且对样本观测少的问题来说,其结果受观测顺序影响较大。

参考文献:
1. SAS STAT 9.2 User’s Guide (2d Edition)
2. 统计分析与SAS(张晓冉 编著)

  1. 你这个例子一点没有物理意义啊

    [回复]

    hssnow 回复:

    恩 这是一个问题

    [回复]

  2. 不错,最近也在学聚类,赞一个。

    [回复]

    hssnow 回复:

    呵呵,只是学习笔记,还请多多指教哈~

    [回复]

    yugao1986 回复:

    关注来了!hssnow加油,期望看到更多的….

    [回复]

  3. 初始数据没有进行标准化啊,,,

    [回复]

    wing 回复:

    量纲一样,不需要标准化

    [回复]

发表评论

返回顶部