亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? fcm.java

?? 利用java編寫的模糊C均值聚類算法
?? JAVA
字號:
package ice.module.clustering;
import ice.gui.GUIUtil;
import ice.gui.InternalFrame;
import ice.gui.segFrame;
import ice.module.Measurable;

import java.util.*;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.*;
import java.text.*;

import javax.swing.JScrollPane;
import javax.swing.JViewport;

/**
 *Reference 
 *"A Kind of Improved Method of Fuzzy Clustering"
 *"A validity measure for fuzzy clustering"
 *
 *Creation Date:06-5-8 14:39
 */

public class FCM implements Measurable{
	
	private int fsize;	//feature size
	private int ssize;	//sample size
	private int clsNum;	//cluster number
	private double s;	//coefficient in FCM
	private double[][] samples;
	private double[][] centroids;
	private double[][] u;	//relationship matrix
	private double[][] ou;	//old relationship matrix
	private double E = 1;	//threshold of termination condition
	
	private double[][] optu;	//optimal relationship due to optimal cluster number
	private int optimalC = 1;
	private double oldconver;
	private double convergence;
	private double CE = 1;	//threshold of convergence
	private int MAXROUND = 50;	//max rounds for computation
	
	/**
	 * 以下定義用于GUI交互
	 */
	private double progressNum = 0;
	private InternalFrame frame;
	private JScrollPane imagePane;
	private BufferedImage segImage = null;
	private int height, width;
	private int mode;
	/**
	 * 中心集合設置開關 cmode=0 自身處理 
	 * cmode = 1 NewInit隨機方法 
	 * cmode = 2 NewInit二級聚類方法 
	 * cmode = 3 NewInit二分法
	 */
	private int cmode;	
	
	public FCM(double[][] data, int c, int ss) {
		ssize = data.length;
		fsize = data[0].length;
		clsNum = c;
		s = ss;
		initData(c);
		samples = new double[ssize][fsize];
		for(int i = 0; i < data.length; i++)
			copyArray(data[i],samples[i]);			
		
//		show progress
		setProgress(2);
	}
	
	public FCM(double[][] data, int c, int ss, int h, int w) {
		this(data,c,ss);
		height = h;
		width = w;
	}
	
	public void initData(int cl) {
		ou = new double[ssize][cl];
		u = new double[ssize][cl];
		centroids = new double[cl][fsize];	
	}
	
	public void initU() {
		for(int i = 0; i < ssize; i++) {
			double sum = 0;
			for(int j = 0; j < clsNum-1; j++) {
				u[i][j] = Math.random()*(1-sum);
				sum += u[i][j];
			}
			if(sum > 1) System.err.println("Initization Error!");
			u[i][clsNum-1] = 1-sum; 
		}
		
		//show progress
		setProgress(4);
	}
	
	/**
	 * Tranditional implemention for FCM
	 */
	public void clustering() {
		int count = 0;
		initU();
		while(count < MAXROUND) {
	//		System.out.print(".");
			updateCenters();
			for(int k = 0; k < ssize; k++) {
				System.arraycopy(u[k],0,ou[k],0,u[k].length);
				updateU(k);
			}
		// convergence termination test	
			convergenceTest();
			if(Math.abs(oldconver-convergence) < CE)
				break;
			
		//	if(termination()) break;
			count++;
			
			//show progress
			double pb = Math.random();
			addProgress(1.2);
		}
		
	//	System.out.println("Evaluation: " + evaluation());
		
		if (frame instanceof segFrame) {
			((segFrame)frame).setClusterMethod("FCM");
		}
	}
	
	/**
	 * Modified implemention for FCM
	 * The termination condition is modified to convergence test
	 */
	public void clustering(int c) {
		int count = 0;
		clsNum = c;
		initData(c);
		initU();
		while(count < MAXROUND) {
			System.out.print("|");
			updateCenters();
			for(int k = 0; k < ssize; k++) {
				updateU(k);
			}
			
			convergenceTest();
			if(Math.abs(oldconver-convergence) < CE)
				break;
			
			count++;
			
			//show progress
			double pb = Math.random();
			addProgress(pb);
		}		
		System.out.println();
	}
	/**
	 * find optimal cluster number from [cl_min, cl_max]
	 */	
	public void optimalCluster(int cl_min, int cl_max) {
		double ES = Double.MAX_VALUE;
		optimalC = 1;
		for(int c = cl_min; c <= cl_max; c++) {
			clustering(c);
			double ts = 0;
			if(s < 2) {
				double min = Double.MAX_VALUE;
				for(int i = 0; i < clsNum; i++)
					for(int j = 0; j < i; j++) {
						double temp = sdistance(centroids[i],centroids[j]);
						if(min > temp)
							min = temp;
					}
				ts = convergence * 1.0 / (ssize * min);		
			}
			else {
				ts = evaluation();
			}
			System.out.println("cluster[" + c + "]: " + ts);
			if(ES > ts) {
				ES = ts;
				optimalC = c;
				optu = new double[ssize][c];
				copy2DArray(u,optu);
			}
			System.gc();
		}
		
		System.out.println("ES:" + ES);
		System.out.println("Optimal Cluster:" + optimalC + " in [" + cl_min + "," + cl_max +"]");
	}
	
