本文的原版python**參考了以下文章:
零基礎入門深度學習(1) - 感知器
零基礎入門深度學習(2) - 線性單元和梯度下降
在機器學習如火如荼的時代,python大行其道,幾乎所有的機器學習的程式都是python寫的。
.net的機器學習庫有,但是非常少,tensorflow也暫時並不支援.net.
寫這篇文章的目的,也只是想嘗試一下,通過將python的源**改寫成net來更加深入的理解感知機的原理。
畢竟在改寫的時候,每一行**都必須研究一下,很多知識是無法混過去的。
感知機的模型其實就這麼簡單,本文也不是深度學習的科普,所以具體不解釋。
(題外話 .net core 暫時沒有system.math的支援,對於一些簡單的機器學習,改寫起來沒有問題,但是稍微複雜一些就無能為力了。)
乙個感知機的**大概是這個樣子的,這裡矩陣的實現還是很原始的list>的方法不知道是否有其他寫法。
using system;
using system.collections.generic;
public class perceptron
activator = activator;
bias = 0.0f;
}public override string tostring()
s += "bias:" + this.bias;
return s;
}public float predict(listinput_vec)
//偏置項
sum += bias;
return activator(sum);
}public void train(list> input_vecs, listlabels, int interation, float rate)
}private void one_iteration(list> input_vecs, listlabels, float rate)
}private void update_weights(listinput_vec, float output, float label, float rate)
//更新bias
bias += rate * delta;}}
測試**如下:
anddemo是通過感知機模擬乙個and函式,linearunitdemo則是模擬乙個線性單元函式。
using system;
using system.collections.generic;
namespace csharp
static void linearunitdemo()
;perceptron p = new perceptron(1, activator);
list> input_vecs = new list>();
input_vecs.add(new list());
input_vecs.add(new list());
input_vecs.add(new list());
input_vecs.add(new list());
input_vecs.add(new list());
input_vecs[0].add(5);
input_vecs[1].add(3);
input_vecs[2].add(8);
input_vecs[3].add(1.4f);
input_vecs[4].add(10.1f);
listlabels = new list();
labels.add(5500);
labels.add(2300);
labels.add(7600);
labels.add(1800);
labels.add(11400);
p.train(input_vecs, labels, 50, 0.01f);
system.console.writeline(p.tostring());
system.console.writeline(input_vecs[0][0] + " years: " + p.predict(input_vecs[0]));
system.console.writeline(input_vecs[1][0] + " years: " + p.predict(input_vecs[1]));
system.console.writeline(input_vecs[2][0] + " years: " + p.predict(input_vecs[2]));
system.console.writeline(input_vecs[3][0] + " years: " + p.predict(input_vecs[3]));
system.console.writeline(input_vecs[4][0] + " years: " + p.predict(input_vecs[4]));
}static void anddemo()
;perceptron p = new perceptron(2, activator);
list> input_vecs = new list>();
input_vecs.add(new list());
input_vecs.add(new list());
input_vecs.add(new list());
input_vecs.add(new list());
input_vecs[0].add(1);
input_vecs[0].add(1);
input_vecs[1].add(0);
input_vecs[1].add(0);
input_vecs[2].add(1);
input_vecs[2].add(0);
input_vecs[3].add(0);
input_vecs[3].add(1);
listlabels = new list();
labels.add(1);
labels.add(0);
labels.add(0);
labels.add(0);
p.train(input_vecs, labels, 10, 0.1f);
system.console.writeline(p.tostring());
system.console.writeline("1 and 1 =" + p.predict(input_vecs[0]));
system.console.writeline("0 and 0 =" + p.predict(input_vecs[1]));
system.console.writeline("1 and 0 =" + p.predict(input_vecs[2]));
system.console.writeline("0 and 1 =" + p.predict(input_vecs[3]));}}
}
向量機和感知機的相同和不同點 感知機vs支援向量機
感知機 原理 二維空間中找到一條直線可以把所有二元類別分離開,三維或多維空間中,找到乙個分離超平面把所有二元類別分離開。而可把所有二元類別分離開的超平面不止乙個,哪個是最好的呢?損失函式 所有誤分類的點到超平面的總距離,找到損失函式最優化對應的超平面,即誤分類的點到超平面總距離最小的模型引數w,b ...
機器學習 感知機的C 實現
typedef vector vvec typedef vectorvec int main main函式內 遵循讀取資料 準備資料 開始訓練 開始測試 輸出結果這一順序,以下依次實現上述功能。實現中將 b 作為 w 的乙個維度。perceptron類的大致定義,只需要完成以下函式,就能實現感知機演...
乙個多層感知機C 的簡單實現
看了幾篇文章自己嘗試寫了乙個。我測試下來是收斂了。寫的很爛,程式設計水平不高。之後我會更新下 include include math.h include using namespace std float rand class neuron 連線類 class connect connect at...