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