引例:判斷一個人是否長得帥??? 有如下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
由一個計數器,吧每次最好的記錄即可!
缺點:只能解決線性可分問題
通過升維度來解決!但是並不一定能取得很好效果,如增加學習成績這種特徵...
更好的解決方法以後再討論!