免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wpd0508
打印 上一主题 下一主题

[文本处理] 怎么对文本中的数字进行分组然后运算 [复制链接]

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
11 [报告]
发表于 2014-06-25 10:19 |只看该作者
翻了楼主的另一个帖子,找到计算E的这些参数的意义了。
  1. 如果我想要继续对得到的数据进行处理,比如说对以上得到的数组 [ Yi ]  以L个为单元进行分组, 即第一组为 [  Y1 Y2 Y3 ... YL].    对这L个数字进行最小二乘法拟合,得 Y=a1 x + a0, (这里的x为数组对应的下标数,即1~ L).
  2. 计算偏差量  E = sqrt( sum (Yi - (a1*xi +a0) )^2)这就很麻烦了是不是?能帮忙解决一下吗?
复制代码

论坛徽章:
36
摩羯座
日期:2013-09-23 16:37:312015年亚洲杯之沙特阿拉伯
日期:2015-04-14 09:10:172015亚冠之柏太阳神
日期:2015-06-25 08:48:212015亚冠之武里南联
日期:2015-07-28 09:01:082015亚冠之莱赫维亚
日期:2015-07-28 15:44:172015亚冠之柏斯波利斯
日期:2015-09-06 14:08:52白银圣斗士
日期:2015-11-25 17:06:2815-16赛季CBA联赛之吉林
日期:2015-12-09 16:59:072016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之辽宁
日期:2016-04-14 09:29:04luobin
日期:2016-06-17 17:46:3615-16赛季CBA联赛之天津
日期:2016-08-16 14:11:01
12 [报告]
发表于 2014-06-25 10:24 |只看该作者
回复 10# Herowinter
你瘦的不够彻底啊,你看我,完美身材

   

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
13 [报告]
发表于 2014-06-25 12:02 |只看该作者
本帖最后由 Herowinter 于 2014-06-25 12:55 编辑

回复 1# wpd0508
不知道结果对不对,有错请指出,把大神提供的最小2乘法封装了下,
用来求数组a中a[1],..a[n]对应的系数a0,a1
  1. #!/bin/bash

  2. awk -vl=5 '
  3.     function least_square(a,n,a0,a1){
  4.         for(x=1;x<=n;x++)
  5.             s += a[x];
  6.         avg = s/n;
  7.         for(x=1; x<=n; x++)
  8.         {
  9.                 y = a[x] - avg
  10.                 sx += x
  11.                 sy += y
  12.                 sxy += x * y
  13.                 sx2 += x * x
  14.         }
  15.         a0 = (sx2 * sy - sx * sxy) / (n * sx2 - sx * sx)
  16.         a1 = (n * sxy - sx * sy) / (n * sx2 - sx * sx)
  17.     }
  18.       
  19.     {
  20.       sum = 0
  21.       count = 0
  22.       k = 0
  23.       for(i=1;i<=NF;i++){
  24.          a[++count]=$i
  25.          if(count==l){
  26.              least_square(a,l,a0,a1);
  27.              sum=0;
  28.              count=0;
  29.              for(j=1;j<=l;j++){
  30.                  sum += a[j]-(a1*j+a0)^2
  31.              }
  32.              E[++k]=sqrt(sum);
  33.             
  34.          }
  35.       }
  36.       if(count>0){
  37.           least_square(a,count,a0,a1);
  38.           sum=0;
  39.           for(j=1;j<=count;j++){
  40.                  sum += a[j]-(a1*j+a0)^2
  41.              }
  42.           E[++k]=sqrt(sum);
  43.       }
  44.       sum=0;
  45.       for(i in E)
  46.           sum += E[i]
  47.       print sum/k
  48.     }
  49.    
  50.    ' i
复制代码
  1. cat i
  2. 1 2 4 5 6 13 141 3 11 13 44 11
  3. 1 2 4 5 6 7 8 9 10
复制代码
结果
  1. ./test.sh
  2. 8.37082
  3. 8.7449
复制代码

论坛徽章:
0
14 [报告]
发表于 2014-06-25 12:42 |只看该作者
大大,非常感谢你教我了在LINUX里如何封装函数,sum += a[j]-(a1*j+a0) 这里少了一个平方,还有就是为什么得到的是a1,a0,而不是E的平均数吗?回复 13# Herowinter


   

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
15 [报告]
发表于 2014-06-25 12:57 |只看该作者
本帖最后由 Herowinter 于 2014-06-25 13:06 编辑

回复 14# wpd0508
13楼的代码我改了,加了平方,但是计算结果没影响。。。
不知到哪里有问题。按照你的需求,要先算出a0,a1才能代入
公式计算E的吧,我这里最后打印的就是每行的所有E的平均值。

有个数学知识请教下,我输入Y=[1,2,3,4,5],最小2乘法算出来的
不是a1=1,a0=0,Y=x吗?
   

论坛徽章:
0
16 [报告]
发表于 2014-06-25 13:03 |只看该作者
如果a1=1,a0=1 ,Y=1+x大大还有就是awk 'BEGIN{getline t < "b"}{for(i=0;i++<NFprintf ( "%d\n",i,X=X[i-1]+$i-t)>c}' a  这个代码能产生的数是以一行1个数的形式放入文件c中的,如何改为以空格为分隔符放入文件c中呢
回复 15# Herowinter


   

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
17 [报告]
发表于 2014-06-25 13:09 |只看该作者
回复 16# wpd0508
上面我写错是a1=1,a0=0,你的原始文本不是1行
10几个数吗?怎么又变成1行1个了。。。,你重新
描述需求吧,输入数据格式,期望结果。
   

论坛徽章:
0
18 [报告]
发表于 2014-06-25 13:59 |只看该作者
对的,我是想让你帮我看看另外一个问题,
cat test2
1 3 3 5 4 2
test3
3
awk 'BEGIN{getline t < "test3"}{for(i=0;i++<NFprintf ("X%d=%d\n",i,X=X[i-1]+$i-t)> "test4"}' test2
X1=-2
X2=-2
X3=-2
X4=0
X5=1
X6=0
如何将-2 -2 -2 0 1 0 这几个数以这种形式放入test4 ,前面提到的问题就是从这一步开始的。回复 17# Herowinter


   

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
19 [报告]
发表于 2014-06-25 14:11 |只看该作者
本帖最后由 Herowinter 于 2014-06-25 14:14 编辑

回复 18# wpd0508
你从test2 => test4 仅仅是为了把
1 2 3 4 5变为

1
2
3
4
5  ???
我是有点被你搞糊涂了,我13楼的代码不需要这种转换,
你直接把里面的文件名改为test2应该可以的。

还有,想要得到正确的结果,必须要保证你提供的最小2乘法
算法能计算出正确的a0,a1,为什么我输入5个点(1,1)  (2,2)
(3,3)  (4,4)  (5,5),计算的结果不是a0=0,a1=1,  y=x呢?


   

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
20 [报告]
发表于 2014-06-25 14:12 |只看该作者
回复 15# Herowinter


把 y = a[x] - avg 改为
y = a[x]
就是你想要的结果了。

楼主原来的需求里是把样本数据减去均值后的数据作为样本的,所以我的代码里减去了均值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP