本文的原版Python代碼參考了以下文章:
零基礎(chǔ)入門深度學(xué)習(xí)(1) - 感知器
零基礎(chǔ)入門深度學(xué)習(xí)(2) - 線性單元和梯度下降
在機(jī)器學(xué)習(xí)如火如荼的時代,Python大行其道,幾乎所有的機(jī)器學(xué)習(xí)的程序都是Python寫的。
.Net的機(jī)器學(xué)習(xí)庫有,但是非常少,Tensorflow也暫時并不支持.Net.
寫這篇文章的目的,也只是想嘗試一下,通過將Python的源代碼改寫成Net來更加深入的理解感知機(jī)的原理。
畢竟在改寫的時候,每一行代碼都必須研究一下,很多知識是無法混過去的。
感知機(jī)的模型其實(shí)就這么簡單,本文也不是深度學(xué)習(xí)的科普,所以具體不解釋。
(題外話 .Net Core 暫時沒有System.Math的支持,對于一些簡單的機(jī)器學(xué)習(xí),改寫起來沒有問題,但是稍微復(fù)雜一些就無能為力了。)
一個感知機(jī)的代碼大概是這個樣子的,這里矩陣的實(shí)現(xiàn)還是很原始的List
代碼的話,如果你看了上面的文章,就很容易理解了。
文章只有標(biāo)題,因?yàn)槲也恢牢铱吹降氖遣皇窃?,所以請大家自行百度?/p>
using System;using System.Collections.Generic;public class Perceptron{ private float bias = 0.0f; private List<float> weights = new List<float>(); private Func<float, float> activator; public Perceptron(int input_num, Func<float, float> Activator) { for (int i = 0; i < input_num; i++) { weights.Add(0.0f); } activator = Activator; bias = 0.0f; } public override string ToString() { var s = "weights:"; foreach (var weight in weights) { s += weight + System.Environment.NewLine; } s += "bias:" + this.bias; return s; } public float Predict(List<float> input_vec) { //這里規(guī)定向量長度和權(quán)重長度相等 float sum = 0.0f; for (int i = 0; i < weights.Count; i++) { sum += input_vec[i] * weights[i]; } //偏置項 sum += bias; return activator(sum); } public void train(List<List<float>> Input_vecs, List<float> labels, int interation, float rate) { for (int i = 0; i < interation; i++) { one_iteration(Input_vecs, labels, rate); } } private void one_iteration(List<List<float>> Input_vecs, List<float> labels, float rate) { for (int i = 0; i < labels.Count; i++) { var output = Predict(Input_vecs[i]); update_weights(Input_vecs[i], output, labels[i], rate); } } private void update_weights(List<float> input_vec, float output, float label, float rate) { var delta = label - output; for (int i = 0; i < weights.Count; i++) { weights[i] += rate * delta * input_vec[i]; } //更新bias bias += rate * delta; } }
測試代碼如下:
AndDemo是通過感知機(jī)模擬一個AND函數(shù),LinearUnitDemo則是模擬一個線性單元函數(shù)。
using System;using System.Collections.Generic;namespace CSharp{ class Program { static void Main(string[] args) { AndDemo(); LinearUnitDemo(); } static void LinearUnitDemo() { Func<float, float> activator = (x) => { return x; }; Perceptron p = new Perceptron(1, activator); List<List<float>> Input_vecs = new List<List<float>>(); Input_vecs.Add(new List<float>()); Input_vecs.Add(new List<float>()); Input_vecs.Add(new List<float>()); Input_vecs.Add(new List<float>()); Input_vecs.Add(new List<float>()); 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); List<float> labels = new List<float>(); 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() { Func<float, float> activator = (x) => { return x > 0 ? 1.0f : 0.0f; }; Perceptron p = new Perceptron(2, activator); List<List<float>> Input_vecs = new List<List<float>>(); Input_vecs.Add(new List<float>()); Input_vecs.Add(new List<float>()); Input_vecs.Add(new List<float>()); Input_vecs.Add(new List<float>()); 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); List<float> labels = new List<float>(); 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])); } } }
對于機(jī)器學(xué)習(xí)感興趣的同學(xué)可以關(guān)注一下微信號 "TensorFlow教室" 一起學(xué)習(xí)機(jī)器學(xué)習(xí),深度學(xué)習(xí),自然語言處理。
http://www.cnblogs.com/TextEditor/p/6564919.html