前言

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

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

生成的结果如下图所示:

java ?

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


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

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


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

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

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

看着代码貌似是矩阵求逆的时候,矩阵中有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. Linux uniq常用命令

    -u 只显示不重复行.-d 只显示有重复数据行,每种重复行只显示其中一行-c 打印每一重复行出现次数.-f n为数字,前n个域被忽略.一些系统不识别- f选项,这时替代使用- n.

  2. ThoughtWorks.QRCode源码

    http://files.cnblogs.com/files/xiaoyu369/ThoughtWorks.QRCode.rar

  3. Spring中javaMail通过SMTP发送邮件

    public final class Emails { /** The java mail sender. */ private static JavaMailSender javaMailSende ...

  4. MSSTDFMT.DLL无法注册的解决

    今天在使用Windows8的时候,发现了一个问题,当我想执行某个xxx.exe文件的时候,报的问题是MSSTDFMT.DLL无法注册. 但是我的系统又是64位的,那么可以这样操作: 从网上下载一个ms ...

  5. Json序列化,date类型转换后前端显示错误的解决方案

    1.前台使用Jquery解决 (1)如果我们前台使用Jquery来解决这个问题的话,那么我们首先想到的是我们如何解析这个过程呢,当然我们就想到了自己写一个JavaScript脚本来解析这个过程,当然这 ...

  6. Silverlight 缓存控制策略

    通常我们用html或asp.net页面承载Silverlight包,由于浏览器缓存机制的存在,使得你的应用更新时,客户见到往往是旧版的程序,而完全禁止缓存,每次打开页面都要重新下载xap,对于体积较大 ...

  7. .NET MEF入门级例子

    学习新东西,喜欢从简单的例子入手,感觉理解和上手会快点,本文记录下我做的一个简单的mef的例子,至于理论的话百度,谷歌多的去了. Mef可以在你调整了某些功能的时候不需要重新去做代码,只需要换掉相应的 ...

  8. openlayers中实现自定冒泡的效果

    自定义的Openlayers.Popup.FreshCloud继承自Openlayers.Popup.Framed,实现了比较简洁的冒泡效果,详细代码如下 /** * Class: OpenLayer ...

  9. Android学习起步 - AutoCompleteTextView及MultiAutoCompleteTextView控件使用

    大家在用百度搜索时,输入几个词就出现下拉框可选,以下两个控件就具有这个功能 AutoCompleteTextView:只能匹配输入的开始,只有一次匹配 MultiAutoCompleteTextVie ...

  10. OPNET下 op_pk_copy()的时间问题

    op_pk_copy()是生成新的数据包,包的op_pk_create_time_get()是新数据包的生成时间,统计数据包的端到端时延,以及服务时延需要注意: