感知器算法

引例:判斷一個人是否長得帥??? 有如下feature: 身高,體重,三圍,顏值,學習成績(帥的人學習成績好的少...爲何要這麼一個扯淡的特徵下面會講解)等等。

假設有一個標準:每一個評分項給予多少分的權重,當所有feature與權重相乘的和大於某一個值的時候,那這個人就是帥哥!!

例子: 180*5+150*3+....>1000 帥哥! 小於則.....

感知器任務:通過已知的實例調節權重,使其能夠預測出未知實例的結果。

符號表示:

if       (w1*x1+w2*x2+.......>b) return true

else        return false

由於b是常數,我們可以將b表示爲-w0×X0,則可以表示爲

if       (w1*x1+w2*x2+.......+w0×x0>0) return true

else        return false

訓練方法:

當預測值等於我們期待的結果時: 什麼也不用做

但當其小於的時候,說明我們增加的權值小了,贏補上一個正數數 例如所有xi××2的和數學表達推導如下:

w1*x1+a*x1*x1+w2*x2+a*x2*x2+......  住:a爲學習速率因子,會影響學習速率

w的更新值相當於wi=wi+a×xi

當其大於時候應改爲減號,歸結起來應爲如下表達式:

wi=wi+a*(y-h(x))*xi

僞代碼表示:

while(循環結束條件)  {#此處可設爲讓樣本循環執行多少次
    delta_w[ ]={0};
    for(每個樣本){
        for(每個特徵 i){
            delta_w[i]+=a*(y-h(x))*wi;
        }
    }
     for(每個特徵 i){
            更新w權值
            wi+=dealta_w[i]
        }
}

問題:

1.迭代的停止條件是什麼?

答:自己定,可以是某個驗證集取得理想結果的時候,或是向上述例子,單純是循環多少次

2.當訓練時候遇到正確樣本會發生什麼?

答:什麼也不發生,當預測結果正確時候,就假定是最好感知器

3.每次迭代調整w或是所有樣本迭代完全後調整w(上例)有區別麼?

答:區別不大,也許w權值會有所變化,但實際效果沒多大區別。

4.某輪迭代後結果一定變好麼?

答:不一定,但總體趨勢是變好的!

5.a的作用和取值問題

答:作用是控制學習速率,一般選0-1之間,過大不能學習到最優值,過小沒有什麼變化~~

C語言實現代碼如下:

//此爲預測函數
//注:此處x0皆爲1,至少需要是一個定值
int predict(double x[ ] ,double w[ ],int feature){
    int sum=0;
    for(int i=0;i<feature;i++){
        sum+=w[i]*x[i];
    }
    if(sum>0) return 1;
    else return 0;
}
//此爲調參函數
void train(double train_set[ ][ ],int y[ ],double w[ ],int feature_num,int sample_num,int a,int iterator_num){
    while(iterator_num--){
        double* dw=new double[feature_num];
        for(int i=0;i<sample_num;i++){
            for(int j=0;j<feature_num;j++){
                dw[j]+=a*(y-predict(train_set[i]))*train_set[i][j];
            }
        }
    }
    for(int j=0,j<feature_num;j++){
        w[j]+=dw[j];
    }
}

優化方法:找出訓練後結果最好的一組w

                    由一個計數器,吧每次最好的記錄即可!

缺點:只能解決線性可分問題

通過升維度來解決!但是並不一定能取得很好效果,如增加學習成績這種特徵...

更好的解決方法以後再討論!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章