📄 cluster.java
字号:
import java.util.Vector;
import java.lang.Math.*;
class Cluster{
private String mName;
private Vector mDataPoints;
private DataPoint mMean;
private Vector mRepPoints;
private double mDistance;
public Cluster mClosest;
private Centroid mCentroid;
private double mSumSqr;
static int f;
public Cluster(String name){
mName = name;
mMean= new DataPoint();
mCentroid = null;
mDataPoints=new Vector();
mRepPoints=new Vector();
}
public void setCentroid(Centroid c) {
mCentroid = c;
}
public Centroid getCentroid() {
return mCentroid;
}
public String getName(){
return mName;
}
public void addDataPoint(DataPoint dp){
dp.setCluster(this);
mDataPoints.addElement(dp);
calcMean();
calcRepPoints();
calcSumOfSquares();
}
public void addDataPoint1(DataPoint dp){
dp.setCluster1(this);
mDataPoints.addElement(dp);
calcMean();
calcRepPoints();
}
public DataPoint getMean(){
return mMean;
}
public Vector getDataPoints() {
return mDataPoints;
}
public void removeDataPoint(DataPoint dp) {
this.mDataPoints.removeElement(dp);
calcSumOfSquares();
}
public int getNumDataPoints() {
return this.mDataPoints.size();
}
public void calcSumOfSquares() { //called from Centroid
int size = this.mDataPoints.size();
double temp = 0;
for (int i = 0; i < size; i++) {
temp = temp + ((DataPoint)this.mDataPoints.elementAt(i)).getCurrentEuDt();
}
this.mSumSqr = temp;
}
public double getSumSqr() {
return this.mSumSqr;
}
public void show(){
for(int i=0;i<getClusterSize();i++){
DataPoint dp=getDataPoint(i);
System.out.println("("+dp.getX()+","+dp.getY()+")");
}
}
public void showRepPoints(){
for(int i=0;i<getNoOfRepPoints();i++)
System.out.println("RepPoint ("+((DataPoint)mRepPoints.elementAt(i)).getX()+","+((DataPoint)mRepPoints.elementAt(i)).getY()+")");
}
public int getNoOfRepPoints(){
return mRepPoints.size();
}
public Cluster getClosest(){
return mClosest;
}
public double getDistance(){
return mDistance;
}
public int getClusterSize(){
return mDataPoints.size();
}
public DataPoint getDataPoint(int pos){
return (DataPoint)mDataPoints.elementAt(pos);
}
public DataPoint getRepPoint(int pos){
return (DataPoint)mRepPoints.elementAt(pos);
}
public double distance(DataPoint dp1,DataPoint dp2){
return java.lang.Math.sqrt((((dp1.getX()-dp2.getX()) * (dp1.getX()-dp2.getX())) + ((dp1.getY()-dp2.getY())* (dp1.getY()-dp2.getY()))) );
}
public void calcMean(){
int size=mDataPoints.size();
DataPoint temp = new DataPoint();
System.out.print("\nsize is: "+size+"\t");
for (int i = 0; i <size; i++) {
temp.mX = temp.mX + ((DataPoint)mDataPoints.elementAt(i)).getX();
temp.mY = temp.mY + ((DataPoint)mDataPoints.elementAt(i)).getY();
}
temp.mX=temp.mX/size;
temp.mY=temp.mY/size;
mMean=temp;
System.out.println("mean is: "+mMean.getX()+","+mMean.getY());
}
public void calcRepPoints(){
double maxDist=0.0, minDist=2147483648.0;
DataPoint maxDP=null;
if(f!=0)
mRepPoints.removeAllElements();
f=f+1;
int loop=0,j;
if( mDataPoints.size() >=4)
loop=4;
else
loop=mDataPoints.size();
for(int i=0; i<loop; i++){
maxDP=null;
maxDist=0;
for(j=0; j<mDataPoints.size(); j++){
if(i==0)
minDist=distance((DataPoint)mDataPoints.elementAt(j),mMean);
else{
double min=distance((DataPoint)mDataPoints.elementAt(j),(DataPoint)mRepPoints.elementAt(0));
for(int t=1; t<mRepPoints.size(); t++)
if( distance((DataPoint)mDataPoints.elementAt(j),(DataPoint)mRepPoints.elementAt(t)) < min)
min=distance((DataPoint)mDataPoints.elementAt(j),(DataPoint)mRepPoints.elementAt(t));
minDist=min;
}
if(minDist>=maxDist){
maxDist=minDist;
maxDP=(DataPoint)mDataPoints.elementAt(j);
}
}
if(maxDP!=null) mRepPoints.add((DataPoint)maxDP);
}
/* System.out.println("size of mRepPoints="+mRepPoints.size());
for(int i=0;i<mDataPoints.size();i++)
System.out.println("DataPoint ("+((DataPoint)mDataPoints.elementAt(i)).getX()+","+((DataPoint)mDataPoints.elementAt(i)).getY()+")");
for(int i=0;i<mRepPoints.size();i++)
System.out.println("RepPoint ("+((DataPoint)mRepPoints.elementAt(i)).getX()+","+((DataPoint)mRepPoints.elementAt(i)).getY()+")");
*/
}
public Cluster findClosest(Cluster[] clusters){
Cluster tclosest, closest=clusters[0];
double mini=2146473648.00,min=0;
int i=0,j=0;
for(i=1;i<=clusters.length;i++){
tclosest=clusters[i-1];
if( tclosest.getName()!=this.getName()){
for( j=0;j<this.getNoOfRepPoints();j++)
for(int k=0;k<tclosest.getNoOfRepPoints();k++)
if(distance((DataPoint)this.mRepPoints.elementAt(j),(DataPoint)tclosest.mRepPoints.elementAt(k)) < mini){
mini=distance((DataPoint)this.mRepPoints.elementAt(j),(DataPoint)tclosest.mRepPoints.elementAt(k));
closest=tclosest;
}
}
if( i==1|| mini<min ){
min=mini;
closest=tclosest;
}
}
mDistance=min;
//System.out.println(getName()+" closest is "+closest.getName());
return closest;
}
} //Cluster class end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -