感知機(perceptron)由rosenblatt於2023年提出,是神經網路與支援向量機的基礎。
感知機是最早被設計並被實現的人工神經網路。感知機是一種非常特殊的神經網路,它在人工神經網路的發展史上有著非常重要的地位,儘管它的能力非常有限,主要用於線性分類。
感知機還包括多層感知機,簡單的線**知機用於線性分類器,多層感知機(含有隱層的網路)可用於非線性分類器。本文中介紹的均是簡單的線**知機。
圖 1感知機工作方式:
(1)、學習階段:修改權值和偏置,根據」已知的樣本」對權值和偏置不斷修改----有監督學習。當給定某個樣本的輸入/輸出模式對時,感知機輸出單元會產生乙個實際輸出向量,用期望輸出(樣本輸出)與實際輸出之差來修正網路連線權值和偏置。
(2)、工作階段:計算單元變化,由響應函式給出新輸入下的輸出。
感知機學習策略:
感知機學習的目標就是求得乙個能夠將訓練資料集中正負例項完全分開的分類超平面,為了找到分類超平面,即確定感知機模型中的引數w和b,需要定義乙個基於誤分類的損失函式,並通過將損失函式最小化來求w和b。
(1)、資料集線性可分性:在二維平面中,可以用一條直線將+1類和-1類完美分開,那麼這個樣本空間就是線性可分的。因此,感知機都基於乙個前提,即問題空間線性可分;
(2)、定義損失函式,找到引數w和b,使得損失函式最小。
損失函式的選取:
(1)、損失函式的乙個自然選擇就是誤分類點的總數,但是這樣的點不是引數w,b的連續可導函式,不易優化;
(2)、損失函式的另乙個選擇就是誤分類點到劃分超平面s(w*x+b=0)的總距離。
以上理論部分主要來自:
以下**根據上面的描述實現:
perceptron.hpp:
#ifndef _perceptron_hpp_
#define _perceptron_hpp_
#include namespace ann ;
}#endif // _perceptron_hpp_
perceptron.cpp:
#include "perceptron.hpp"
#include #include #include namespace ann
bias += learn_rate * label_; // formula 5
}float perceptron::caldotproduct(const feature feature_, const std::vectorweight_)
return ret;
}void perceptron::initweight()
}perceptron::perceptron(int iterates_, float learn_rate_, int size_weight_, float bias_)
void perceptron::getdataset(const std::vectorfeature_set_, const std::vectorlabel_set_)
}bool perceptron::train()
} if (flag)
std::cout << std::endl;
std::cout << "bias: " << bias << std::endl;
return true;
} }return false;
}label perceptron::predict(const feature feature_)
}
test_nn.cpp:
#include #include "perceptron.hpp"
int test_perceptron();
int main()
int test_perceptron()
, , , , ,
, , , , ,
, , , , ,
, , , , };
int label_[len_data] = ;
std::vectorset_feature;
std::vectorset_label;
for (int i = 0; i < len_data; i++)
set_feature.push_back(feature_single);
set_label.push_back(label_[i]);
feature_single.resize(0);
} // train
int iterates = 1000;
float learn_rate = 0.5;
int size_weight = feature_dimension;
float bias = 2.5;
ann::perceptron perceptron(iterates, learn_rate, size_weight, bias);
perceptron.getdataset(set_feature, set_label);
bool flag = perceptron.train();
if (flag)
else
// predict
ann::feature feature1;
feature1.push_back(636.6);
feature1.push_back(881.8);
std::cout << "the correct result label is 1, " << "the real result label is: " << perceptron.predict(feature1) << std::endl;
ann::feature feature2;
feature2.push_back(-26.32);
feature2.push_back(-255.95);
std::cout << "the correct result label is -1, " << "the real result label is: " << perceptron.predict(feature2) << std::endl;
return 0;
}
執行結果如下圖:
感知機原理及python實現
感知機python實現 給定乙個資料集 t yi 輸入空間中任意一點x0 到超平面s的距離為 1 w yi w x0 b 這裡 w 是 w的l2 範數 假 設超平面 s的誤分 點集合為 m,那麼 所有誤分 點到超平 面s的總 距離為 1 w xi myi w xi b 在不考慮 1 w 的情 況下得...
python實現感知機
import numpy as np 定義啟用函式 def acti fun x return 1 if x 0 else 0 建立感知器類 class perception object 初始化權重 def init self self.weights 0 self.bias 1 定義訓練函式,包...
python實現AND感知機
and感知機通過訓練後,可以進行邏輯 與 的運算。例如 當輸入 1,1時,輸出為1 輸入1,0時,輸出為0。通過上圖,我們可以發現 0,0 0,1 1,0 這三個點數表示輸出為0,而點 1,1 表示輸出為1,所以我們可以近似找到一條直線將輸出為0的點與輸出為1的點分隔開。我們可以通過不斷訓練係數 即...