	/**
	 * 嘗試采用評估值的變化幅度來選擇最優類別,即變化幅度最大的點為最優點
	 * @param cl_min 可能最小類別數
	 * @param cl_max 可能最大類別數
	 */
	public void optimalClustering(int cl_min, int cl_max) {
		
		double preES = 0;		
		double ES = Double.MIN_VALUE;
		optimalC = 1;
		for(int c = cl_min; c <= cl_max; c++) {
			clustering(c);
			double ts = 0;
			if(s < 2) {
				double min = Double.MAX_VALUE;
				for(int i = 0; i < clsNum; i++)
					for(int j = 0; j < i; j++) {
						double temp = sdistance(centroids[i],centroids[j]);
						if(min > temp)
							min = temp;
					}
				ts = convergence * 1.0 / (ssize * min);		
			}
			else {
				double t = evaluation();
				if(c == cl_min) ts = 0;
				else ts = Math.abs(t - preES)/preES;
				preES = t;
			}
			System.out.println("cluster[" + c + "]: " + preES);
			if(ES < ts) {
				ES = ts;
				optimalC = c;
				optu = new double[ssize][c];
				copy2DArray(u,optu);
			}
			System.gc();
		}
		
		System.out.println("ES:" + ES);
		System.out.println("Optimal Cluster:" + optimalC + " in [" + cl_min + "," + cl_max +"]");
	}	
	
	public void convergenceTest() {
		double jm = 0;
		for(int i = 0; i < clsNum; i++) {
			for(int j = 0; j < ssize; j++) {
				jm += Math.pow(u[j][i], s) * sdistance(samples[j],centroids[i]);
			}
		}
		oldconver = convergence;
		convergence = jm;
	}
	
	public boolean termination() {
		double max = Double.MIN_VALUE;
		for(int k = 0; k < ssize; k++) {
			for(int i = 0; i < clsNum; i++) {
				double temp = Math.abs(ou[k][i]-u[k][i]);
				if(max < temp) max = temp;
			}
		}
		if(max < E) return true;
		return false;
	}
	
	public void updateCenters() {
		double[][] mus = new double[ssize][clsNum];
		double[] sum_mu = new double[clsNum];
		for(int i = 0; i < clsNum; i++) {
			sum_mu[i] = 0;
			for(int k = 0; k < ssize; k++) {
				mus[k][i] = Math.pow(u[k][i], s);
				sum_mu[i] += mus[k][i];
			}
		}
		
		for(int i = 0; i < clsNum; i++) {
			for(int j = 0; j < fsize; j++) {
				double sum = 0;
				for(int k = 0; k < ssize; k++)
					sum += mus[k][i] * samples[k][j];
				centroids[i][j] = sum / sum_mu[i];
			}
		}
	}
	
	public void updateU(int k) {
		Vector certain = new Vector();
		Vector uncertain = new Vector();
		double[] d = new double[clsNum];

		for(int i = 0; i < clsNum; i++) {
			d[i] = distance(samples[k], centroids[i]);
			if(d[i] == 0) 
				certain.add(new Integer(i));
			else
				uncertain.add(new Integer(i));
		}
		
		if(certain.size() == 0) {
			for(int i = 0; i < clsNum; i++) {
				double sum = 0;
				for(int j = 0; j < clsNum; j++)
					sum += Math.pow(d[i]/d[j], 2*1.00/(s-1));
				u[k][i] = 1.0 / sum;
			}
		}
		else {
			double value = 1.00 / certain.size();
			int index = 0;
			for(int i = 0; i < certain.size(); i++) {
				index =((Integer)certain.get(i)).intValue();
				u[k][index] = 0;
			}
			for(int i = 0; i < uncertain.size(); i++) {
				index =((Integer)uncertain.get(i)).intValue();
				u[k][index] = value;
			}			
		}
	}
	
