前言

最近在工作中需要拟合高斯曲线,在python中可以使用 scipy,相关代码如下:

  1. #!/usr/bin/env python
  2. # -*- coding=utf-8 -*-
  3. %matplotlib inline
  4. import numpy as np
  5. import pylab as plt
  6. from scipy.optimize import curve_fit
  7. x = range(10)
  8. y = [25,68,144,220,335,199,52,14,5,2]
  9. def gaussian2(x,*param):
  10. return param[0]*np.exp(-np.power(x - param[1], 2.) / (2 * np.power(param[2], 2.)))
  11. def use_fit_gaussian2():
  12. try:
  13. popt,pcov = curve_fit(gaussian2,x,y,p0=[1,1,1])
  14. except Exception,e:
  15. print e
  16. return
  17. print popt
  18. yhat = gaussian2(x, *popt) # or [p(z) for z in x]
  19. ybar = np.sum(y)/len(y) # or sum(y)/len(y)
  20. ssreg = np.sum((yhat-ybar)**2) # or sum([ (yihat - ybar)**2 for yihat in yhat])
  21. sstot = np.sum((y - ybar)**2) # or sum([ (yi - ybar)**2 for yi in y])
  22. error = ssreg / sstot
  23. print ssreg, sstot, error
  24. plt.plot(x,y,'b+:',label='data', linewidth =3)
  25. plt.plot(x,gaussian2(x,*popt),'ro:',label='fit', linewidth =3)
  26. plt.legend()
  27. plt.show()
  28. use_fit_gaussian2()

生成的结果如下图所示:

java ?

由于线上用的java,所以需要使用java实现,需要使用到 apache 的 commons-math3 jar包


  1. <dependency>
  2. <groupId>org.apache.commons</groupId>
  3. <artifactId>commons-math3</artifactId>
  4. <version>3.6.1</version>
  5. </dependency>
  • 代码
  1. import org.apache.commons.math3.fitting.GaussianCurveFitter;
  2. import org.apache.commons.math3.fitting.WeightedObservedPoints;
  3. /**
  4. * Created by xingxing.dxx on 2016/11/14.
  5. */
  6. public class CurveFittingTest {
  7. public static void main(String[] args) {
  8. WeightedObservedPoints obs = new WeightedObservedPoints();
  9. obs.add(0, 25);
  10. obs.add(1, 68);
  11. obs.add(2, 144);
  12. obs.add(3, 220);
  13. obs.add(4, 335);
  14. obs.add(5, 199);
  15. obs.add(6, 52);
  16. obs.add(7, 14);
  17. obs.add(8, 5);
  18. obs.add(9, 2);
  19. double[] parameters = GaussianCurveFitter.create().fit(obs.toList());
  20. for (double i : parameters) {
  21. System.out.println(i);
  22. }
  23. }
  24. }

最开始测试的时候非常完美,可是马上就悲剧了,在我运行如下case的时候,抛了一个错


  1. [0, 0, 0, 0, 4, 1, 0, 2, 0]
  2. Exception in thread "main" org.apache.commons.math3.exception.ConvergenceException: illegal state: unable to perform Q.R decomposition on the 9x3 jacobian matrix

瞬间懵逼了,有没有。然后开始找错误是哪报的,发现了报错的代码,

  1. if (Double.isInfinite(norm2) || Double.isNaN(norm2)) {
  2. throw new ConvergenceException(LocalizedFormats.UNABLE_TO_PERFORM_QR_DECOMPOSITION_ON_JACOBIAN,
  3. nR, nC);
  4. }

看着代码貌似是矩阵求逆的时候,矩阵中有1.0/0.0的情况,猜测是不是输入的数据都大于0就ok了,果然,下面的测试样本就ok了

[0.01, 0.01, 0.01, 0.01, 4.01, 1.01, 0.01, 2.01, 0.01]

