神经网络解方程
神经网络参见知乎大神的回答:http://www.zhihu.com/question/22553761#
摘抄部分内容如下:
就举一个简单的例子:区分苹果和橘子。
1.问题:人为什么能判断正确?
1.人的大脑就是一个牛逼的神经网络,通过从小的训练,见识,并且记住了苹果和橘子,我们分分钟能作出判断哪一个是苹果,哪一个是橘子(可能就是百分之百),即使我们蒙住了人的眼睛,我们还是可以通过气味,重量,手感做出较为准确的判断(但是可能不能完全判断正确).说到底就是人从小开始第一次见到苹果,橘子时,就不断的强化,记忆他们的特点,并且做出判断!有这么个大脑以后,通过直观的比方说颜色,我们就可以区分,颜色涂成一样,好,那我们依靠重量,重量等重,那我们依靠气味,气味也掩盖,那我们依靠密度。。。。。。。。。
2.计算机是死的,不是人,怎样达到人的水平或者模拟人的水平?
神经网络粉墨登场,初始的神经网络啥用都没有,智商为零。我们想让他区分苹果和橘子,对不起,你还不如去问问木头!由此我们想到人类区分的过程是不断强化,记忆(也就是训练大脑),然后就能区分(做出判断).好嘛!对一个神经网络(大脑),我们做同样的处理.先拿一堆的橘子和苹果,告诉它哪些是橘子,哪些是苹果(妈妈教你),这称之为训练.然后,再哪一个东东出来,让它判断是橘子还是苹果(做出判断),大事不好,神经网络判断错误了?别急,妈妈不会打你,不会骂你,错了就记住,再训练,强化!
3.问题还有,一大堆橘子,苹果,计算机怎么强化,记忆,计算机只认识数字,谁知道你这是什么怪物?
好,为了让计算机知道啥是橘子,啥是苹果,我们必须将橘子和苹果的特点变成数字(特征提取),送入到计算机里面去,让他记忆(训练).再把未知是什么东西的东东的特点变成数字送入计算机中让计算机做出判断(效应).颜色,我们用0~255来表示从黑到白,重量,我们用秤来秤嘛,气味,我们测算芳香因子的数量,密度,好吧,质量除以体积。。。。。。苹果我们用1表示,橘子我们用-1表示,为什么呢?前面我们说了,训练的时候,我们要告诉计算机什么是苹果,什么是橘子,用嘴和计算机说嘛?当然是数字啊,少年,没错就是国际惯例1和-1,接下来,我们将这些知道类别的数据送入计算机让他记住,再来一个不知道类别的东东,提取出上面的特点,我们就能判断出是橘子还是苹果了!
4.问题又来了,计算机怎么记住?
(非常浅显,专业人士一看就是不对的,还有很多别的条件没有提到)数据送进来,好嘛,神经网络来了,以苹果为例(用1标记),苹果的特点一串数字,我们用x表示,苹果的类别1,也就是这个网络最后要得到的效果就是x通过网络后就变成了1,数学上就是x*w = 1,好嘛解个方程就完了!(如果是多层呢?x*w1*w2*….wn=1,当然还会有更多的已知量给你哈!)解出方程得到w,后面再送入一个未知是啥的东东的特征数字,乘以w,就知道类别!橘子和苹果就区分出来!每一个步骤都有很多方法,很多内容可以挖掘,甚至很多步骤已经成为了一门专门的领域了!
百行代码教你了解何为神经网络
using System;
using System.Collections.Generic;
namespace SolvingFunction
{
public class Param
{
public int x;
public int y;
}
public class MainClass
{
static List<Param> InputList = new List<Param> ();
const int MaxParam_A = 10;
const int MaxParam_B = 10;
const int MaxParam_C = 10;
static int A,B,C;
public static void Main (string[] args)
{
AddInput ();
GetParams ();
Console.WriteLine ("a=" + A + ",b=" + B + ",c=" + C);
Console.WriteLine ("input x=1,get y=> "+(1-A*1-C)/B);
}
static void AddInput()
{
Param oneParam = new Param ();
oneParam.x = 0;
oneParam.y = -1;
InputList.Add (oneParam);
Param oneParam2 = new Param ();
oneParam2.x = -4;
oneParam2.y = 1;
InputList.Add (oneParam2);
}
static void GetParams()
{
for (int a = 1; a < MaxParam_A; ++a) {
for (int b = 1; b < MaxParam_B; ++b) {
for (int c = 0; c < MaxParam_C; ++c) {
if (ParamIsRight (a, b, c)) {
A = a;
B = b;
C = c;
return;
}
}
}
}
}
static bool ParamIsRight(int a,int b,int c)
{
for(int i=0;i<InputList.Count;++i)
{
var result = a * InputList [i].x + b * InputList [i].y + c-1;
if (result != 0)
return false;
}
return true;
}
}
}