	/**
	 * Reference
	 * "A validity measure for fuzzy clustering"
	 */
	public double evaluation() {
		double sum = 0;
		for(int i = 0; i < clsNum; i++) {
			for(int k = 0; k < ssize; k++) {
				sum += u[k][i]*u[k][i]*sdistance(centroids[i],samples[k]);
			}
		}
		double min = Double.MAX_VALUE;
		for(int i = 0; i < clsNum; i++)
			for(int j = 0; j < i; j++) {
				double temp = sdistance(centroids[i],centroids[j]);
				if(min > temp)
					min = temp;
			}
		double s = sum * 1.00 / (ssize * min);
		System.out.println("Compactness: " + sum * 1.00/ssize + " Seperation: " + min);
		return s;
	}
	
	/**
	 * This method return the result cluster based on tranditional method
	 * 
	 */
	public int[] CMap() {
		int[] map = new int[ssize];
		for(int k = 0; k < ssize; k++) {
			map[k] = 0;
			double max = u[k][0];
			for(int i = 0; i < clsNum; i++)
				if(max < u[k][i]){
					map[k] = i;
					max = u[k][i];
				}
		}
		return map;
	}
	
	public double[][] clusterData() {
		int[] map = CMap();
		for (int i = 0; i < ssize; i++) {
			for (int kk = 0; kk < fsize; kk++)
				samples[i][kk] = centroids[map[i]][kk];
		}
		
//		show progress
		setProgress(95);
		
		return samples;
	}
	
	/**
	 * This method return result cluster based on optimal cluster method
	 */
	public int[] optMap() {
		int[] map = new int[ssize];
		for(int k = 0; k < ssize; k++) {
			map[k] = 0;
			double max = optu[k][0];
			for(int i = 0; i < optimalC; i++)
				if(max < optu[k][i]){
					map[k] = i;
					max = optu[k][i];
				}
		}
		return map;		
	}
	
	public double[][] optClusterData() {
		int[] map = optMap();
		for (int i = 0; i < ssize; i++) {
			for (int kk = 0; kk < fsize; kk++)
				samples[i][kk] = centroids[map[i]][kk];
		}
		
//		show progress
		setProgress(95);
		
		return samples;
	}
	
	public void printMap(int[] map) {
		int len = (int)Math.sqrt(map.length);
		for(int i = 0; i < ssize; i++)
			if(i % len == (len-1)) System.out.println(map[i]);
			else System.out.print(map[i] + " ");
	}
	
	public void printSamples() {
		System.out.println("FCM Samples: ");
		for(int i = 0; i < samples.length; i++) {
			for(int j = 0; j < samples[i].length; j++)
				System.out.print(samples[i][j] + " ");
			System.out.println();
		}
	}
	
	public void printU() {
		System.out.println("FCM Relationship Matrix: ");
		NumberFormat nf = NumberFormat.getInstance();
		nf.setMaximumFractionDigits(4);
		for(int i = 0; i < ssize; i++) {
			for(int j = 0; j < clsNum; j++)
				System.out.print(nf.format(u[i][j]) + " ");
				
			System.out.println();
		}		
	}
	
	public void printCenters() {
		System.out.println("FCM Centroids: ");
		NumberFormat nf = NumberFormat.getInstance();
		nf.setMaximumFractionDigits(3);
		for(int i = 0; i < centroids.length; i++) {
			for(int j = 0; j < centroids[i].length; j++)
				System.out.print(nf.format(centroids[i][j]) + " ");
				
			System.out.println();
		}
	}
	
	public double sdistance(double[] a, double[] b) {
		double sum = 0;
		for(int i = 0; i < a.length; i++)
			sum += (a[i] - b[i]) * (a[i] - b[i]);
			
		return sum;
	}	
	
	public double distance(double[] a, double[] b) {
		double sum = 0;
		for(int i = 0; i < a.length; i++)
			sum += (a[i] - b[i]) * (a[i] - b[i]);
			
		return Math.sqrt(sum);
	}
	
	public void copyArray(double[] orig, double[] dest) {
		for(int i = 0; i < orig.length; i++)
			dest[i] = orig[i];
	}	
	
	public void copy2DArray(double[][] orig, double[][] dest) {
		int row = orig.length;
		int col = orig[0].length;
		for(int i = 0; i < row; i++) {
			for(int j = 0; j < col; j++) {
				dest[i][j] = orig[i][j];
			}
		}
	}

