Chinaunix

标题: 求一组数的偏差和累加 [打印本页]

作者: wpd0508    时间: 2014-06-24 09:20
标题: 求一组数的偏差和累加
已知文本1中有1 3 3 5 4 2 这组数 文本2存放着他们的平均数3 然后通过SHELL脚本如何实现求出各数的偏差和累加。X1=$1-3 ,X2=X1+$2-3......
作者: yestreenstars    时间: 2014-06-24 09:50
酱紫?
  1. awk 'BEGIN{getline t < "b"}{for(i=0;i++<NF;)printf "X%d=%d\n",i,X[i]=X[i-1]+$i-t}' a
  2. X1=-2
  3. X2=-2
  4. X3=-2
  5. X4=0
  6. X5=1
  7. X6=0
复制代码

作者: wpd0508    时间: 2014-06-24 09:58
大大厉害,谢了,顺便问一下其中的a,b 是指的文件名吗?
回复 2# yestreenstars


   
作者: wpd0508    时间: 2014-06-24 10:02
如果我想要继续对得到的数据进行处理,比如说对以上得到的数组 [ Yi ]  以L个为单元进行分组, 即第一组为 [  Y1 Y2 Y3 ... YL].    对这L个数字进行最小二乘法拟合,得 Y=a1 x + a0, (这里的x为数组对应的下标数,即1~ L).
计算偏差量  E = sqrt( sum (Yi - (a1*xi +a0) )^2)这就很麻烦了是不是?能帮忙解决一下吗?
回复 2# yestreenstars


   
作者: yestreenstars    时间: 2014-06-24 10:03
回复 3# wpd0508
是的~{:2_172:}

   
作者: yestreenstars    时间: 2014-06-24 10:12
回复 4# wpd0508
没看懂~{:2_169:}

   
作者: q1208c    时间: 2014-06-24 10:16
这么复杂的计算, shell可能处理不了.

就算是能处理, 你以后维护的成本也会非常高.

建议使用 perl 或 python 吧.
作者: yestreenstars    时间: 2014-06-24 10:19
回复 7# q1208c
你是来抬杠的~{:2_172:}

   
作者: wpd0508    时间: 2014-06-24 10:26
但是我已经得到了YI这一组数,a1和a0是随便选的2个数,只需要进行最后一步的运算E = sqrt( sum (Yi - (a1*xi +a0) )^2)比如说E = sqrt( sum (Yi - (1*xi +2) )^2) 这也不能实现吗,真的很需要解决这个问题,求大大们点拨一下。


作者: wpd0508    时间: 2014-06-24 10:29
a0 = (∑Yi) / n - a1(∑Xi) / n (式1-
a1 = [n∑Xi Yi - (∑Xi ∑Yi)] / [n∑Xi2 - (∑Xi)2 )]   我错了,a0 和a1居然是2个值,我去他妹的。
作者: q1208c    时间: 2014-06-24 11:15
回复 8# yestreenstars

连最小二乘法都上来了, 你觉得shell能做这么复杂的计算么?!

我确实是来抬杠的, 因为我觉得shell的专长并不在此.

杀鸡虽然不需要用牛刀, 但杀牛, 用鸡刀可是个体力活.
   
作者: Herowinter    时间: 2014-06-24 11:28
@wpd0508
先是平均数,然后是方差,
接下来是最小2乘法和曲线拟合,
恭喜星辰大大入坑。
作者: Herowinter    时间: 2014-06-24 11:29
@yestreenstars@q1208c
先是平均数,然后是方差,
接下来是最小2乘法和曲线拟合,
恭喜星辰大大入坑。
作者: yestreenstars    时间: 2014-06-24 11:30
回复 12# Herowinter
咱数学没学得那么深入~{:2_169:}

   
作者: 用户名注册后不能更改    时间: 2014-06-24 12:17
本帖最后由 用户名注册后不能更改 于 2014-06-24 12:18 编辑

回复 12# Herowinter

我知道最小是minimum,二是silly,乘法是multiplication,但最小二乘法是虾米意思?
作者: ly5066113    时间: 2014-06-24 12:53
貌似是这个意思:
  1. $ cat file
  2. 1
  3. 3
  4. 3
  5. 5
  6. 4
  7. 2
  8. $ awk '{
  9.         a[NR] = $1
  10.         s += $1
  11. }
  12. END{
  13.         n = NR
  14.         avg = s / n
  15.         for(x=1; x<=n; x++)
  16.         {
  17.                 y = a[x] - avg
  18.                 sx += x
  19.                 sy += y
  20.                 sxy += x * y
  21.                 sx2 += x * x
  22.         }
  23.         a0 = (sx2 * sy - sx * sxy) / (n * sx2 - sx * sx)
  24.         a1 = (n * sxy - sx * sy) / (n * sx2 - sx * sx)
  25.         printf "y = %s + %sx\n" ,a0 ,a1
  26. }' file

  27. y = -1 + 0.285714x
复制代码

作者: wpd0508    时间: 2014-06-24 14:20
看着很靠谱,能顺便加上最后一步 E = sqrt( sum (Yi - (a1*xi +a0) )^2)的步骤吗回复 16# ly5066113


   
作者: wpd0508    时间: 2014-06-24 14:45
我刚试了一下大大的代码,为什么输出的是y=-nan+-nanx回复 16# ly5066113



   
作者: damcool    时间: 2014-06-24 15:59
这一点点都不会改,那就没人能帮你了!
wpd0508 发表于 2014-06-24 14:45
我刚试了一下大大的代码,为什么输出的是y=-nan+-nanx回复 16# ly5066113

作者: wpd0508    时间: 2014-06-24 16:18
提示一下呗,
回复 19# damcool


   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2