直接聚类法

1.引言
直接聚类法的基本原理是先把各个分类对象单独视为一类,然后根据距离最小的原则,依次选出一对分类对象,并成新类。如果其中一个分类对象已归于一类,则把另一个也归入该类;如果一对分类对象正好属于已归的两类,则把这两类并为一类。每一次归并,都划去该对象所在的列与列序相同的行。经过m1次就可以把全部分类对象归为一类,这样就可以根据归并的先后顺序作出聚类谱系图。直接聚类法由于简单易行且准确率较高被广泛应用于社会生活各个方面的有关分析。
Java是一门面向对象的,跨平台的语言,由于其强大的生命力而被广泛应用于编程的各个方面。本文的直接聚类法将基于java语言开发,运行环境是JDK1.6.10版本。
本文将探讨直接聚类法的基本思想和实现步骤,并给出每一步骤的java代码实现。最后通过一个城镇居民消费结构的差异化分析来展示该方法的应用。
2.直接聚类法的步骤及相应的java代码
直接聚类法的基本原理在引言中已经给出,可以看出,其思想还是比较简单的。下面将详细介绍直接聚类法的实施步骤。关于聚类要素的数据处理和样本之间距离的计算有多种方法,本文的java代码实现仅选择其中的一种来实现,因此在相应的步骤中将会详细介绍java代码实现的处理方法,对于其他方法则点到为止。
假设有m 个聚类的对象,每一个聚类对象都有n个要素构成。则 表示第i个样本的第j个要素所对应的数值,以下的 均表此含义。
2.1聚类要素的数据处理
在聚类分析中,聚类要素的选择是十分重要的,它直接影响分类结果的准确性和可靠性。
在实际应用中,被聚类的对象常常是多个要素构成的。不同要素的数据往往具有不同的单位和量纲,其数值的变异可能是很大的,这就会对分类结果产生影响。因此当分类要素的对象确定之后,在进行聚类分析之前,首先要对聚类要素进行数据处理。
数据处理的方法有很多种,主要包括总和标准化,标准差标准化,极大值标准化和极差标准化。本文的java代码实现采用极差标准化的方法。
极差标准化的计算公式如下所示:

(i=1,2,3,…m, j=1,2,…n)
聚类要素数据处理的java代码实现:
// 采用极差标准化方法将原始数据标准化,使得所有的数据均转化为01之间的数值。
public double[][] getNormalization(double[][] data) {
for (int i = 0; i < column; i++) { // i代表列
double max = data[0][i];
double min = data[0][i];
for (int j = 0; j < row; j++) { // j代表行
if (max < data[j][i]) {
max = data[j][i];
}
if (min > data[j][i]) {
min = data[j][i];
}
}
double s = max min;
for (int j = 0; j < row; j++) {
normalization[j][i] = (data[j][i] min) / s;
}
}
for (int i = 0; i < normalization.length; i++) {
for (int j = 0; j < normalization[i].length; j++) {
System.out.print(myformat.format(normalization[i][j]) + " ");
}
System.out.println();
}
return normalization;
}
2.2各样本间距离的计算
距离是用来测量两个样本之间差异度的指标。距离的计算方法主要有以下几种:绝对值距离,欧氏距离 ,明科夫斯基距离 ,切比雪夫距离。本文的java代码实现采用绝对值距离来计算各个样本之间的距离。

(i,j=1,2,3,…m)

// 用绝对值距离的方法获取初始各对象之间的距离
public double[][] getDistance(double normalization[][]) {
for (int i = 0; i < row; i++) { // i代表diatance的行
for (int j = 0; j < row; j++) { // i代表distance的列
distance[i][j] = 0;
for (int k = 0; k < column; k++) { // k代表normalization的列
distance[i][j] += Math.abs(normalization[i][k]
normalization[j][k]);
}
System.out.print(myformat.format(distance[i][j]) + " ");
}
System.out.println();
}
return distance;
}
2.3进行聚类
先把各个分类对象单独视为一类,然后根据距离最小的原则,依次选出一对分类对象,并成新类。每一次归并,都划去两个对象中序号较大者所在的列与列序相同的行。经过m1次就可以把全部分类对象归为一类,这样就可以根据归并的先后顺序作出聚类谱系图。