	/**
	 * 以下方法用于GUI交互
	 */
	public void setUI(InternalFrame inf, JScrollPane sp) {
		setInternalFrame(inf);
		setPane(sp);
	}
	
	public void setInternalFrame(InternalFrame inf) {
		frame = inf;
	}
	
	public void setPane(JScrollPane sp) {
		imagePane = sp;
	}
	
	public void setHeight(int h) {
		height = h;
	}
	
	public void setWidth(int w) {
		width = w;
	}
	
	public void buildImage() {
		double[][] img = clusterData();
		segImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
		Graphics g = segImage.getGraphics();
		for(int h = 0; h < height; h++) {
			for(int w = 0; w < width; w++) {
				int loc = h*width+w;
				Color color = new Color((int)img[loc][0],(int)img[loc][1],(int)img[loc][2]);
				g.setColor(color);
				g.fillRect(w,h,1,1);
			}
		}
		
		//show progress
		setProgress(97);
	}
	
	public void updatePane() {
		if (frame != null && imagePane != null && segImage != null) {
			if (frame instanceof segFrame) {
				((segFrame)frame).setSegImage(segImage);
			}
			
			JViewport vp = GUIUtil.createViewport(segImage);
			imagePane.setViewport(vp);
			imagePane.validate();
			frame.log("圖像初步分割完成");
		}
	}
	
	public void addProgress(int val) {
		if (val > 0)
			progressNum += val;
	}
	
	public void addProgress(double val) {
		if (val > 0)
			progressNum += val;
	}
	
	public void setProgress(int val) {
		if (val > 0)
			progressNum = val;
	}
	
	public void setProgress(double val) {
		if (val > 0)
			progressNum = val;
	}

	public int getProgress() {
		return (int)progressNum;
	}

	public String getActivity() {
		return (int)progressNum + "% Completed...";
	}

	public void stopMask() {
		System.exit(0);
	}

	public void run() {
		clustering();
		if (mode == 0) {
			buildImage();
			updatePane();
		}
		//show progress
		setProgress(100);
	}

	/**
	 * m = 0單幅處理
	 * 其他為批處理
	 */
	public void setMode(int m) {
		mode = m;
	}
	
