Java 人工智能 - Weka - 聚类算法
聚类的作用是从一组没有打标签的数据中识别相似的对象组
也可以识别不寻常的样本 比如异常值
分析银行的数据集
包括600个实例
每个实例用 11 个属性进行描述
属性包括年龄、性别、地区、收入、婚姻状况、是否有子女、汽车拥有情况、存款活动、当前活动、房地产抵押、PEP
使用EM 期望最大化 聚类算法识别常见的客户组
EM算法流程
给定一组簇
为每个实例指派各个簇的概率分布
比如有 3个簇 A B C
一个实例分别属性簇 A B C 的概率分布依次为 0.7 0.10 0.20
第二步 EM 重新评估每个类的概率分布的参数向量
算法不断对这两步做迭代
直到参数收敛或者达到迭代的最大值
EM 簇数 可以手动设置 也可以通过交叉验证进行自动设置
肘部法则确定簇数
会查看簇数的偏差百分比
使用肘部法则会不断增加簇数数量
直到新加的簇不会带来很多的信息
只会带来很少的额外差异
聚类算法
package com.osrcd.weka;
import weka.clusterers.EM;
import weka.core.Instances;
import java.io.BufferedReader;
import java.io.FileReader;
public class Clustering {
public static void main(String[] args) throws Exception {
// 加载数据
Instances data = new Instances(new BufferedReader(new FileReader(Clustering.class.getClassLoader().getResource("data/bank-data.arff").getPath())));
// 聚类器的新实例
EM model = new EM();
// 创建聚类器
model.buildClusterer(data);
System.out.println(model);
}
}
EM
==
Number of clusters selected by cross validation: 6
Number of iterations performed: 100
Cluster
Attribute 0 1 2 3 4 5
(0.1) (0.13) (0.26) (0.25) (0.12) (0.14)
======================================================================
age
0_34 10.0535 51.8472 122.2815 12.6207 3.1023 1.0948
35_51 38.6282 24.4056 29.6252 89.4447 34.5208 3.3755
52_max 13.4293 6.693 6.3459 50.8984 37.861 81.7724
[total] 62.1111 82.9457 158.2526 152.9638 75.4841 86.2428
sex
FEMALE 27.1812 32.2338 77.9304 83.5129 40.3199 44.8218
MALE 33.9299 49.7119 79.3222 68.4509 34.1642 40.421
[total] 61.1111 81.9457 157.2526 151.9638 74.4841 85.2428
region
INNER_CITY 26.1651 46.7431 73.874 60.1973 33.3759 34.6445
TOWN 24.6991 13.0716 48.4446 53.1731 21.617 17.9946
RURAL 8.4113 12.7871 21.7634 25.7529 11.1622 22.1231
SUBURBAN 3.8356 11.344 15.1706 14.8404 10.3289 12.4805
[total] 63.1111 83.9457 159.2526 153.9638 76.4841 87.2428
income
0_24386 22.5301 77.3981 150.8728 35.3652 3.0947 1.7391
24387_43758 38.0636 4.5119 6.2909 113.3875 70.4654 8.2808
43759_max 1.5174 1.0357 1.0889 4.2111 1.924 76.2228
[total] 62.1111 82.9457 158.2526 152.9638 75.4841 86.2428
married
NO 15.0163 34.8213 48.6021 32.7954 49.5126 29.2523
YES 46.0948 47.1244 108.6506 119.1684 24.9715 55.9904
[total] 61.1111 81.9457 157.2526 151.9638 74.4841 85.2428
children
0 2.1776 53.2782 55.6363 92.5938 32.663 32.6511
1 51.5497 26.7841 22.0968 1.9302 18.9418 19.6973
2 6.4264 2.3777 56.5523 25.7573 23.3335 25.5529
3 2.9574 1.5057 24.9671 33.6825 1.5458 9.3415
[total] 63.1111 83.9457 159.2526 153.9638 76.4841 87.2428
car
NO 29.7462 47.4075 89.7372 69.5918 34.7847 38.7326
YES 31.3649 34.5382 67.5154 82.372 39.6993 46.5101
[total] 61.1111 81.9457 157.2526 151.9638 74.4841 85.2428
save_act
NO 6.7118 58.9844 49.6095 39.7853 35.7784 1.1306
YES 54.3993 22.9613 107.6431 112.1785 38.7056 84.1121
[total] 61.1111 81.9457 157.2526 151.9638 74.4841 85.2428
current_act
NO 12.8656 21.8946 35.3337 46.1845 15.9243 18.7973
YES 48.2455 60.0511 121.9189 105.7792 58.5598 66.4455
[total] 61.1111 81.9457 157.2526 151.9638 74.4841 85.2428
mortgage
NO 34.2814 47.6791 108.1248 95.3628 54.1015 57.4504
YES 26.8297 34.2666 49.1278 56.601 20.3826 27.7924
[total] 61.1111 81.9457 157.2526 151.9638 74.4841 85.2428
pep
YES 59.0226 72.2592 18.5799 3.8416 68.4764 57.8202
NO 2.0885 9.6865 138.6727 148.1222 6.0076 27.4226
[total] 61.1111 81.9457 157.2526 151.9638 74.4841 85.2428
第1行表明有6个簇
第1列Attribute指出属性以相应范围
比如 属性 age 划分为 3个区段:0~34 35~51 52~max 这些数字列表表示有多少个实例归入每个簇的特定范围 比如 0~34 年龄组的客户大部分位于簇2中的数字表示有122个实例
评估
对数似然度量 评估聚类算法的质量
测量那些数据被识别到簇的一致性程度
数据集划分为多个折
针对每个折运行聚类
如果簇类算法簇里面的相似数据的概率高
说明它在捕获数据结构方面做得很好
double logLikelihood = ClusterEvaluation.crossValidateModel(model, data, 10, new Random(1));
System.out.println(logLikelihood);
运行了很久才计算出来
-8.773422954298612