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

如圖,機器學習的學習分為兩個部分,第一部分是訓練階段,通過數據帶入模型中,訓練生成最終模型,第二部分是測試階段,通過新的數據經驗模型的泛化能力。
2.感知器
2.1感知器原理
感知器由費蘭克·羅森布拉特(Frank Rossenblatt)基於MPC神經元模型提出。感知器可以看作一個處理二分類問題的算法。
感知器的訓練過程如下圖:
第一步:得到凈輸入函數z;z為矩陣X與權值矩陣W的乘積,再加上一個權值偏差得到z:
第二步:通過激勵函數得到輸出的類標:
第三步,在訓練階段,通過激勵函數獲得到模型輸出的類標y,在將類標與實際類標進行計算得到誤差,進行權值更新。進行權值更新是以下的方法更新
其中
η為學習速率,y(i)為第i個樣本數據的真實類標,y(i)’為第i個樣本預測得出的目標,xj(i)為第i個樣本中第j個值。
η為學習速率,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;
}
}