	/**
	 * 中心集合設置開關 cmode=0 自身處理 
	 * cmode = 1 NewInit隨機方法 
	 * cmode = 2 NewInit二級聚類方法 
	 * cmode = 3 NewInit二分法
	 */
	public void setCMode(int m) {
		cmode = m;
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产成人午夜在线一区| 亚洲啪啪综合av一区二区三区| 天天免费综合色| 色狠狠av一区二区三区| 自拍偷拍亚洲综合| 99精品国产热久久91蜜凸| 国产精品国产三级国产有无不卡| 国产.欧美.日韩| 国产嫩草影院久久久久| 成人精品电影在线观看| 中文字幕国产一区二区| 成人免费看片app下载| 国产精品欧美综合在线| 成人午夜av电影| 一色桃子久久精品亚洲| 91在线播放网址| 樱花影视一区二区| 欧美男男青年gay1069videost| 午夜av一区二区三区| 欧美精三区欧美精三区| 美国十次了思思久久精品导航| 3d成人h动漫网站入口| 麻豆专区一区二区三区四区五区| 日韩欧美久久久| 国产做a爰片久久毛片 | 91亚洲国产成人精品一区二区三 | 亚洲第一激情av| 欧美区一区二区三区| 日韩在线a电影| 精品日产卡一卡二卡麻豆| 国产综合成人久久大片91| 国产视频一区二区在线| 99精品黄色片免费大全| 亚洲国产日韩精品| 91精品国产全国免费观看| 久久成人综合网| 国产欧美日韩综合精品一区二区| 99久久婷婷国产综合精品| 一区二区三区四区在线播放 | 欧美高清视频在线高清观看mv色露露十八| 亚洲成av人片在线观看无码| 欧美一区二区三区四区在线观看| 国产乱子轮精品视频| 国产精品―色哟哟| 欧美亚一区二区| 另类小说色综合网站| 国产欧美一区二区三区网站| 色综合天天做天天爱| 日韩av电影一区| 久久久精品国产免大香伊| av电影天堂一区二区在线观看| 亚洲在线视频一区| 欧美va亚洲va| 91美女在线观看| 日本女人一区二区三区| 国产日韩欧美a| 欧美视频你懂的| 国产盗摄一区二区三区| 一区二区三区中文在线观看| 精品美女被调教视频大全网站| 成人av在线一区二区三区| 午夜精品久久久久久久久久| 久久日一线二线三线suv| 色综合色狠狠综合色| 蜜臀a∨国产成人精品| 中文字幕在线不卡国产视频| 欧美日本免费一区二区三区| 国产精品888| 丝袜诱惑制服诱惑色一区在线观看| 国产午夜亚洲精品羞羞网站| 欧美中文字幕一区二区三区| 国内精品嫩模私拍在线| 夜夜操天天操亚洲| 久久精品欧美日韩| 欧美精选午夜久久久乱码6080| 成人app网站| 久国产精品韩国三级视频| 亚洲精品视频一区二区| 久久久午夜精品| 欧美精品日韩精品| 91在线小视频| 国产一区二区福利| 丝袜亚洲另类欧美| 亚洲欧美在线观看| 久久影院视频免费| 欧美区一区二区三区| 91热门视频在线观看| 国产一区二区精品久久99| 日韩精品一级二级 | 狠狠色丁香久久婷婷综| 亚洲综合自拍偷拍| 中文欧美字幕免费| 日韩欧美在线观看一区二区三区| 色88888久久久久久影院按摩| 国产伦精品一区二区三区在线观看 | 亚洲国产视频a| 国产精品成人网| 久久精品欧美日韩精品| 欧美一级一区二区| 欧美日韩一级二级| 91在线你懂得| 成人久久18免费网站麻豆| 激情图区综合网| 麻豆精品视频在线| 人人精品人人爱| 天天射综合影视| 亚洲一区自拍偷拍| 一区二区三区久久| 最新久久zyz资源站| 国产嫩草影院久久久久| 久久久www成人免费毛片麻豆| 日韩精品自拍偷拍| 日韩一区二区三区电影在线观看 | 91精品国产综合久久婷婷香蕉| 色综合av在线| 色域天天综合网| 一本久道久久综合中文字幕| 北条麻妃国产九九精品视频| 国产成人精品一区二| 国产精品一二三区| 国产精品正在播放| 国产精品夜夜爽| 国产精品白丝av| 国产成人综合精品三级| 国产精品一区二区三区乱码| 国产美女在线观看一区| 国产一区二区在线视频| 国内外成人在线| 国产乱码一区二区三区| 国产成人综合在线| 成人深夜在线观看| 白白色 亚洲乱淫| 99视频精品全部免费在线| 不卡av在线网| 91高清视频在线| 色偷偷久久一区二区三区| 91麻豆免费视频| 欧美亚洲一区二区在线| 欧美视频第二页| 日韩一级片在线播放| 精品嫩草影院久久| 久久色视频免费观看| 国产精品污网站| 亚洲蜜臀av乱码久久精品| 夜夜嗨av一区二区三区中文字幕 | 99精品国产一区二区三区不卡| 99精品偷自拍| 91福利视频在线| 欧美高清视频一二三区| 精品国产sm最大网站免费看| 国产调教视频一区| 亚洲色图一区二区三区| 一区二区视频在线| 亚洲18色成人| 久久99精品久久久久久久久久久久 | 成人免费毛片嘿嘿连载视频| a4yy欧美一区二区三区| 欧美午夜精品一区二区三区| 777奇米四色成人影色区| 日韩欧美一区二区久久婷婷| 国产日韩在线不卡| 亚洲免费色视频| 日韩精品欧美精品| 国产成人综合视频| 在线看国产一区| 日韩三级.com| 国产精品久久久久久久久图文区| 亚洲综合自拍偷拍| 久久97超碰色| 91麻豆视频网站| 日韩三级在线免费观看| 中文字幕免费不卡| 亚洲一级二级三级在线免费观看| 男男视频亚洲欧美| 懂色av一区二区三区蜜臀| 在线视频你懂得一区| 精品国产伦一区二区三区免费| 国产精品成人免费在线| 日本美女一区二区三区视频| 国产盗摄一区二区三区| 欧美亚洲丝袜传媒另类| 欧美精品一区二区三区高清aⅴ | 成人理论电影网| 欧美日韩一本到| 国产亚洲一本大道中文在线| 亚洲精品视频免费看| 日韩va欧美va亚洲va久久| 成人综合在线观看| 69av一区二区三区| 中文字幕亚洲不卡| 美女尤物国产一区| 色婷婷激情综合| 久久久久久**毛片大全| 亚洲电影中文字幕在线观看| 国产一区二区不卡在线| 在线不卡一区二区| 国产精品久99| 久久国产成人午夜av影院| 欧美主播一区二区三区美女| 国产日产精品一区|