感知機和線性單元的C 版本

2022-01-12 09:37:57 字數 3561 閱讀 3495

本文的原版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...