jerryxjr1220 发表于 2017-1-24 09:59:35

python小练习(063):python实现多层神经网络的机器学习(二)

本帖最后由 jerryxjr1220 于 2017-1-24 10:10 编辑

上一次的小练习简单分享了20行代码实现的多层神经网络的机器学习。

今天来讲一个具体的复杂例子,说明一下多层神经网络的机器学习的强大功能--拟合高幂次函数。

题目:
输入:[-0.9, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
输出:
已知这是一个高幂次函数在【-0.9,1】区间段中的一组数据,求解拟合度最好的高幂次函数 (多少次幂未知)

如果没有高效的求解算法,要拟合幂次未知的高幂次方程难度是相当大的,哪怕在matlab中的标准回归模块中最高也仅支持3次幂。

下面,我们就用python高效的求解本题:
方法还是和上次小练习中的方法一样,区别是为了加快自修正的速度,我把每次修正的权重全部设为1,也就是每次都会用上一次的误差修正下一次地参数。
首先假设最高次幂为5次(设再高也是可行的,初次设定好最高次幂后,可以根据后续的确信度进行调整,若确信度低就再调高幂次)。
那么函数方程为:Y=o*X**5+p*X**4+q*X**3+r*X**2+s*X+t

还是先看最后的结果:
列出了前10次机器学习自调整的确信度以及总共1000次机器学习的确信度:(确信度利用标准差计算得到)
调整次数:1确信度: -146.581969958%
调整次数:2确信度: -57.1543895104%
调整次数:3确信度: 41.9843490833%
调整次数:4确信度: 54.3347839432%
调整次数:5确信度: 69.4401666869%
调整次数:6确信度: 76.2338848743%
调整次数:7确信度: 81.8372422013%
调整次数:8确信度: 86.5870224139%
调整次数:9确信度: 89.8755646957%
调整次数:10确信度: 92.2000428784%
调整次数:50确信度: 99.442099187%
调整次数:100确信度: 99.8405251983%
调整次数:150确信度: 99.9536136407%
调整次数:200确信度: 99.9864861301%
调整次数:250确信度: 99.9960623667%
调整次数:300确信度: 99.9988526468%
调整次数:350确信度: 99.9996656821%
调整次数:400确信度: 99.9999025858%
调整次数:450确信度: 99.9999716153%
调整次数:500确信度: 99.9999917292%
调整次数:550确信度: 99.99999759%
调整次数:600确信度: 99.9999992978%
调整次数:650确信度: 99.9999997954%
调整次数:700确信度: 99.9999999404%
调整次数:750确信度: 99.9999999826%
调整次数:800确信度: 99.9999999949%
调整次数:850确信度: 99.9999999985%
调整次数:900确信度: 99.9999999996%
调整次数:950确信度: 99.9999999999%
调整次数:1000确信度: 100.0%
拟合函数的参数:o=0.000000,p=1.000000,q=-2.000000,r=3.000000,s=-4.000000,t=5.000000

可以发现机器自学习的调整效率非常高,经过前10次调整确信度已经达到90%以上,经过前1000次调整,确信度接近100%(实际不可能达到100%,因为微小的误差始终存在,只是小数位数太长我舍去了)。

最终函数方程为:Y=X**4-2*X**3+3*X**2-4*X+5

整个自学习过程非常快速,毫秒级别即可完成。

对于再高幂次的方程可以增加自调整次数,我们普通计算机对于100万次以下的自学习都是没有问题的。

源代码如下:
**** Hidden Message *****

llovefc 发表于 2017-1-24 22:48:31

过来学习了

jerryxjr1220 发表于 2017-1-25 10:55:49

高幂次方程拟合的拓展:
如果输入和输出的点不是完全匹配某方程,机器学习同样可以求得最优解。
例如:
X = [-0.9, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
Y =

利用本方法求得最优拟合解:
调整次数:1确信度: -146.221289158%
调整次数:2确信度: -56.8160904544%
调整次数:3确信度: 42.3174417077%
调整次数:4确信度: 54.6224621998%
调整次数:5确信度: 69.652532493%
调整次数:6确信度: 76.3509236768%
调整次数:7确信度: 81.8782557272%
调整次数:8确信度: 86.5455048773%
调整次数:9确信度: 89.7303098374%
调整次数:10确信度: 91.9310123431%
调整次数:1000确信度: 97.8379486988%
调整次数:2000确信度: 97.8379486989%
调整次数:3000确信度: 97.8379486989%
拟合函数的参数:o=-0.114533,p=1.102072,q=-1.901031,r=2.910141,s=-3.998615,t=5.001966
当自调整1000次以上时,确信度几乎保持不变了,也就意味着,本拟合方程最高可达到的确信度为: 97.8379486989%

jerryxjr1220 发表于 2017-1-25 11:05:42

如果用上述方程预测X=1.1时的值,并计算误差:
pred = o*1.1**5+p*1.1**4+q*1.1**3+r*1.1**2+s*1.1+t
std = 1.1**4-2*1.1**3+3*1.1**2-4*1.1+5
print ('预测值:%f,标准值:%f,偏差:%f'%(pred,std,abs(pred-std)/std*100)+'%')
输出:
预测值:3.023575,标准值:3.032100,偏差:0.281163%
可见预测值的偏差也是非常小的。

suxinmi 发表于 2017-2-4 15:41:10

不好意思啊,楼主,我手在触摸板上哆嗦了一下,结果理由给写错了。本来想写感谢楼主的,结果写成这玩意了,实在是不好意思啊{:10_263:}

suxinmi 发表于 2017-2-4 15:42:28

评分理由给写错了,实在是太尴尬了

龙骑战龙 发表于 2017-2-5 12:50:19

感恩楼主!!!!

xuxianju 发表于 2017-2-5 16:29:42

{:10_243:}

20岁普通市民 发表于 2017-4-13 21:35:59

新人围观

24岁普通市民 发表于 2017-4-15 22:43:41

6

大补的小甲鱼粉 发表于 2017-4-17 15:25:53

学习一下

大补的小甲鱼粉 发表于 2017-4-18 19:21:09

请问下楼主,为什么这个方法不能用于计算您上一个例子 Y=RX+b这种函数

jerryxjr1220 发表于 2017-4-18 21:08:43

大补的小甲鱼粉 发表于 2017-4-18 19:21
请问下楼主,为什么这个方法不能用于计算您上一个例子 Y=RX+b这种函数

可以计算上一个例子的,只不过对于一次线性方程用高幂次方程去拟合未必合适,反而会增加调整的次数,而且误差也会增大(因为需要考虑的变量多了)

大补的小甲鱼粉 发表于 2017-4-18 21:46:11

jerryxjr1220 发表于 2017-4-18 21:08
可以计算上一个例子的,只不过对于一次线性方程用高幂次方程去拟合未必合适,反而会增加调整的次数,而且 ...

x=list(range(1,11))
y=list(range(10,110,10))
a=0
b=0
e=*2
for i in range(1000):
    for i in range(10):
      e=y-a*x-b
      a=a+e
      e=y-a*x-b
      b=b+e
print 'a=',a
print 'b=',b
这样子算下来,a,b的值都很大,是不是哪里弄错了?

jerryxjr1220 发表于 2017-4-18 22:05:34

大补的小甲鱼粉 发表于 2017-4-18 21:46
x=list(range(1,11))
y=list(range(10,110,10))
a=0


你可能还没有理解机器学习的方法,首先反复迭代是为了能通过误差计算出调整步长,并且这个误差应该是成线性收敛的,如果不满足上述的条件,就会出现调整值越来越大,误差也会越来越大。

大补的小甲鱼粉 发表于 2017-4-18 22:18:29

jerryxjr1220 发表于 2017-4-18 22:05
你可能还没有理解机器学习的方法,首先反复迭代是为了能通过误差计算出调整步长,并且这个误差应该是成线 ...

我是新手。不是很懂,有没有什么书籍或者资料可以参考一下呢?

jerryxjr1220 发表于 2017-4-18 22:23:28

大补的小甲鱼粉 发表于 2017-4-18 22:18
我是新手。不是很懂,有没有什么书籍或者资料可以参考一下呢?

如果你是指的数学基础的话,那么线性代数和概率论是必须的,因为他们是机器学习的基础,很多激励函数和优化器,分类器都会用到。
电脑基础的话,你可以去看看tensorflow和keras的官方网站,都有比较详细的新手教程。
再进一步学习的话,可以去看看google的tensorflow论坛,当然是全英文的,上面有很多各个领域的专业论文以及项目实例,然后自己动手实践。

大补的小甲鱼粉 发表于 2017-4-18 22:40:03

jerryxjr1220 发表于 2017-4-18 22:23
如果你是指的数学基础的话,那么线性代数和概率论是必须的,因为他们是机器学习的基础,很多激励函数和优 ...

非常感谢,线性代数,概率论都在看,刚好考研也要看的。谢谢了

cngrand 发表于 2017-4-24 07:12:16

谢谢

Kua.Max 发表于 2017-4-24 10:15:14

{:10_277:}
页: [1] 2 3 4 5
查看完整版本: python小练习(063):python实现多层神经网络的机器学习(二)