統計學習方法(二)感知器C語音實現

2021-08-09 11:15:51 字數 3660 閱讀 2543

感知器(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 自程式設計實現感知機模型,對訓練資料集進行分類,並對比誤分類點選擇次序不同對最終結果的影響。可採用函式式程式...