如何在java中拟合正态分布的更多相关文章

  1. 如何在JAVA中实现一个固定最大size的hashMap

    如何在JAVA中实现一个固定最大size的hashMap 利用LinkedHashMap的removeEldestEntry方法,重载此方法使得这个map可以增长到最大size,之后每插入一条新的记录 ...

  2. 如何在java中使用sikuli进行自动化测试

    很早之前写过一篇介绍sikuli的文章.本文简单介绍如何在java中使用sikuli进自动化测试. 图形脚本语言sikuli sikuli IDE可以完成常见的单击.右击.移动到.拖动等鼠标操作,ja ...

  3. 如何在Java中调用Python代码

    有时候,我们会碰到这样的问题:与A同学合作写代码,A同学只会写Python,而不会Java, 而你只会写Java并不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方设法“调 ...

  4. 如何在java中跳出当前多重嵌套循环?有几种方法?

    如何在java中跳出当前多重嵌套循环?有几种方法? - 两种方法   - 1.在外层循环定义标记          ok:          for(int i=0;i<100;i++){    ...

  5. 用代码说话:如何在Java中实现线程

    并发编程是Java语言的重要特性之一,"如何在Java中实现线程"是学习并发编程的入门知识,也是Java工程师面试必备的基础知识.本文从线程说起,然后用代码说明如何在Java中实现 ...

  6. 如何在Java中测试类是否是线程安全的

    通过优锐课的java核心笔记中,我们可以看到关于如何在java中测试类是否线程安全的一些知识点汇总,分享给大家学习参考. 线程安全性测试与典型的单线程测试不同.为了测试一个方法是否是线程安全的,我们需 ...

  7. 如何在 Java 中实现无向环和有向环的检测

    无向环 一个含有环的无向图如下所示,其中有两个环,分别是 0-2-1-0 和 2-3-4-2: 要检测无向图中的环,可以使用深度优先搜索.假设从顶点 0 出发,再走到相邻的顶点 2,接着走到顶点 2 ...

  8. 如何在 Java 中实现最小生成树算法

    定义 在一幅无向图 \(G=(V,E)\) 中,\((u, v)\) 为连接顶点 \(u\) 和顶点 \(v\) 的边,\(w(u,v)\) 为边的权重,若存在边的子集 \(T\subseteq E\ ...

  9. 如何在 Java 中实现 Dijkstra 最短路算法

    定义 最短路问题的定义为:设 \(G=(V,E)\) 为连通图,图中各边 \((v_i,v_j)\) 有权 \(l_{ij}\) (\(l_{ij}=\infty\) 表示 \(v_i,v_j\) 间 ...

随机推荐

  1. Redis 64 steps

    a memo for redis 64 operations start server in console: 1. D:\>cd redis64 2. D:\redis64>redis- ...

  2. javascript序列化和反序列化

    一. JavaScript中的对象序列化(Serialize)和反序列化(Deserialize),简单实例: var obj = {id: 1, name: 'yoyo', age: undefin ...

  3. makefile函数

    http://www.cnblogs.com/tianyajuanke/archive/2013/02/16/2610276.html 通用步骤: 编译时,可以不知钉头文件,如果指定头文件,其作用是当 ...

  4. Python 字符串格式化

    Python 字符串格式化 Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存 一 ...

  5. SVN的感叹号

    黄色感叹号(有冲突):--这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你的提交覆盖了别人 ...

  6. Redis 连接问题

    .NET 中使用 StackExchange.Redis 我为什么想写这个,总感觉很多介绍相应技术的博客,只是把内容从官网搬到自己的博客中,没有任何的实践,这样会给想学的人,没有任何好处,也可能我是自 ...

  7. es6 let

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. emacs配置eslint 语法检查.找不到node解决

    使用emacs配置eslint 当调用语法检查时报错 Suspicious state from syntax checker javascript-eslint: Checker javascrip ...

  9. virtualBox 打开旧的ubuntu虚拟机镜像时找不到网卡的解决方法

    一 环境: ubuntu v8.04 virtualbox _v4.3 二 操作 1 按正常创建新的虚拟机, 然后在选择虚拟硬盘界面选择使用旧的ubuntu虚拟机 2 打开虚拟机 删除/etc/ude ...

  10. 关于CSS学习的第一章

    1.CSS三种书写的方式:嵌入式.外链式.行内式 嵌入式就是将CSS写入在<style></style> 外链式将外面的CSS文件通过HTML中的标记链接过来:<link ...