機器學習 感知機的C 實現

2022-06-29 06:54:13 字數 1357 閱讀 7653

typedef vector> vvec;

typedef vectorvec;

int main()

main函式內**遵循讀取資料、準備資料、開始訓練、開始測試、輸出結果這一順序,以下依次實現上述功能。**實現中將\(b\)作為\(w\)的乙個維度。

perceptron類的大致定義,只需要完成以下函式,就能實現感知機演算法。

class perceptron ;
vvec csv_read(string filename) 

numarray.push_back(linearray);

}return numarray;

}

void get_label(vvec& data, bool flag) 

if (flag)

else

}

double mul_vv(vec& a, vec& b) 

return res;

}

vec mul_vd(vec& a, double b) 

return res;

}

vec add_vv(vec& a, vec& b) 

return res;

}

感知機使用乙個超平面將輸入樣本空間分隔成兩部分,一部分取為正例,另一部分取為負例。我們要解決的問題就是如何找到這個超平面。感知機的做法就是,在訓練過程中,能夠正確判斷訓練集時,感知機引數不變;當出錯時,使用梯度下降法更新\(w\)和偏置\(b\)。

已知點到面的距離為\(\frac\),我們設為\(f(x) =\frac\),當判斷正確時,該距離為正,判斷錯誤時,該距離為負,以此來區分判斷錯誤的輸入。當遇到這樣的輸入時,我們用梯度下降法更新感知機引數,由於\(w\)的二範數必定大於0,此時該距離對於引數\(w\)的導數為\(-y (x + b)\),引數\(b\)的導數為\(-y\)。

void train(int itera) 

}cout << "round: " << i << " / " << itera << endl;

cout << "test_acc:" << test() << endl;

}}

當\(y (wx + b)\)為負時,代表分類錯誤。

double test() 

double acc_rate = 1 - (err_cnt / m);

return acc_rate;

}

機器學習 感知機

感知機是一種簡單的二類分類的線性分類模型,用於處理可以線性可分的二分類問題。感知機對應於輸入空間 特徵空間 中將例項劃分為正負兩類的分離超平面,屬於判別模型。模型。從輸入空間到輸出空間有如下函式 f x s ign wtx b 其中w 為權值,b為偏執。生成的超平面為 wt x b 0 其中w 為超...

機器學習 感知機

r nx rn 輸出空間為y 輸入x x x x表示例項的特徵向量,對應於輸入空間的點 輸出y y表示示例的類別。由輸入空間到輸出空間的函式為 x si gn w x b f x sign w x b x w x表示w和x的點積i 1mwi xi w 1x1 w2x2 wnx n i 1mwixi ...

機器學習 感知機

1 感知機是二分類的線性模型,輸入空間是例項的特徵向量,輸出是例項的類別 1,1 屬於判別模型。2 假設資料線性可分,感知機的學習目標是求得乙個能夠將訓練集資料正例和負例完全分開的分離超平面,如果訓練資料線性不可分,那麼就無法獲得這個超平面 抑或問題 針對抑或問題,解決方法是多層感知機組合。3 輸入...