機器學習入門篇——感知器


1.機器學習的基本概念:
三種主要的學習方式:
  1. 監督學習:使用有類標的訓練數據構建模型,即在訓練過程中,所有的數據都是知道它的類別的。通過構建的這個模型對未來的數據進行預測。在監督學習的下面,又可以分為分類(利用分類對類標進行預測),以及回歸(使用回歸預測連續輸出值)。
  2. 無監督學習:在沒有已知輸出變量(分類問題中是數據的類標)和反饋函數指導的情況下提取有效信息來探索數據的整體結構。子領域:1.通過聚類發現數據的子群;2,數據壓縮中的降維。
  3. 強化學習:構建一個系統,在與環境交互的過程中提高系統的性能。我們可以將強化學習視為與監督學習相關的一個領域。但是強化學習與監督學習不同的是,在強化學習中,並沒有一個確定的類標或一個連續類型的值,而是一個通過反饋函數產生的一個反饋值。該反饋值是對當前的系統行為的一個評價。強化學習解決的主要是交互式問題。象棋對弈就是一個常用的強化學習的例子。
機器學習的工作流程(使用預測模型進行數據分析):

如圖,機器學習的學習分為兩個部分,第一部分是訓練階段,通過數據帶入模型中,訓練生成最終模型,第二部分是測試階段,通過新的數據經驗模型的泛化能力。

 

2.感知器
  2.1感知器原理
感知器由費蘭克·羅森布拉特(Frank Rossenblatt)基於MPC神經元模型提出。感知器可以看作一個處理二分類問題的算法。
感知器的訓練過程如下圖:
 
 

第一步:得到凈輸入函數z;z為矩陣X與權值矩陣W的乘積,再加上一個權值偏差得到z:
第二步:通過激勵函數得到輸出的類標:

第三步,在訓練階段,通過激勵函數獲得到模型輸出的類標y,在將類標與實際類標進行計算得到誤差,進行權值更新。進行權值更新是以下的方法更新

圖片
  其中           η為學習速率,y(i)第i個樣本數據的真實類標,y(i)’第i個樣本預測得出的目標,xj(i)為第i個樣本中第j個值。
2.2實現算法
定義一個perception 類,
實現算法:1.初始化權值,
      2.計算輸出值,
      3.訓練模型:計算誤差,進行權值更新。

public class perception {
	
	public float[] weigth;//權值
	
	public float[][] x;//輸入值
	
	public int[] y;//樣本的真實類標
	
	public float rate;//學習數率,決定每一次循環訓練中所產生的權值變化;
	
	public float[] output;//輸出的類標
	
	public float b=0;//閾值,也稱為偏差

	/**
	 * 實例化感知器
	 * @param x 輸入的數據
	 * @param d  學習速率
	 */
	public perception(float[][] x, float d,int[] y) {
		super();
		this.x = x;//輸入數據
		this.rate = d;//學習數率
		this.y=y;//樣本的真實類標
		weigth=new float[x[0].length];//初始化權值數組
	    randomWeigth(x[0].length);//隨機給權值賦值
	}
	/**
	 * 給權值進行賦值,初始值為0
	 * @param n 權值數組的大小
	 */
	public void randomWeigth(int n){
		
	   // Random random = new Random();
	    for(int i=0;i<n;i++){
		    weigth[i]=0;
	    }
	}

	/**
	 * 訓練感知器:計算出誤差,然后進行權值更新
	 */
	public void train(){
		output=new float[x.length];
		//獲取輸出值
		for(int i=0;i<x.length;i++){
			output[i]=getoutput(x[i]);
		}
		//更新
		for(int i=0;i<output.length;i++){
			float update=rate*(y[i]-output[i]);
			//更新權重
			for(int j=0;j<weigth.length;j++){
				weigth[j]=weigth[j]+update*x[i][j];
			}
			//更新偏差
			b=b+update;
		}
		
		
	}
	//計算輸出值
	public int getoutput(float[] x){
		int output;//輸出值
                //計算凈輸入
		float z = 0;
		for(int i=0;i<x.length;i++){
			z+=x[i]*weigth[i];
		}
                //激勵函數
		if(z>=b)
		    output=1;
		else
			output=-1;
		return output;
	}  
	
}

 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM