神经网络与机器学习 笔记—Rosenblatt感知器收敛算法C++实现
生活随笔
收集整理的這篇文章主要介紹了
神经网络与机器学习 笔记—Rosenblatt感知器收敛算法C++实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Rosenblatt感知器收斂算法C++實現
算法概述
自己用C++實現了下,測試的例子和模式用的都是雙月分類模型,關于雙月分類相關看之前的那個筆記:
https://blog.csdn.net/u013761036/article/details/90548819
直接上實現代碼:
#pragma once #include "stdafx.h" #include <string> #include <iostream> using namespace std;int gnM = 0; //訓練集空間維度 int gnN = 0; //突觸權值個數 double gdU = 0.01; //學習率參數void RosenBlattInit(double *dX, int nM, double *dW, int nN ,double dB ,double dU) {//dX 本次訓練數據集//nM 訓練集空間維度//dW 權值矩陣//nN 突觸權值個數 RosenBlatt只有一個神經元,所以nM==nM//dB 偏置,正常這個是應該 走退火動態調整的,以后再說,現在固定得了。//dU 學習率參數if (nM > 0) {dX[0] = 1;//把偏置永遠當成一個固定的突觸}for (int i = 0; i <= nN; i++) {if (i == 0) {dW[i] = dB;//固定偏置}else {dW[i] = 0.0;}}gnM = nM ,gnN = nN ,gdU = dU; }double Sgn(double dNumber) {return dNumber > 0 ? +1.0 : -1.0; }//感知器收斂算法-學習 void RosenBlattStudy(const double *dX, const double dD, double *dW) {//dX 本次訓練數據集//dD 本次訓練數據集的期望值//dW 動態參數,突觸權值double dY = 0;for (int i = 0; i <= gnM && i <= gnN; i++) {dY = dY + dX[i] * dW[i];}dY = Sgn(dY);if (dD == dY) {return;//不需要進行學習調整突觸權值}for (int i = 1; i <= gnM && i <= gnN; i++) {dW[i] = dW[i] + gdU * (dD - dY) * dX[i];} }//感知器收斂算法-泛化 double RosenBlattGeneralization(const double *dX , const double *dW) {//dX 本次需要泛化的數據集//dW 已經學習好的突觸權值//返回的是當前需要泛化的數據集的泛化結果(屬于那個域的)double dY = 0;for (int i = 0; i <= gnM && i <= gnN; i++) {dY = dY + dX[i] * dW[i];}return Sgn(dY); }//雙月分類模型,隨機獲取一組值 /* 自己稍微改了下 域1:上半個圓,假設圓心位坐標原點(0,0)(x - 0) * (x - 0) + (y - 0) * (y - 0) = 10 * 10x >= -10 && x <= 10y >= 0 && y <= 10 域2:下半個圓,圓心坐標(10 ,-1)(x - 10) * (x - 10) + (y + 1) * (y + 1) = 10 * 10;x >= 0 && x <= 20y >= -11 && y <= -1 */const double gRegionA = 1.0; //雙月上 const double gRegionB = -1.0;//雙月下void Bimonthly(double *dX ,double *dY ,double *dResult) {//dX 坐標x//dY 坐標y//dResult 屬于哪個分類*dResult = rand () % 2 == 0 ? gRegionA : gRegionB;if (*dResult == gRegionA) {*dX = rand() % 20 - 10;//在區間內隨機一個X*dY = sqrt(10 * 10 - (*dX) * (*dX));//求出Y}else {*dX = rand() % 20;*dY = sqrt(10 * 10 - (*dX - 10) * (*dX - 10)) - 1;*dY = *dY * -1;} }int main() {//system("color 0b");double dX[2 + 1], dD, dW[2 + 1]; //輸入空間維度為3 平面坐標系+一個偏置double dU = 0.1;double dB = 0;RosenBlattInit(dX, 2, dW, 2, dB, dU);//初始化 感知器double dBimonthlyX, dBimonthlyY, dBimonthlyResult;int nLearningTimes = 1024 * 10;//進行10K次學習for (int nLearning = 0; nLearning <= nLearningTimes; nLearning++) {Bimonthly(&dBimonthlyX, &dBimonthlyY, &dBimonthlyResult);//隨機生成雙月數據dX[1] = dBimonthlyX;dX[2] = dBimonthlyY;dD = dBimonthlyResult;RosenBlattStudy(dX, dD, dW);//cout <<"Study:" << nLearning << " :X= " << dBimonthlyX << "Y= " << dBimonthlyY << " D=" << dBimonthlyResult<< "----W1= " << dW[1] << " W2= " << dW[2] << endl;}//進行感知器泛化能力測試 測試數據量1Kint nGeneralizationTimes = 1 * 1024;int nGeneralizationYes = 0, nGeneralizationNo = 0;double dBlattGeneralizationSuccessRate = 0;for (int nLearning = 1; nLearning <= nGeneralizationTimes; nLearning++) {Bimonthly(&dBimonthlyX, &dBimonthlyY, &dBimonthlyResult);//隨機生成雙月數據dX[1] = dBimonthlyX;dX[2] = dBimonthlyY;//cout << "Generalization: " << dBimonthlyX << "," << dBimonthlyY;if (dBimonthlyResult == RosenBlattGeneralization(dX, dW)) {nGeneralizationYes++;//cout << " Yes" << endl;}else {nGeneralizationNo++;//cout << " No" << endl;}}dBlattGeneralizationSuccessRate = nGeneralizationYes * 1.0 / (nGeneralizationNo + nGeneralizationYes) * 100;cout << "Study : " << nLearningTimes << " Generalization : " << nGeneralizationTimes << " SuccessRate:" << dBlattGeneralizationSuccessRate << "%" << endl;getchar();return 0; }結果:
學習了10K次,泛化測試1K次,成功率96%
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
總結
以上是生活随笔為你收集整理的神经网络与机器学习 笔记—Rosenblatt感知器收敛算法C++实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 神经网络与机器学习 笔记—Rosenbl
- 下一篇: 设计模式复习-工厂方法模式