?? pointclustering.java
字號:
package k_means;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Random;
public class PointClustering
{
public PointCluster[] Clu;
private int k; //the number of the cluster that the user wanted
private int[][] Data;
private double[][] Center,CenterOld;//the current and old centers of the clusters
private LinkedList list;
private LinkedList<OneData> PointData;
/**
* constrcted function : initilize the attribute
* @throws IOException
*/
public PointClustering(int k,LinkedList<OneData> _data)
{
PointData = new LinkedList<OneData>();
list = new LinkedList();
this.k = k;
this.PointData = _data;
Clu = new PointCluster[k];
for (int i = 0; i < Clu.length; i++)
{
Clu[i] = new PointCluster();
}
Data = new int[_data.size()][2];
Center = new double[k][2];
CenterOld = new double[k][2];
for (int i = 0; i < _data.size(); i++)
{
Data[i][0] = _data.get(i).x;
Data[i][1] = _data.get(i).y;
}
}
/**
* Initlize the centers of all clusters
*/
public void initCenter()
{
Random r = new Random();
int temp = 0,random;
random = r.nextInt(PointData.size());
Center[temp][0] = Data[random][0];
Center[temp][1] = Data[random][1];
temp = temp + 1;
list.add(random);
while(temp < k)
{
random = r.nextInt(PointData.size());
if(!list.contains(random))
{
Center[temp][0] = Data[random][0];
Center[temp][1] = Data[random][1];
//System.out.println(random);
list.add(random);
temp = temp + 1;
}
}
}
/**
* the first clustering
*/
public void clusteringInit()
{
initCenter();
double Min = Double.MAX_VALUE;
double temp;
int col = 0,j;
for (int i = 0; i < k; i++)
{
Clu[i].setCentriod(Center[i]);
OneData point = new OneData();
point.x = (int) Center[i][0];
point.y = (int) Center[i][1];
Clu[i].getCluData().add(point);
}
for (int i = 0; i < Data.length; i++)
{
if(!list.contains(i))
{
for (j = 0; j < k; j++)
{
temp = Distance.calDis(Data[i], Clu[j].getCentriod());
if(temp < Min)
{
Min = temp;
col = j;
}
}
OneData p = new OneData();
p.x = Data[i][0];
p.y = Data[i][1];
Clu[col].getCluData().add(p);
Min = Double.MAX_VALUE;
}
}
}
/**
* update the center
*/
public void updateCenter()
{
for (int i = 0; i < k; i++)
{
CenterOld[i] = Center[i];
Clu[i].setCentroidOld(CenterOld[i]);
Clu[i].updateCentriod();
Center[i] = Clu[i].getCentriod();
}
}
/**
* Clustering K-Means
*/
public void KMeans()
{
int h = 0,m;
double Min = Double.MAX_VALUE;
double temp;
int col = 0,j;
clusteringInit();
updateCenter();
boolean IsGood = true;
for (m = 0; m < k; m++)
{
if(Distance.calDisDouble(Clu[m].getCentroidOld(), Clu[m].getCentriod()) > 0.000000000001)
{
break;
}
}
if(m == k)
IsGood = true;
else
IsGood = false;
while(!IsGood)
{
h++;
for (int i = 0; i < k; i++)
{
Clu[i].getCluData().clear();
}
for (int i = 0; i < Data.length; i++)
{
for (j = 0; j < k; j++)
{
temp = Distance.calDis(Data[i], Clu[j].getCentriod());
if(temp < Min)
{
Min = temp;
col = j;
}
}
OneData p = new OneData();
p.x = Data[i][0];
p.y = Data[i][1];
Clu[col].getCluData().add(p);
Min = Double.MAX_VALUE;
}
updateCenter();
IsGood = true;
for (m = 0; m < k; m++)
{
if(Distance.calDisDouble(Clu[m].getCentroidOld(), Clu[m].getCentriod()) > 0.000000000001)
{
break;
}
}
if(m == k)
IsGood = true;
else
IsGood = false;
}
System.out.println("榪
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -