欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java实现简单的感知器算法(Perceptron Algorithm)

程序员文章站 2022-04-16 10:01:31
...

使用诸如matlab之类的实验室语言实现各类DM算法很方便,可以很快的获得实验结果,因为各类经典的数学或者DM算法都以函数的形式体现,你要做的大部分工作都可以调用这些函数,而你只需要编写少量代码就ok。但使用这类语言也有缺点,其一是这样做的效率可能不怎么高,原因是你不清楚底层代码的实现而盲目调用。其二是无法真正理解这些经典的数学或者是DM算法(看懂一个算法距离实现一个算法还是很遥远的)。 so,我尝试使用java实现一系列经典的DM算法,以加深对它们的理解。先从比较简单的感知器算法开始。 感知器算法流程:
java实现简单的感知器算法(Perceptron Algorithm)

/**
 * 感知器算法:作为adaboost算法的弱分类器
 * 参考资料:http://wenku.baidu.com/view/f2aeda2458fb770bf78a55e5.html###
 * @author zhenhua.chen
 * @Description: TODO
 * @date 2013-3-7 上午9:31:01 
 *
 */
public class PerceptronApproach {
	private static final int T = 100; // 最大迭代次数
	
	/**
	 * 
	 * @param dataSet:数据集
	 * @param weight:每条数据的权重
	 * @return
	 */
	public ArrayList<Double> getWeightVector(ArrayList<ArrayList<Double>> dataSet, ArrayList<Double> dataWeight) {
		int dataLength = 0;
		if(null == dataSet) {
			return null;
		} else {
			dataLength = dataSet.get(0).size();
		}
		
		// 初始化感知器的权重向量
		ArrayList<Double> sensorWeightVector = new ArrayList<Double>(); 
		for(int i = 0; i < dataLength; i++) {
			sensorWeightVector.add(1d);
		}
		
		// 初始化感知器的增量
//		int increment = 1;
		
		int sign = 0; // 迭代终止的条件: 权值向量的的值连续dataSet.size()次大于0
		for(int i = 0; i < T && sign < dataSet.size(); i++) { // 最大迭代次数
			for(int z = 0; z < dataSet.size(); z++) {
				double result = 0;
				for(int j = 0 ; j < dataLength; j++) {
					result += dataSet.get(z).get(j) * sensorWeightVector.get(j);
				}
				if(result > 0) {
					sign++;
					if(sign >= dataSet.size()) break;
				} else {
					sign = 0;
					for(int k = 0; k < dataLength; k++) { //更新权值向量
						sensorWeightVector.set(k, sensorWeightVector.get(k) + dataSet.get(z).get(k) * dataWeight.get(z));
					}
				}
			}
		}
		
		return sensorWeightVector;
	}
	
	public static void main(String[] args) {
		File f = new File("E:/PA.txt");
		BufferedReader reader = null;
		
		try {
			reader = new BufferedReader(new FileReader(f));
			String str = null;
			try {
				ArrayList<ArrayList<Double>> dataSet = new ArrayList<ArrayList<Double>>();
				while((str = reader.readLine()) != null) {
					ArrayList<Double> tmpList = new ArrayList<Double>();
					String[] s = str.split("\t");
					for(int i = 0; i < s.length; i++) {
						tmpList.add(Double.parseDouble(s[i]));
					}
					dataSet.add(tmpList);
				}
				
				ArrayList<Double> dataWeight = new ArrayList<Double>();
				for(int i = 0; i < dataSet.size(); i++) {
					dataWeight.add(1d);
				}
				
				PerceptronApproach d = new PerceptronApproach();
				d.getWeightVector(dataSet, dataWeight);
				System.out.println(d.getWeightVector(dataSet, dataWeight));
				
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	
}

 

 

 

 

相关标签: 感知器