// 按照谱系聚类法进行聚类
public void cluster(double[][] distance) {
int number=distance.length;
double rate[] = new double[number1]; // 从小到大顺序存储对象之间的距离
int entity[][] = new int[number1][2];// 每两个对象化为一类,共number1类int drop[] = new int[number1]; // 每次聚类之后距离矩阵中划掉的行(列)数
drop[0] = number;
int row = number; // 距离矩阵的行数,初始值为number.

for (int i = 0; i < 8; i++) {

/**
* tRow和tCloumn作为中间变量来存储距离矩阵中最小值所在的行和列
*/
int tRow = 0;
int tColumn = 0;
double min = number+1;
for (int j = 0; j < row; j++) { // i代表diatance的行
for (int k = 0; k < j; k++) { // i代表distance的列
if (distance[j][k] < min) {
min = distance[j][k];
tRow = j;
tColumn = k;
}
}
}
rate[i] = min;
entity[i][0] = tRow;
entity[i][1] = tColumn;
/**
* 通过循环将对象还原为在初始距离矩阵中的位置
*/
if (i > 0) {
for (int j = i1; !(j <0); j) {
if (!(entity[i][0] < drop[j]))
entity[i][0] += 1;
if (!(entity[i][1] < drop[j]))
entity[i][1] += 1;
}
}
/**
* 使输出结果符合我们的思维习惯,从1开始,而不是从0开始
*/
entity[i][0] += 1;
entity[i][1] += 1;
System.out.println(myformat.format(rate[i]) + " " + entity[i][0]
+ " " + entity[i][1]);

drop[i] = tRow;
if (row > 1) {
row = 1;
}
/**
* 距离矩阵在划掉一行一列之后如何形成新的降阶矩阵
*/
if (drop[i] != row) {
for (int m = 0; m < drop[i]; m++) {
for (int n = drop[i]; n < row; n++) {
distance[m][n] = distance[m][n + 1];
}
}
for (int m = drop[i]; m < row; m++) {
for (int n = 0; n < drop[i]; n++) {
distance[m][n] = distance[m + 1][n];
}
}
for (int m = drop[i]; m < row; m++) {
for (int n = drop[i]; n < row; n++) {
distance[m][n] = distance[m + 1][n + 1];
}
}
}
}
}

至此,我们完成了直接聚类算法的java代码实现。
3.用直接聚类法分析2011年中国城镇居民的消费结构差异
消费结构是在一定的社会经济条件下,人们(包括各种不同类型的消费者和社会集团)在消费过程中所消费的各种不同类型的消费资料(包括劳务)的比例关系。按照中华人民共和国统计局统计口径,构成城镇居民消费性支出的项目有:食品、衣着、家庭设备用品及服务、医疗保健、交通和通信、教育文化娱乐服务、居住、杂项商品和服务,以上构成城镇居民消费性支出的八个项目即为所选指标。
以下数据来源于2011年中国统计年鉴,得到2011年的统计数据。

