1.K-means算法简述以及代码原型
总的来讲,k-means聚类须要下面几个步骤:
①.初始化数据
②.计算初始的中心点,能够随机选择
③.计算每一个点到每一个聚类中心的距离。而且划分到距离最短的聚类中心簇中
④.计算每一个聚类簇的平均值,这个均值作为新的聚类中心,反复步骤3
⑤.假设达到最大循环或者是聚类中心不再变化或者聚类中心变化幅度小于一定范围时,停止循环。
恩。原理就是这样,超级简单。可是Java算法实现起来代码量并不小。这个代码也不算是全然自己写的啦。也有些借鉴。我把k-means实现封装在了一个类里面,这样就能够随时调用了呢。
import java.util.ArrayList;
import java.util.Random;
public class kmeans {
private int k;//簇数
private int m;//迭代次数
private int dataSetLength;//数据集长度
private ArrayList dataSet;//数据集合
private ArrayList center;//中心链表
private ArrayList> cluster;//簇
private ArrayList jc;//误差平方和,这个是用来计算中心聚点的移动哦
private Random random;
//设置原始数据集合
public void setDataSet(ArrayList dataSet){
this.dataSet=dataSet;
}
//获得簇分组
public ArrayList> getCluster(){
return this.cluster;
}
//构造函数,传入要分的簇的数量
public kmeans(int k){
if(k<=0)
k=1;
this.k=k;
}
//初始化
private void init(){
m=0;
random=new Random();
if(dataSet==null||dataSet.size()==0)
initDataSet();
dataSetLength=dataSet.size();
if(k>dataSetLength)
k=dataSetLength;
center=initCenters();
cluster=initCluster();
jc=new ArrayList();
}
//初始化数据集合
private void initDataSet(){
dataSet=new ArrayList();
double[][] dataSetArray=new double[][]{ {8,2},{3,4},{2,5},{4,2},
{7,3},{6,2},{4,7},{6,3},{5,3},{6,3},{6,9},
{1,6},{3,9},{4,1},{8,6}};
for(int i=0;i
dataSet.add(dataSetArray[i]);
}
//初始化中心链表,分成几簇就有几个中心
private ArrayList initCenters(){
ArrayList center= new ArrayList();
//生成一个随机数列。
int[] randoms=new int[k];
boolean flag;
int temp=random.ne