- 論壇徽章:
- 780
|
本帖最后由 Herowinter 于 2014-06-25 12:55 編輯
回復(fù) 1# wpd0508
不知道結(jié)果對(duì)不對(duì),有錯(cuò)請(qǐng)指出,把大神提供的最小2乘法封裝了下,
用來(lái)求數(shù)組a中a[1],..a[n]對(duì)應(yīng)的系數(shù)a0,a1- #!/bin/bash
- awk -vl=5 '
- function least_square(a,n,a0,a1){
- for(x=1;x<=n;x++)
- s += a[x];
- 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)
- }
-
- {
- sum = 0
- count = 0
- k = 0
- for(i=1;i<=NF;i++){
- a[++count]=$i
- if(count==l){
- least_square(a,l,a0,a1);
- sum=0;
- count=0;
- for(j=1;j<=l;j++){
- sum += a[j]-(a1*j+a0)^2
- }
- E[++k]=sqrt(sum);
-
- }
- }
- if(count>0){
- least_square(a,count,a0,a1);
- sum=0;
- for(j=1;j<=count;j++){
- sum += a[j]-(a1*j+a0)^2
- }
- E[++k]=sqrt(sum);
- }
- sum=0;
- for(i in E)
- sum += E[i]
- print sum/k
- }
-
- ' i
復(fù)制代碼- cat i
- 1 2 4 5 6 13 141 3 11 13 44 11
- 1 2 4 5 6 7 8 9 10
復(fù)制代碼 結(jié)果 |
|