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

📄 perceptron.java

📁 模式识别中K均值、ISODATA等聚类算法以及感知器线性判别算法的Java实现
💻 JAVA
字号:
package edu.ict.discriminant;

import java.util.List;

import org.apache.commons.lang.ArrayUtils;

import edu.ict.SamplePoint;
import edu.ict.Utils;

/**
 * 感知器算法实现类
 * 
 * @author ysh
 * 
 */
public class Perceptron {
	/**
	 * 保存所有样本点
	 */
	private List<SamplePoint> points;

	/**
	 * 权向量
	 */
	private float[] w;

	/**
	 * 增量调整系数
	 */
	private float coef;

	/**
	 * 感知器算法实现类构造函数
	 * 
	 * @param points
	 *            样本点
	 * @param w
	 *            初始权向量
	 * @param coef
	 *            增量调整系数
	 */
	public Perceptron(List<SamplePoint> points, float[] w, float coef) {
		super();
		this.points = points;
		this.w = w;
		this.coef = coef;

		for (SamplePoint point : points) {
			if (point.getGroupNumber() != 1) {
				// 不属于第一类的样本模式向量都乘与-1
				float[] values = point.getValues();
				for (int i = 0; i < values.length; i++) {
					values[i] = -values[i];
				}
			}
		}
	}

	/**
	 * 运行感知器算法
	 */
	public void run() {

		boolean ok = false;

		// 迭代次数与权向量(w)的修正次数
		int nIters = 1, count = 1;

		while (!ok) {
			ok = true;

			System.out.println("--------迭代次序号:" + nIters + "-------");

			for (SamplePoint point : points) {
				if (!discriminant(point)) {
					// point被错分
					ok = false;
					float[] values = point.getValues();

					System.out.println(point + " 被错分");
					StringBuffer sbuf = new StringBuffer("修正权向量 w(" + count + ")="
							+ ArrayUtils.toString(w) + " -> ");

					for (int i = 0; i < w.length; i++) {
						w[i] += coef * values[i];
					}
					count++;

					sbuf.append("w(" + count + ")=" + ArrayUtils.toString(w));
					System.out.println(sbuf.toString());
				}
			}
			nIters++;
		}

		System.out.println("\n最终w为:" + ArrayUtils.toString(w));
	}

	private boolean discriminant(SamplePoint point) {
		float[] values = point.getValues();
		float discrnt_value = 0;
		for (int i = 0; i < values.length; i++) {
			discrnt_value += w[i] * values[i];
		}
		return discrnt_value > 0;
	}

	public static void main(String[] args) throws Exception {
		String file = "perceptron_data_1.txt";
		List<SamplePoint> points = Utils.readLabeledSamplePoints(file);
		float[] w = new float[] { 0, 0, 0, 0 };
		Perceptron perceptron = new Perceptron(points, w, 1.0f);
		perceptron.run();
	}
}

⌨️ 快捷键说明

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