Java 人工智能 - Weka - 聚類算法
聚類的作用是從一組沒有打標(biāo)簽的數(shù)據(jù)中識(shí)別相似的對(duì)象組
也可以識(shí)別不尋常的樣本 比如異常值
分析銀行的數(shù)據(jù)集
包括600個(gè)實(shí)例
每個(gè)實(shí)例用 11 個(gè)屬性進(jìn)行描述
屬性包括年齡、性別、地區(qū)、收入、婚姻狀況、是否有子女、汽車擁有情況、存款活動(dòng)、當(dāng)前活動(dòng)、房地產(chǎn)抵押、PEP
使用EM 期望最大化 聚類算法識(shí)別常見的客戶組
EM算法流程
給定一組簇
為每個(gè)實(shí)例指派各個(gè)簇的概率分布
比如有 3個(gè)簇 A B C
一個(gè)實(shí)例分別屬性簇 A B C 的概率分布依次為 0.7 0.10 0.20
第二步 EM 重新評(píng)估每個(gè)類的概率分布的參數(shù)向量
算法不斷對(duì)這兩步做迭代
直到參數(shù)收斂或者達(dá)到迭代的最大值
EM 簇?cái)?shù) 可以手動(dòng)設(shè)置 也可以通過交叉驗(yàn)證進(jìn)行自動(dòng)設(shè)置
肘部法則確定簇?cái)?shù)
會(huì)查看簇?cái)?shù)的偏差百分比
使用肘部法則會(huì)不斷增加簇?cái)?shù)數(shù)量
直到新加的簇不會(huì)帶來很多的信息
只會(huì)帶來很少的額外差異
聚類算法
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 {
? ? ? ?// 加載數(shù)據(jù)
? ? ? ?Instances data = new Instances(new BufferedReader(new FileReader(Clustering.class.getClassLoader().getResource("data/bank-data.arff").getPath())));
? ? ? ?// 聚類器的新實(shí)例
? ? ? ?EM model = new EM();
? ? ? ?// 創(chuàng)建聚類器
? ? ? ?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個(gè)簇
第1列Attribute指出屬性以相應(yīng)范圍
比如 屬性 age 劃分為 3個(gè)區(qū)段:0~34 35~51 52~max 這些數(shù)字列表表示有多少個(gè)實(shí)例歸入每個(gè)簇的特定范圍 比如 0~34 年齡組的客戶大部分位于簇2中的數(shù)字表示有122個(gè)實(shí)例
評(píng)估
對(duì)數(shù)似然度量 評(píng)估聚類算法的質(zhì)量
測(cè)量那些數(shù)據(jù)被識(shí)別到簇的一致性程度
數(shù)據(jù)集劃分為多個(gè)折
針對(duì)每個(gè)折運(yùn)行聚類
如果簇類算法簇里面的相似數(shù)據(jù)的概率高
說明它在捕獲數(shù)據(jù)結(jié)構(gòu)方面做得很好
double logLikelihood = ClusterEvaluation.crossValidateModel(model, data, 10, new Random(1));
System.out.println(logLikelihood);
運(yùn)行了很久才計(jì)算出來
-8.773422954298612