2011年各地区城镇居民家庭平均每人全年消费性支出 (单位:元)
地区食品衣着家庭设备用品及服务医疗保健交通和通信教育文化娱乐服务居住杂项商品和服务
北京4560.521442.42977.471322.362173.262514.761212.89621.74
天津3680.22864.89634.391049.331092.871452.171368.20405.99
河北2492.26849.58460.27737.43875.43827.72864.92235.88
山西2252.501016.69441.82589.97825.181007.92830.38206.48
内蒙古2323.551168.93464.55555.00928.481052.65802.26371.19
辽宁3102.13846.91362.10767.13797.64853.92909.42348.23
吉林2457.21907.61318.65671.44815.02890.22984.95307.56
黑龙江2215.68971.44319.37634.30665.01843.94755.32250.37
上海5248.951026.87877.59762.922332.832431.741435.72645.13
江苏3462.66886.82647.52600.691203.451467.36997.53362.56
浙江4393.401383.63615.45852.272492.011946.151229.25436.37
安徽3091.28869.55336.99441.42788.25869.23694.17203.83
福建3854.26784.71525.65513.611232.701321.331233.49341.96
江西2636.93725.72451.32357.03600.16894.58742.93236.87
山东2711.651091.22526.29624.061175.571201.97838.17299.48
河南2215.32919.31431.02520.57762.08847.12737.00252.76
湖北2868.39877.01401.22517.19763.14997.74752.56220.08
湖南2850.94868.23513.63632.52965.091182.18871.70285.00
广东4503.86719.26633.03707.862394.661813.861254.69405.00
广西2857.40477.67360.62401.06785.01850.90826.86232.43
海南3097.71375.42405.81369.331154.87791.24743.60188.80
重庆3415.921038.98615.74705.72976.021449.49954.56242.26
四川2838.22754.93505.83449.871009.35976.33728.43261.85
贵州2649.02832.74446.53329.77775.07938.37627.23249.66
云南3102.46745.08335.14600.081076.93754.69585.35180.07
西藏3107.90734.83211.10221.70694.21359.34612.67250.82
陕西2588.91768.47478.58612.30824.461280.14746.59253.84
甘肃2408.37854.00403.80562.74703.071034.42716.35291.46
青海2366.42724.96420.31542.93753.07793.72653.04275.66
宁夏2444.98874.39480.70578.75774.57846.72890.97314.49
新疆2386.97953.03364.11472.35765.72819.72698.66269.45
数据来源:《中国统计年鉴2011》

应用上述java代码实现方法来处理该组数据,得到的分析结果如下:
聚类次数差异度省份省份
10.31新疆河南
20.38河南黑龙江
30.41湖北安徽
40.41贵州江西
50.42青海甘肃
60.47湖南山东
70.47宁夏河北
80.56陕西四川
90.57四川江西
100.59甘肃黑龙江
110.6黑龙江山西
120.61山西河北
130.62吉林辽宁
140.65云南安徽
150.68海南广西
160.69广西江西
170.71辽宁河北
180.73重庆江苏
190.74山东内蒙古
200.75江西安徽
210.87福建江苏
220.98西藏安徽
230.98安徽河北
241.02内蒙古河北
251.02广东浙江
261.11江苏天津
271.69上海北京
281.86浙江北京
292.28河北天津
303.24天津北京

通过上面的分析,我们可以看出聚类的结果和实际情况是相似的,这就验证了此算法的可行性。由于篇幅所限,中间处理结果,如分类要素的数据处理和各样本之间的距离等我们略去了。
直接聚类算法由于简单易行,我们可以用它来解决生活中的很多问题,对样本进行聚类,总结各类之间的异同,对于我们更好地做出决策起到辅助作用。
4.后续研究工作
此文仅仅是谱系聚类算法中最简单的直接聚类法的java代码实现,后续还有很多工作要做,主要的方向为:
实现数据要素初始化和样本之间距离计算的其他方法。
加入类间距离的计算和应用。
在数据量很大的时候,如何优化算法,提高效率是否可以借鉴排序技术中二分法的思想来处理,这个问题还有待进一步研究。
5.参考文献
[1] 高惠璇.应用多元统计分析[M].北京:北京大学出版社,2011.1
[2]何晓群.多元统计分析[M].北京:中国人民大学出版社,2004
[3]国家统计局.中国统计年鉴[M].北京:中国统计出版社.
[4]张文新 信息资源管理课程讲义(内部资料)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值