为什么我们总是想看到黄金分割率? 使用C ++神经网络尝试(失败)进化分析

最近,我问自己:我们是希望看到到处都是与某些纯文化事物有关的黄金分割,还是我们的大脑结构中隐藏着某种更深层的模式? 为了弄清楚这一点,我决定做一些事情:

  1. 制定有关此模式的特定假设。 我认为这一假设最适合我们的大脑使用基于将数字分解为黄金比例度的数字系统,因为它的某些特征与原始神经网络的工作非常相似:事实是高阶黄金部分的度可以无限扩展低阶度甚至负度之和中的路数。 因此,较高的程度从较低的较低程度被“激发”,从而表现出与神经网络相同的相似性。
  2. 描述一种具体的测试方法:我选择了垫子。 通过最简单的可能的神经网络-线性算子的矩阵中的随机变化模拟大脑进化。
  3. 创建用于确认假设的条件。 我的标准是,基于黄金分割率的数字系统是在神经网络引擎上实现的,该引擎具有相同的信息量,并且错误率比二进制数少。

由于我们正在谈论编程,因此我将更详细地描述第二点和第三点。

为了模拟大脑在进化过程中的随机变化,我使用了rand_s()函数,因为它在密码上是稳定的,因此将给出“更多随机性”的结果。 当了解到当矩阵在随机方向上偏离较小值时,其乘积与矢量的乘积几乎以相同的模数变化时,我还以此为标准,即神经网络获得的错误次数最少。

至于向量本身中的数据编码,我使用了一个28维向量用于两个14位二进制数及其和(在前14个字符之后,仅填充14个零)和一个40维向量用于系统中的两个数黄金比例。

输入文件具有以下格式。

第一行是两个整数,中间用空格,向量的大小和训练集中的元素数隔开。

所有后续行:第一行是神经网络的输入,第二行是正确的处理结果。

这是神经网络代码的片段,负责在输入数据和与之对应的正确结果的样本上对其进行训练:

while (((d-mu)*(d-mu)>0.01)||(q<10)) // ,        ""    { s=0; //           for (k=0;k<m;k++) { for (i=0;i<n;i++) { (*(z+k*n+i))=0; } for (i=0;i<n;i++) { for (j=0;j<n;j++) { (*(z+k*n+i))=(*(z+k*n+i))+(*(a+i*n+j))*(*(x+k*n+j)); } } //        for (i=0;i<n;i++) { s=s+((*(z+k*n+i))-(*(y+k*n+i)))*((*(z+k*n+i))-(*(y+k*n+i))); } //         s1=s+1; } while (s<s1) //      ,      ,    { s1=0; //      for (k=0;k<m;k++) { for (i=0;i<n;i++) { (*(z+k*n+i))=0; } }//  ()      rand_s(&p); k1 = (int) (p/((int) (UINT_MAX/n))); rand_s(&p); k2 = (int) (p/((int) (UINT_MAX/n))); //   ""  ,     rand_s(&p); h=((double) p/UINT_MAX)-0.5; //  h1=1; rand_s(&p); l=((int) ((double) p/UINT_MAX)*20); for (i=0;i<l;i++) { h1=h1/10; } h=h*h1; //,        for (k=0;k<m;k++) { for (i=0;i<n;i++) { for (j=0;j<n;j++) { if ((i==k1)&&(j==k2)) (*(z+k*n+i))=(*(z+k*n+i))+(*(a+i*n+j))*(*(x+k*n+j))+h*(*(x+k*n+j)); else (*(z+k*n+i))=(*(z+k*n+i))+(*(a+i*n+j))*(*(x+k*n+j)); } } //       for (i=0;i<n;i++) { s1=s1+((*(z+k*n+i))-(*(y+k*n+i)))*((*(z+k*n+i))-(*(y+k*n+i))); }//           } } (*(a+k1*n+k2))=(*(a+k1*n+k2))+h; //           s1=0; d=0; for (k1=0;k1<n;k1++) { for (k2=0;k2<n;k2++) { for (k=0;k<m;k++) { for (i=0;i<n;i++) { (*(z+k*n+i))=0; } } for (k=0;k<m;k++) { for (i=0;i<n;i++) { for (j=0;j<n;j++) { if ((i==k1)&&(j==k2)) (*(z+k*n+i))=(*(z+k*n+i))+((*(a+i*n+j))+0.1)*(*(x+k*n+j)); else (*(z+k*n+i))=(*(z+k*n+i))+(*(a+i*n+j))*(*(x+k*n+j)); } } } s1=0; for (k=0;k<m;k++) { for (i=0;i<n;i++) { s1=s1+((*(z+k*n+i))-(*(y+k*n+i)))*((*(z+k*n+i))-(*(y+k*n+i))); } } d=d+(s1-s)*(s1-s)/(n*m);//          } } mu=mu*((double) q/(q+1))+((double) d/(q+1));//         q=q+1; printf("%lf \n",mu);//         } 

我还随机生成输入数据,这些是从零到一的实数。 另外,除了训练样本外,我还生成了一个测试样本,在该样本上测试了我的神经网络。 另外,对于由神经网络获得的每个结果,我计算了均方根误差,即,由神经网络获得的向量与包含正确结果的向量之间的差的均方根。
结果,在二进制和基于金的数字系统中加了神经网络之后,我得到了1000个平均误差。 我选择了向量的维数,以便它们在数字系统内部以及它们之间存储大约相同数量的信息。

我用配对的t检验比较了不同数字系统中的错误,这就是我得到的。

比较:黄金分割率-二元制
假设:黄金分割率的误差平均较小。
结果:
t = -22.033
df = 999
p <0.001
科恩(Cohen)d = -0.697(黄金比例下,误差较小)
Cohen d的99%置信区间:
从-inf到-0.615
Shapiro-Wilk分布正态检验:
W = 0.998 p = 0.382(分布近似对应于法线)
描述性统计:
黄金比例:
算术平均值:0.365
标准偏差:0.044
二进制系统:
算术平均值:0.414
标准偏差:0.055

我决定暂时保留此小型手工艺品研究中使用的所有数据,以作为我没有从上限中得出数字的证据。 不管问谁,我都可以发送。

现在得出结论。 由于神经网络的训练是基于神经元之间连接的随机变化和选择最佳神经元(如在进化过程中),因此在这种情况下,它们显示出的黄金分割率明显优于以相同数目的数字系统为基础的黄金分割率可以假定,动物,尤其是人的大脑的进化是沿着类似的路径进行的。

UPD 从发表之时起,作者就进行了一项新的研究,他在其中使用线性回归将测量数的校正和数制基数的影响与距黄金比例的距离分开考虑。 结果令人失望:底座与黄金比例的接近程度增加了误差而不是减少了误差,因此,感觉一如既往地下降了。

Source: https://habr.com/ru/post/zh-CN478998/


All Articles