1、前面一篇文章算法——K均值聚类算法(Java实现)简单的实现了一下K均值分类算法,这节我们对于他的应用进行一个扩展应用
2、目标为对对象的分类
3、具体实现如下
1)首先建立一个基类KmeansObject,目的为继承该类的子类都可以应用我们的k均值算法进行分类,代码如下
- package org.cyxl.util.algorithm;
-
- /**
- * 所有使用k均值分类算法的对象都必须继承自该对象
- * @author cyxl
- * @version 1.0 2012-05-24
- * @since 1.0
- *
- */
- public class KmeansObject {
- public float compare; //比较因子
- }
2)算法实现,代码如下
3)测试算法,首先建立一个Person类,目标在于对人进行分类
- package org.cyxl.util.algorithm;
-
- public class Person extends KmeansObject {
- String name="";
- int age=0;
- float qz=1; //权重
-
- public Person(){}
-
- public Person(String name,int age,float qz)
- {
- this.name=name;
- this.age=age;
- this.qz=qz;
- }
-
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
-
- public float getQz() {
- return qz;
- }
-
- public void setQz(float qz) {
- this.qz = qz;
- }
-
- public String toString()
- {
- return "name:"+this.name+";age:"+this.age+";qz:"+this.qz+";compare:"+super.compare;
- }
- }
4)客户端测试代码
- CommonKmeans k=new CommonKmeans(5);
- ArrayList<KmeansObject> list=new ArrayList<KmeansObject>();
-
- for(int i=0;i<10;i++)
- {
- float qz=(float)(new Random().nextInt(10))/10;
- Person p=new Person("name"+i,i,qz);
- p.compare=new Random().nextInt(100)*p.getQz();
- list.add(p);
- }
- k.setDataSet(list);
- k.printDataArray(k.dataSet, "before");
- k.execute();
- ArrayList<ArrayList<KmeansObject>> cluster=k.getCluster();
- //查看结果
- for(int i=0;i<cluster.size();i++)
- {
- k.printDataArray(cluster.get(i), "cluster["+i+"]");
- }
5)输出结果
- print:before[0]={name:name0;age:0;qz:0.0;compare:0.0}
- print:before[1]={name:name1;age:1;qz:0.9;compare:48.6}
- print:before[2]={name:name2;age:2;qz:0.9;compare:57.6}
- print:before[3]={name:name3;age:3;qz:0.4;compare:28.4}
- print:before[4]={name:name4;age:4;qz:0.0;compare:0.0}
- print:before[5]={name:name5;age:5;qz:0.4;compare:33.600002}
- print:before[6]={name:name6;age:6;qz:0.5;compare:2.0}
- print:before[7]={name:name7;age:7;qz:0.2;compare:14.6}
- print:before[8]={name:name8;age:8;qz:0.6;compare:5.4}
- print:before[9]={name:name9;age:9;qz:0.9;compare:52.199997}
- ===================================
- kmeans begins
- kmeans running time=0ms
- kmeans ends
-
- print:cluster[0][0]={name:name3;age:3;qz:0.4;compare:28.4}
- print:cluster[0][1]={name:name5;age:5;qz:0.4;compare:33.600002}
- ===================================
- print:cluster[1][0]={name:name7;age:7;qz:0.2;compare:14.6}
- ===================================
- print:cluster[2][0]={name:name2;age:2;qz:0.9;compare:57.6}
- ===================================
- print:cluster[3][0]={name:name1;age:1;qz:0.9;compare:48.6}
- print:cluster[3][1]={name:name9;age:9;qz:0.9;compare:52.199997}
- ===================================
- print:cluster[4][0]={name:name0;age:0;qz:0.0;compare:0.0}
- print:cluster[4][1]={name:name4;age:4;qz:0.0;compare:0.0}
- print:cluster[4][2]={name:name6;age:6;qz:0.5;compare:2.0}
- print:cluster[4][3]={name:name8;age:8;qz:0.6;compare:5.4}
- ===================================
4、说明及总结。
1)基类KmeansObject定义了一个compare,我们把它叫做比较因子,分类时只要就是对分类因子进行分类计算的。所以这个分类因子很重要,每个对象的分类因子可以具体的根据业务进行计算设置。比如我们客户端测试代码中的比较因子的计算方法是,首先给每个对象赋予一个权值qz,然后根据权值和年龄的乘积(具体计算方法根据业务定)来对人群进行分类
2)该算法中对于比较因子compare的计算是影响该算法准确性的一个很重要方面,具体表现在距离(distance方法)和误差(errorSquare方法)计算中。想要改善该算法可以从这两个方法中进行修改
3)当然,我对于这个算法的实现和应用都还是很浅。如果有什么不对或者可以改善的地方请不吝赐教
|