感知器(perception)是二分類線性分類模型,其輸入為例項的特徵向量,輸出為例項的類別,取+1和-1的二值,感知機對應於輸入空間(特徵空間)中將例項劃分為正負兩類的分離超平面,屬於判別模型,感知機學習旨在求出將訓練資料進行線性劃分的分離超平面,為此匯入基於誤分類的損失函式,利用梯度下降法對於損失函式進行極小化,求得感知器模型。——–摘自統計學習方法
感知器包含輸入層和輸出層,主要對線性的資料能有較好的區分效果。
感知器演算法總的來說當例項點被誤分類,即位於分離的超平面的一側時,調整w,b的值,使分離超平面向該誤分類的一側移動,以減少該分類點與超平面的距離,直至超平面超過該誤分類點使其被正確分類;
感知器分為原始形式和對偶形式,兩種形式對感知器求解方法不同。具體對偶形式的感知器可以參考知乎:
感知器學習演算法原始形式:
輸入:訓練資料集t=
,其中xi
∈χ=r
n ,yi
∈γ= ,i=
1,2,
⋯,n ;學習率η(
0<
η<1)
; 輸出: w,b;感知器模型f(
x)=s
ign(
w⋅x+
b)(1) 選取初值w0
,b0
(2)在訓練集中選取資料(x
i,yi
) (3)如果yi
(w⋅x
i+b)
≤0 w
←w+η
yixi
b←b+ηyi
(4)轉至(2),直到訓練集中沒有誤分類的點
演算法實現:
以例2.1為例:
實現**:
#include
#include
#include
#include
using namespace std;
int w[2] = ;
int b = 0;
int step = 1;
class point
;point::point()
void point::givepoint(int inx,int iny,int intrue)
point::~point()
void minl(point *inpoint,int pointnum)
else
else
if (tempy <= 0)
printf("更新w:(%d,%d),b:%d\n", w[0], w[1], b);
break;}}
if (truecount == 3)
else
}}int main()
getchar();
printf("輸入完畢開始分類\n");
minl(inpoint, pointnum);
printf("最終w:(%d,%d),b:%d\n", w[0], w[1], b);
getchar();
}
實現效果:
感知器學習演算法對偶形式:
輸入:訓練資料集t=
,其中xi
∈χ=r
n ,yi
∈γ= ,i=
1,2,
⋯,n ;學習率η(
0<
η<1)
; 輸出:a,b;感知機模型f(
x)=s
ign(
∑nj=
1ajy
jxj⋅
x+b)
其中α=
(α1,
α2,⋯
,αn)
t (1)α←0
,b←0
(2)在訓練集中選取資料(x
i,yi
) (3)如果yi
≤0 α
i←αi
+η b
←b+η
yi(4)轉至(2)直到沒有誤分類資料
對偶形式中訓練例項僅以內積的形式出現,為了方便可以先將訓練例項間的內積計算出來並以矩陣的形式儲存,用gram矩陣(還記得現控課上被gram矩陣籠罩的陰影嗎?沒錯這邊又回來了ˋ_ˊ* ) g=
[xi⋅
xj]n
×n同樣用上面的例子實現**:
#include
#include
#include
#include
using namespace std;
int w[2] = ;
int b = 0;
int step = 1;
int y[3] = ;
class point
;point::point()
void point::givepoint(int inx, int iny, int intrue)
point::~point()
void duality_minl(point *inpoint, int pointnum,int
*alpha,int
**gram)
else
else
if (tempy <= 0)
printf("更新a:(%d,%d,%d),b:%d\n", alpha[0], alpha[1],alpha[2], b);
break;}}
if (truecount == 3)
else
}for (int i = 0; i < pointnum; i++)
}int main()
printf("請輸入樣本點的座標及樣本種類,用正負1表示\n");
for (int i = 0; i < pointnum; i++)
int**gram = new int
*[pointnum];
for (int i = 0; i < pointnum; i++)
for (int i = 0; i < pointnum; i++)
}getchar();
printf("輸入完畢開始分類\n");
//minl(inpoint, pointnum);
duality_minl(inpoint, pointnum, alpha, gram);
printf("最終w:(%d,%d),b:%d\n", w[0], w[1], b);
這邊感知器只能用於對線性的資料集進行二分類,而且因為樣本量較少 所以能很快並且無誤地將樣本的正負集區分開來,當樣本量多時可能無法全部無誤地區分,這是應該要用到迴圈次數和損失函式;
暫且先這樣,之後再改一下在mnist資料集上進行嘗試
統計學習方法(二)感知器C語音實現
感知器 perception 是二分類線性分類模型,其輸入為例項的特徵向量,輸出為例項的類別,取 1和 1的二值,感知機對應於輸入空間 特徵空間 中將例項劃分為正負兩類的分離超平面,屬於判別模型,感知機學習旨在求出將訓練資料進行線性劃分的分離超平面,為此匯入基於誤分類的損失函式,利用梯度下降法對於損...
《統計學習方法》 對偶感知器的python實現
其原理和原始形式的感知器的原理一樣,對偶就是是 實質是一樣,只是換了一種實現方式。我們用梯度下降法來更新權值時的公式為 由於太懶,這裡用手寫給出解答 為了方便計算xi xj,這裡先引入gram矩陣,有g xi xj 其中g為n n矩陣,n為資料的個數,實現如下 先給出偽 產生資料集的 如下 其中我們...
統計學習方法(二) 感知機
學習目標 損失函式推導過程 最終優化函式 min l w,b 推導過程 假設空間 即特徵空間中的所有線性分類器。模型的複雜度主要體現在例項特徵向量的維度d上或者特徵數量上。1 用python 自程式設計實現感知機模型,對訓練資料集進行分類,並對比誤分類點選擇次序不同對最終結果的影響。可採用函式式程式...