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
酱紫?
awk 'BEGIN{getline t < "b"}{for(i=0;i++<NF;)printf "X%d=%d\n",i,X[i]=X[i-1]+$i-t}' a
X1=-2
X2=-2
X3=-2
X4=0
X5=1
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
貌似是这个意思:
$ cat file
1
3
3
5
4
2
$ awk '{
a[NR] = $1
s += $1
}
END{
n = NR
avg = s / n
for(x=1; x<=n; x++)
{
y = a[x] - avg
sx += x
sy += y
sxy += x * y
sx2 += x * x
}
a0 = (sx2 * sy - sx * sxy) / (n * sx2 - sx * sx)
a1 = (n * sxy - sx * sy) / (n * sx2 - sx * sx)
printf "y = %s + %sx\n" ,a0 ,a1
}' file
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