感知机和线性单元的C#版本
本文的原版Python代码参考了以下文章:
零基础入门深度学习(1) - 感知器
零基础入门深度学习(2) - 线性单元和梯度下降
在机器学习如火如荼的时代,Python大行其道,几乎所有的机器学习的程序都是Python写的。
.Net的机器学习库有,但是非常少,Tensorflow也暂时并不支持.Net.
写这篇文章的目的,也只是想尝试一下,通过将Python的源代码改写成Net来更加深入的理解感知机的原理。
毕竟在改写的时候,每一行代码都必须研究一下,很多知识是无法混过去的。

感知机的模型其实就这么简单,本文也不是深度学习的科普,所以具体不解释。
(题外话 .Net Core 暂时没有System.Math的支持,对于一些简单的机器学习,改写起来没有问题,但是稍微复杂一些就无能为力了。)
一个感知机的代码大概是这个样子的,这里矩阵的实现还是很原始的List<List>的方法不知道是否有其他写法。
代码的话,如果你看了上面的文章,就很容易理解了。
文章只有标题,因为我不知道我看到的是不是原文,所以请大家自行百度。
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)
{
//这里规定向量长度和权重长度相等
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是通过感知机模拟一个AND函数,LinearUnitDemo则是模拟一个线性单元函数。
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]));
}
}
}
对于机器学习感兴趣的同学可以关注一下微信号 "TensorFlow教室" 一起学习机器学习,深度学习,自然语言处理。
感知机和线性单元的C#版本的更多相关文章
- 用线性单元(LinearUnit)实现工资预测的Python3代码
功能:通过样本进行训练,让线性单元自己找到(这就是所谓机器学习)工资计算的规律,然后用两组数据进行测试机器是否真的get到了其中的规律. 原文链接在文尾,文章中的代码为了演示起见,仅根据工作年限来预测 ...
- ReLu(修正线性单元)、sigmoid和tahh的比较
不多说,直接上干货! 最近,在看论文,提及到这个修正线性单元(Rectified linear unit,ReLU). Deep Sparse Rectifier Neural Networks Re ...
- (2)Deep Learning之线性单元和梯度下降
往期回顾 在上一篇文章中,我们已经学会了编写一个简单的感知器,并用它来实现一个线性分类器.你应该还记得用来训练感知器的『感知器规则』.然而,我们并没有关心这个规则是怎么得到的.本文通过介绍另外一种『感 ...
- 修正线性单元(Rectified linear unit,ReLU)
修正线性单元(Rectified linear unit,ReLU) Rectified linear unit 在神经网络中,常用到的激活函数有sigmoid函数f(x)=11+exp(−x).双曲 ...
- 单层感知机_线性神经网络_BP神经网络
单层感知机 单层感知机基础总结很详细的博客 关于单层感知机的视频 最终y=t,说明经过训练预测值和真实值一致.下面图是sign函数 根据感知机规则实现的上述题目的代码 import numpy as ...
- TensorFlow学习笔记7-深度前馈网络(多层感知机)
深度前馈网络(前馈神经网络,多层感知机) 神经网络基本概念 前馈神经网络在模型输出和模型本身之间没有反馈连接;前馈神经网络包含反馈连接时,称为循环神经网络. 前馈神经网络用有向无环图表示. 设三个函数 ...
- DeepLearning学习(1)--多层感知机
想直接学习卷积神经网络,结果发现因为神经网络的基础较弱,学习起来比较困难,所以准备一步步学.并记录下来,其中会有很多摘抄. (一)什么是多层感知器和反向传播 1,单个神经元 神经网络的基本单元就是神经 ...
- lecture2-NN结构的主要类型的概述和感知机
Hinton课程第二课 一.NN结构的主要类型的概述 这里的结构就是连接在一起的神经元.目前来说,在实际应用中最常见的NN就是前向NN,他是将数据传递给输入单元,通过隐藏层最后到输出层的单元:一个更有 ...
- 现代英特尔® 架构上的 TensorFlow* 优化——正如去年参加Intel AI会议一样,Intel自己提供了对接自己AI CPU优化版本的Tensorflow,下载链接见后,同时可以基于谷歌官方的tf版本直接编译生成安装包
现代英特尔® 架构上的 TensorFlow* 优化 转自:https://software.intel.com/zh-cn/articles/tensorflow-optimizations-on- ...
随机推荐
- Linux系统监控命令
1. uptime: 负载监控,w命令更好地显示当前登录用户数的信息 2.top: 相当于uptime,提供了负载平均值的快照 (1)第一行: up 48days: 系统运行时间 2 users: 当 ...
- Linux笔记(十一) - 文件系统管理
(1)文件系统查看命令:df [选项] [挂载点]-a 显示所有文件系统信息,包括特殊文件系统,如/proc /sysfs-h 使用习惯单位显示容量,如KB,MB或GB-T 显示文件系统类型-m 以M ...
- ubuntu更换内核版本
一 详细的使用方法见: http://www.xlgps.com/article/310954.html 二 补充: 1 需要删除旧的内核的方法: sudo apt-get remove linux- ...
- ArcGIS制图技巧系列(1)还原真实的植被
ArcGIS制图技巧系列(1)还原真实的植被 by 李远祥 在GIS数据中,植被一般都是面装要素的形式存在.很多人在使用植被渲染的时候,一般会采用填充符号去渲染.而在ArcGIS中,填充符号要么就是纯 ...
- webapi 发布接口报405错误(angularjs2.0)
参考链接:http://www.cnblogs.com/shenbin/p/5680976.html web访问接口报405错误,以前的jQuery访问方式访问接口没有问题. 但是换成angularj ...
- IP地址和硬件地址 ARP协议
ip地址使用在网络层以上,是一个逻辑地址,物理地址是数据链路层和物理层使用的 在发送数据的时候,数据是从上层往下层发送的,通过tcp报文->ip数据报->mac数据帧 IP地址放在数据报的 ...
- SharePoint 2016 文档库的新功能简介
今天,重装了一下SharePoint 2016,想多了解了解,看到一些自己平时没注意的功能,或者新的功能,分享一下给大家. 1.界面上操作的变换,多了一排按钮,更像SharePoint Online了 ...
- POJ 2125 Destroying The Graph 二分图 最小点权覆盖
POJ2125 题意简述:给定一个有向图,要通过某些操作删除所有的边,每一次操作可以选择任意一个节点删除由其出发的所有边或者通向它的所有边,两个方向有不同的权值.问最小权值和的解决方案,要输出操作. ...
- [故障公告]博客站点遭遇超过20G的流量攻击被阿里云屏蔽
2017年2月21日17:34,突然收到阿里云的通知: 您的IP受到攻击流量已超过云盾DDoS基础防护的带宽峰值,服务器的所有访问已被屏蔽,如果35分钟后攻击停止将自动解除否则会延期解除... 紧接着 ...
- C++ 头文件系列(fstream)
1. 简介 该头文定义了与文件箱关联的流类的4个模版: basic_filebuf basic_ifstream basic_ofstream basic_fstream 和8个类型: filebuf ...