import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

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,ArrayList<Double> dataOutput) {  
        int dataLength = 0; 
        double a = 0.1;
        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);//添加1,d是类型双精度浮点值  
        }  

          
        // 初始化感知器的增量  
//      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);//得到加权值  
                }  
                
                // b为阈值
                double b = 4;
                result =result - b;
                int d_value;
                if(result > 0){
                    d_value = 1;
                }
                else{
                    d_value = 0;
                }
                
                //权值更新一次
                for(int k=0;k<sensorWeightVector.size();k++){
                    sensorWeightVector.set(k, sensorWeightVector.get(k)-a*(d_value-dataOutput.get(z))*dataSet.get(z).get(k));
                    System.out.println(sensorWeightVector);
                }
       
            }  
        }  
        System.out.println(sensorWeightVector);
        return sensorWeightVector;  
    }  
      
    public static void main(String[] args) {  
        File f = new File("D:/Workspaces/MyEclipse 8.5/cellOutlierDetection/data/traindatainput.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); 
                    System.out.println(str);
                }  
                ArrayList<Double> dataOutput = new ArrayList<Double>();
                File OutputF = new File("D:/Workspaces/MyEclipse 8.5/cellOutlierDetection/data/traindataout.txt");
                BufferedReader OutputBr = new BufferedReader(new FileReader(OutputF));
                String Outputstr = null;
                while((Outputstr = OutputBr.readLine())!= null){
                    dataOutput.add(Double.parseDouble(Outputstr));
                    System.out.println(Outputstr);
                }
                
                  
                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,dataOutput);  
                  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
              
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        }  
    }  
      
}  

因为需要自己根据训练数据设定权值的更新方式,加上对MATLAB不熟悉,所以用java重写了单层感知器。源代码百度来的,以后找到网址再贴上来,然后根据自己的需要修改了权重跟新方式。保存在此,供自己以后学习和查看。