免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2720 | 回复: 8
打印 上一主题 下一主题

哈希求频率分布 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-10-30 16:01 |只看该作者 |倒序浏览
本帖最后由 tonyliuy 于 2015-10-30 17:03 编辑

最近想要求字符串中某个字符的大致分布,所以先画了频率分布图,但是很奇怪,有些点的频率数据跑到了别的点上,求大神指导,哈希出了什么问题?该如何修改代码?
第一段主体代码:
  1. $rate = $num/length($str);
  2. if ($rate < 1) {
  3. $devide = int($rate*100);
  4. $rates{$devide} ++;
  5. } else {
  6. $rates{99} ++}
  7. }
复制代码
数据跑出来之后都变成这样了


第二段的代码跟第一段基本差不多,生成的图像是这个样子的了:

两组数据都有几十个,全是这个样子,第一张图是连续数据,在50附近出现了小幅波动,第二张图是离散数据,就是1-99这100个数,统计出来在30和60附近出现了较大幅度的波动(之前也在50附近出现过)。求大神指导,哈希到底是怎么个情况?原数据应该是连续变化的,不应该存在这种波动,我应该如何修改代码?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2015-10-30 16:49 |只看该作者
你的图中明显 30 60 这两个地方相邻两个值一个是0,一个值变成了双倍。看你的代码用的是 int 对浮点数取整可以这么猜测,一个除法结果是 0.2999999999 无法精确表示,*100 取整后人类会理解为 30, 计算机却只能理解为 29 导致 30 这个槽直接空了都到29去了。应该用四舍五入,而不是取整

论坛徽章:
0
3 [报告]
发表于 2015-10-30 17:00 |只看该作者
谢谢解答,第一张图的连续数据出现的小幅波动很可能是这个原因造成的,比较奇怪的是第二张图,第二张图的数据是很严格的0-99这99个整数,最开始直接用数组的时候a[rate] ++数据在50附近出现了类似的异常,改用哈希就没有异常了,数据很正常,这段代码是因为第一段数据用了int直接copy过来的代码,因为觉得int一个整数还是自己没影响,就没有修改,于是第二张图就出现了这个诡异的现象。第一张图很可能是这个原因,第二张图乘以100后都是离散的整数,这个波动又是怎么产生的呢?回复 2# zhlong8


   

论坛徽章:
0
4 [报告]
发表于 2015-10-30 17:01 |只看该作者
另外四舍五入是哪条指令呢?新人没用过四舍五入回复 2# zhlong8


   

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
5 [报告]
发表于 2015-10-30 17:03 |只看该作者
回复 3# tonyliuy


    贴出生成数据集的代码,不需要做图部分

论坛徽章:
0
6 [报告]
发表于 2015-10-30 17:10 |只看该作者
  1. $str[9] =~ s/N//;
  2. $num = () = $read =~ m/c|g/ig;
  3. $rate = $num/length($read);
复制代码


脚本就是这段代码加上一楼的代码,求一段基因的CG含量,第一段是模板CG含量,长度不同,可以认为是连续的,第二段是基因的读取数据,每条都是100,这个用了一步替换之后可能少于100,但是结果差异好大,完全看不懂... ...回复 5# zhlong8



   

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
7 [报告]
发表于 2015-10-30 17:30 |只看该作者
回复 4# tonyliuy


    没有内置的四舍五入方法,一般是 +0.5 再取int,或者用模块 POSIX::round

论坛徽章:
0
8 [报告]
发表于 2015-10-30 18:04 |只看该作者
第一张图的数据作为连续性数据,本不应该出现这样的问题啊,+0.5也还是连续型的。我的意思是指前面解释的,出现0.499999999同样也可能出现0.509999999,而且这个几率不大,连续数据每个图都有那个波动也不科学啊。回复 7# zhlong8


   

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
9 [报告]
发表于 2015-10-30 18:11 |只看该作者
回复 8# tonyliuy


    努力排除计算误差(比如用精确的分数运算),做图误差(更细的区间),运用统计知识证明这个波动是远超合理范围的,然后你就可以发论文了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP