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

📄 algorithmldapca.java

📁 包含了模式识别中常用的一些分类器设计算法
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
		W.Elem[j][i] = eigVec[j];
	    }
	}
	
	// save the transformation matrix 
	//
	LDA = W;
    }
    

    /**    
     * Computes the line of discrimination for for class independent LDA 
     *
    public void computeDecisionRegions()
    {
	// Debug
	System.out.println(algo_id + " computeDecisionRegions()");
	
	// local variable 
	MyPoint pt = null;
	double dist = 0.0;
	int associated = 0;
	double smallestSoFar = Double.MAX_VALUE;
	
	int target = 0;
	boolean set1flag = true;
	boolean set2flag = true;
	boolean set3flag = true;
	int counter = 0;
	
	DisplayScale scale = output_panel_d.disp_area_d.getDisplayScale();
	
	double currentX = scale.xmin;
	double currentY = scale.ymin;
	
	// set precision
	//
	int outputWidth = output_panel_d.disp_area_d.getXPrecision();
	int outputHeight = output_panel_d.disp_area_d.getYPrecision();
	
	double incrementY = (scale.ymax-scale.ymin)/outputHeight;
	double incrementX = (scale.xmax-scale.xmin)/outputWidth;
	
	// declare a 2D array to store the class associations
	//
	output_canvas_d = new int[outputWidth][outputHeight];
	
	// loop through each and every point on the pixmap and
	// determine which class each pixel is associated with
	//
	
	pro_box_d.setProgressMin(0);
	pro_box_d.setProgressMax(outputWidth);
	
	for (int i = 0; i < outputWidth; i++)
	{
	    currentX += incrementX;
	    currentY = scale.ymin;

	    // set current status
	    //
	    pro_box_d.setProgressCurr(i);
	    
	    for (int j = 0; j < outputHeight; counter++, j++)
	    {
		// declare the current pixel point
		//		    
		currentY += incrementY;
		MyPoint pixel = new MyPoint(currentX, currentY);
		
		// convert the pixel to the time domain
		//
		double X[][] = new double[1][2];
		X[0][0] = pixel.x;
		X[0][1] = pixel.y;
		
		smallestSoFar = Double.MAX_VALUE;
		
		// reset the boolean flags
		//
		set1flag = true;
		set2flag = true;
		set3flag = true;
		
		// find the closest point from the first class
		//
		for (int k = 0; k < point_means_d.size(); k++)
		{
		    
		    // classify the sample to the first set
		    //
		    if (set1_d.size() > 0 && set1flag)
		    {
			set1flag = false;
			target = 0;
		    }
		    
		    // classify the sample to the second set
		    //
		    else if (set2_d.size() > 0 && set2flag)
		    {
			set2flag = false;
			target = 1;
		    }

		    // classify the sample to the third set
		    //
		    else if (set3_d.size() > 0 && set3flag)
			{
			    set3flag = false;
			    target = 2;
			}
		    
		    // classify the sample to the forth set
		    //
		    else
		    {
			target = 3;
		    }
		    
		    // get the first mean point
		    //
		    pt = (MyPoint)point_means_d.elementAt(k);
		    
		    // convert the mean point to the time domain
		    //
		    double Y[][] = new double[1][2];
		    Y[0][0] = pt.x;
		    Y[0][1] = pt.y;
		    
		    // represent the pixel as a matrix
		    //
		    Matrix A = new Matrix();
		    A.initMatrix(X, 1, 2);
		    
		    // represent the mean point as a matrix
		    //
		    Matrix B = new Matrix();
		    B.initMatrix(Y, 1, 2);
		    
		    // transform the pixel and mean point to
		    // the feature space
		    //
		    Matrix C = new Matrix();
		    Matrix D = new Matrix();
		    
		    A.multMatrix(LDA, C);
		    B.multMatrix(LDA, D);
		    
		    // find the distance between the pixel and
		    // mean point
		    //
		    dist = MathUtil.distance(C.Elem[0][0], C.Elem[0][1], D.Elem[0][0], D.Elem[0][1]);
		    
		    if (dist < smallestSoFar)
		    {
			associated = target;
			smallestSoFar = dist;
		    }
		}
		
		// put and entry in the output canvas array to
		// indicate which class the current pixel is
		// closest to
		//
		output_canvas_d[i][j] = associated;

		// add a point to the vector of decision
		// region points if the class that the current
		// point is associated with is different for
		// the class what the previous point was
		// associated with i.e., a transition point
		//
		if (j > 0 && i > 0)
		{
		    if (associated != output_canvas_d[i][j - 1] || associated != output_canvas_d[i - 1][j])
		    {
			decision_regions_d.add(pixel);
		    }
		}
	    }
	}
	}   */

    /**
     * Computes the line of discrimination for the classification 
     * algorithms when the corresponding flags have been initialized
     */
    public void computeDecisionRegions()
    {
	// Debug
	//System.out.println(algo_id + ": computeDecisionRegions()");
	    
	DisplayScale scale = output_panel_d.disp_area_d.getDisplayScale();
	    
	double currentX = scale.xmin;
	double currentY = scale.ymin;
	    
	// set precision
	//
	int outputWidth = output_panel_d.disp_area_d.getXPrecision();
	int outputHeight = output_panel_d.disp_area_d.getYPrecision();
	    
	double incrementY = (scale.ymax - scale.ymin) / outputHeight;
	double incrementX = (scale.xmax - scale.xmin) / outputWidth;
	    
	// declare a 2D array to store the class associations
	//
	output_canvas_d = new int[outputWidth][outputHeight];
	    
	// loop through each and every point on the pixmap and
	// determine which class each pixel is associated with
	//
	MyPoint point;
	double dist = 0.0;
	int associated = 0;
	double smallestSoFar = Double.MAX_VALUE;
	    
	int target = 0;
	boolean set1flag = true;
	boolean set2flag = true;
	boolean set3flag = true;
	
	pro_box_d.setProgressMin(0);
	pro_box_d.setProgressMax(outputWidth);
	pro_box_d.setProgressCurr(0);
	
	for (int i = 0; i < outputWidth; i++)
	{
	    currentX += incrementX;
	    currentY = scale.ymin;
	    pro_box_d.setProgressCurr(i);    
	    
	    for (int j = 0; j < outputHeight; j++)
	    {
		
		// declare the current pixel point
		//
		currentY += incrementY;
		MyPoint pixel = new MyPoint(currentX, currentY);
		smallestSoFar = Double.MAX_VALUE;
		
		// convert the pixel to the time domain
		//
		double X[][] = new double[1][2];
		X[0][0] = pixel.x;
		X[0][1] = pixel.y;
		
		// reset the boolean flags
		//
		set1flag = true;
		set2flag = true;
		set3flag = true;
		
		// find the closest point from the first class
		//
		for (int k = 0; k < point_means_d.size(); k++)
		{
		    
		    // classify the sample to the first set
		    //
		    if (set1_d.size() > 0 && set1flag)
		    {
			set1flag = false;
			target = 0;
		    }
		    
		    // classify the sample to the second set
		    //
		    else if (set2_d.size() > 0 && set2flag)
		    {
			set2flag = false;
			target = 1;
		    }
		    
		    // classify the sample to the third set
		    //
		    else if (set3_d.size() > 0 && set3flag)
		    {
			set3flag = false;
			target = 2;
		    }
		    
		    // classify the sample to the forth set
		    //
		    else
		    {
			target = 3;
		    }
		    
		    // get the first mean point
		    //
		    point = (MyPoint)point_means_d.elementAt(k);
		    
		    // convert the mean point to the time domain
		    //
		    double Y[][] = new double[1][2];
		    Y[0][0] = point.x;
		    Y[0][1] = point.y;
			
		    // represent the pixel as a matrix
		    //
		    Matrix A = new Matrix();
		    A.initMatrix(X, 1, 2);
		    
		    // represent the mean point as a matrix
		    //
		    Matrix B = new Matrix();
		    B.initMatrix(Y, 1, 2);
		    
		    // transform the pixel and mean point to the 
		    // feature space
		    //
		    Matrix C = new Matrix();
		    Matrix D = new Matrix();
		    
		    A.multMatrix(trans_matrix_d, C);
		    B.multMatrix(trans_matrix_d, D);
		    
		    // find the distance between the pixel and
		    // mean point
		    //
		    dist = MathUtil.distance(C.Elem[0][0], C.Elem[0][1], 
					     D.Elem[0][0], D.Elem[0][1]);
		    
		    if (dist < smallestSoFar)
		    {    
			associated = target;
			smallestSoFar = dist;
		    }
		}
		
		// put and entry in the output canvas array to
		// indicate which class the current pixel is
		// closest to
		//
		output_canvas_d[i][j] = associated;
		
		// add a point to the vector of decision
		// region points if the class that the current
		// point is associated with is different for
		// the class what the previous point was
		// associated with i.e., a transition point
		//
		if (j > 0 && i > 0)
		{
		    if (associated != output_canvas_d[i][j - 1] || 
			associated != output_canvas_d[i - 1][j])
		    {
			decision_regions_d.add(pixel);
		    }
		}
	    }
	} // end of the loop
	
    }
    
    /**
     * Counts the data points in each set in error and displays
     * them on the text message window
     */
    public void computeErrors()
    {
	// declare local variables
	//
	String text;
	double error;
	int samples = 0;
	int samples1 = 0;
	int samples2 = 0;
	int samples3 = 0;
	int samples4 = 0;
	
	int incorrect = 0;
	int incorrect1 = 0;
	int incorrect2 = 0;
	int incorrect3 = 0;
	int incorrect4 = 0;
	
	DisplayScale scale = output_panel_d.disp_area_d.getDisplayScale();
	
	// set scales
	int outputWidth = output_panel_d.disp_area_d.getXPrecision();
	int outputHeight = output_panel_d.disp_area_d.getYPrecision();
	
	double incrementY = (scale.ymax-scale.ymin)/outputHeight;
	double incrementX = (scale.xmax-scale.xmin)/outputWidth;
	
	// compute the classification error for the first set
	//
	for (int i = 0; i < set1_d.size(); i++)
	{
	    MyPoint point = (MyPoint)set1_d.elementAt(i);
	    samples1++;
	    if ((point.x > scale.xmin && point.x < scale.xmax)
		&& (point.y > scale.ymin && point.y < scale.ymax))
	    {
		if (output_canvas_d[(int)((point.x - scale.xmin) / incrementX)]
		            [(int)((point.y - scale.ymin) / incrementY)] != 0)
		{
		    incorrect1++;
		}
	    }
	}
	
	if (set1_d.size() > 0)
	{
	    error = ((double)incorrect1 / (double)samples1) * 100.0;
	    
	    text =
		new String(
			   "       Results for class 0:\n"
			   + "          Total number of samples: "
			   + samples1
			   + "\n"
			   + "          Misclassified samples: "
			   + incorrect1
			   + "\n"
			   + "          Classification error: "
			   + MathUtil.setDecimal(error, 2)
			   + "%");
	    
	    pro_box_d.appendMessage(text);
	}
	
	// compute the classification error for the second set
	//
	for (int i = 0; i < set2_d.size(); i++)
        {
	    MyPoint point = (MyPoint)set2_d.elementAt(i);
	    samples2++;
	    if ((point.x > scale.xmin && point.x < scale.xmax)
		&& (point.y > scale.ymin && point.y < scale.ymax))
	    {
		if (output_canvas_d[(int)((point.x - scale.xmin) / incrementX)]
		    [(int)((point.y - scale.ymin) / incrementY)] != 1)
		{
		    incorrect2++;
		}
	    }
	}
	
	if (set2_d.size() > 0)
	{
	    error = ((double)incorrect2 / (double)samples2) * 100.0;
	    
	    text =
		new String(
			   "       Results for class 1:\n"
			   + "          Total number of samples: "
			   + samples2
			   + "\n"
			   + "          Misclassified samples: "
			   + incorrect2
			   + "\n"
			   + "          Classification error: "
			   + MathUtil.setDecimal(error, 2)
			   + "%");
	    
	    pro_box_d.appendMessage(text);
	}
	
	// compute the classification error for the third set
	//
	for (int i = 0; i < set3_d.size(); i++)
	{
	    MyPoint point = (MyPoint)set3_d.elementAt(i);
	    samples3++;
	    if ((point.x > scale.xmin && point.x < scale.xmax)
		&& (point.y > scale.ymin && point.y < scale.ymax))
	    {
		if (output_canvas_d[(int)((point.x - scale.xmin) / incrementX)]
		    [(int)((point.y - scale.ymin) / incrementY)] != 2)
		{
		    incorrect3++;
		}
	    }
	}
	
	if (set3_d.size() > 0)
	{
	    error = ((double)incorrect3 / (double)samples3) * 100.0;
	    
	    text =
		new String(
			   "       Results for class 2:\n"
			   + "          Total number of samples: "
			   + samples3
			   + "\n"
			   + "          Misclassified samples: "
			   + incorrect3
			   + "\n"
			   + "          Classification error: "
			   + MathUtil.setDecimal(error, 2)
			   + "%");
	    
	    pro_box_d.appendMessage(text);
	}
	
	// compute the classification error for the forth set
	//
	for (int i = 0; i < set4_d.size(); i++)
	{
	    
	    MyPoint point = (MyPoint)set4_d.elementAt(i);
	    samples4++;
	    if ((point.x > scale.xmin && point.x < scale.xmax)
		&& (point.y > scale.ymin && point.y < scale.ymax))
	    {
		if (output_canvas_d[(int)((point.x - scale.xmin) / incrementX)]
		    [(int)((point.y - scale.ymin) / incrementY)] != 3)
		{
		    incorrect4++;
		}
	    }
	}
	
	if (set4_d.size() > 0)
	{
	    error = ((double)incorrect4 / (double)samples4) * 100.0;
	    
	    text =
		new String(
			   "       Results for class 3:\n"
			   + "          Total number of samples: "
			   + samples4
			   + "\n"
			   + "          Misclassified samples: "
			   + incorrect4
			   + "\n"
			   + "          Classification error: "
			   + MathUtil.setDecimal(error, 2)
			   + "%");
	    
	    pro_box_d.appendMessage(text);
	}
	
	// compute the overall classification error
	//
	samples = samples1 + samples2 + samples3 + samples4;
	incorrect = incorrect1 + incorrect2 + incorrect3 + incorrect4;
	error = ((double)incorrect / (double)samples) * 100.0;
	
	text =
	    new String(
		       "       Overall results:\n"
		       + "          Total number of samples: "
		       + samples
		       + "\n"
		       + "          Misclassified samples: "
		       + incorrect
		       + "\n"
		       + "          Classification error: "
		       + MathUtil.setDecimal(error, 2)
		       + "%");
	
	pro_box_d.appendMessage(text);
    }       
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -