⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cluster.java

📁 Clustering demo.very good
💻 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 + -