6、基于highcharts实现的线性拟合,计算部分在java中实现,画的是正态概率图

1、坐标点类

package cn.test.domain;

public class Point {
    double x;
    double y;
    
    public Point(){
        
    }
    
    public Point(double x, double y) {
        super();
        this.x = x;
        this.y = y;
    }

    public double getX() {
        return x;
    }

    public void setX(double x) {
        this.x = x;
    }

    public double getY() {
        return y;
    }

    public void setY(double y) {
        this.y = y;
    }
}

2、拟合类,带计算部分

package cn.test.normcdf;

import java.io.IOException;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.commons.math3.distribution.NormalDistribution;

import cn.test.domain.Point;

public class TestNormCdf extends HttpServlet {

    private ArrayList<Double> cyis = null;
    private ArrayList<Double> axis = null;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        axis = new ArrayList<Double>();
        cyis = new ArrayList<Double>();
        // 初始化横坐标值
        axis = initial(axis);
        /* axis = stand(axis); */
        // 计算纵坐标值
        //NormalDistribution normal = new NormalDistribution();
        // 先排序
        Collections.sort(axis);
        int n = axis.size();
/*        for (int i = 0; i < axis.size(); i++) {
            cyis.add(normal.inverseCumulativeProbability((i + 1 - 0.5) / n));
        }*/
        for (int i = 0; i < axis.size(); i++) {
            cyis.add((i + 1 - 0.5) / n);
        }
        
          double sumX = getSum(axis); 
          double sumY = getSum(cyis); 
          double sumP2X = getPowSum(axis);
          double sumXY = getSumXY(axis, cyis); 
          double a =(sumXY - (1 / axis.size()) * sumX * sumY) / (sumP2X - (1 /axis.size()) * sumX * sumX);
          double b = (1 / axis.size()) * (sumY - a*sumX);
          double pointx1 = axis.get(0);
          double pointx2 = axis.get(n - 1);
          double pointy1 = b+a * pointx1;
          double pointy2 = b+a * pointx2;
        //cyis = stand2(cyis);
        /*double x1 = axis.get((int) (n * 0.75));
        double x2 = axis.get((int) (n * 0.25));
        double y1 = cyis.get((int) (n * 0.75));
        double y2 = cyis.get((int) (n * 0.25));
        double dx = x1 - x2;
        double dy = y1 - y2;
        double a = dy / dx;
        double pointx1 = axis.get(0);
        double pointx2 = axis.get(n - 1);
        double centreX = 0.5 * (x1 + x2);
        double centreY = 0.5 * (y1 + y2);
        double pointy1 = centreY - a * (centreX - pointx1);
        double pointy2 = centreY + a * (pointx2 - centreX);*/
        Double[][] array = new Double[axis.size() + 2][2];
        NumberFormat ddf1 = NumberFormat.getNumberInstance();
        ddf1.setMaximumFractionDigits(4);
        for (int i = 0; i < axis.size(); i++) {
            array[i][0] = Double.valueOf(ddf1.format(axis.get(i)));
            array[i][1] = Double.valueOf(ddf1.format(cyis.get(i)));
        }
        array[axis.size()][0] = Double.valueOf(ddf1.format(pointx1));
        array[axis.size()][1] = Double.valueOf(ddf1.format(pointy1));
        array[axis.size() + 1][0] = Double.valueOf(ddf1.format(pointx2));
        array[axis.size() + 1][1] = Double.valueOf(ddf1.format(pointy2));
        response.getWriter().write(JSONArray.fromObject(array).toString());
    }

    public ArrayList<Double> stand2(ArrayList<Double> cyis) {
        int n = cyis.size();
        NormalDistribution normal = new NormalDistribution();
        for (int i = 0; i < cyis.size(); i++) {
            cyis.set(i, normal.cumulativeProbability(cyis.get(i)));
        }
        return cyis;
    }

    /*
     * public ArrayList<Double> stand(ArrayList<Double> list) { double average =
     * getAverage(list); double std = getStdVariance(list); for (int i = 0; i <
     * list.size(); i++) { list.set(i, (list.get(i) - average) / std); } return
     * list; }
     * 
     * public double getStdVariance(ArrayList<Double> list) { double std = 0.0;
     * double average = getAverage(list); for (int i = 0; i < list.size(); i++)
     * { std += Math.pow((list.get(i) - average), 2); } return std /
     * list.size(); }
     * 
     * public double getAverage(ArrayList<Double> list) { return getSum(list) /
     * list.size(); }
     */

    public double getSum(ArrayList<Double> list) {
        double sum = 0.0;
        for (Double value : list) {
            sum += value;
        }
        return sum;
    }

    public double getSumXY(ArrayList<Double> X, ArrayList<Double> Y) {
        double sum = 0.0;
        for (int i = 0; i < X.size(); i++) {
            sum += X.get(i) * Y.get(i);
        }
        return sum;
    }

    public double getPowSum(ArrayList<Double> list) {
        double sum = 0.0;
        for (Double value : list) {
            sum += Math.pow(value, 2);
        }
        return sum;
    }

    public ArrayList<Double> initial(ArrayList<Double> axis) {
        axis = new ArrayList<Double>();
        axis.add(9.0);
        axis.add(11.0);
        axis.add(15.0);
        axis.add(20.0);
        axis.add(30.0);
        axis.add(40.0);
        axis.add(35.0);
        axis.add(80.0);
        axis.add(50.0);
        axis.add(60.0);
        axis.add(55.0);
        axis.add(45.0);
        axis.add(65.0);
        axis.add(70.0);
        axis.add(58.0);
        axis.add(72.0);
        axis.add(66.0);
        axis.add(59.0);
        return axis;
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

3、html部分代码

    <script src="http://cdn.hcharts.cn/jquery/jquery-1.8.3.min.js"></script>
    <script src="${pageContext.request.contextPath}/js/highcharts.js" ></script>
      <script type="text/javascript">
          $(function(){
              $.post("/Test_Polyfit/TestNormCdf",null,function(data){
                             var array=eval(data);
                          $("#container").highcharts({
                              chart:{
                                  zoomType:'xy'
                              },
                              title:{
                                  text:'Normal Probability of Wait Time'
                              },
                              xAxis:{
                                  title:{
                                      enabled:true,
                                      text:'Wait Time'
                                  },
                                  startOnTick: true,                                                               
                                endOnTick: true,                                                                 
                                showLastLabel: true
                              },
                              yAxis:{
                                  title:{
                                      text:'Probability in normal distribution'
                                  },
                                  min:0,
                                  max:1, 
                                  staggerLines:20,
                                 allowDecimals:true
                              },
                              legend:{
                                  layout:'vertical',
                                  align:'left',
                                  verticalAlign: 'top',
                                  x: 100,                                                                          
                                y: 70,                                                                           
                                floating: true,                                                                  
                                backgroundColor: '#FFFFFF',                                                      
                                borderWidth: 1
                              },
                               plotOptions: {                                                                       
                                    scatter: {                                                                       
                                        marker: {                                                                    
                                            radius: 5,                                                               
                                            states: {                                                                
                                                hover: {                                                             
                                                    enabled: true,                                                   
                                                    lineColor: 'rgb(100,100,100)'                                    
                                                }                                                                    
                                            }                                                                        
                                        },                                                                           
                                        states: {                                                                    
                                            hover: {                                                                 
                                                marker: {                                                            
                                                    enabled: false                                                   
                                                }                                                                    
                                            }                                                                        
                                        },                                                                           
                                        tooltip: {                                                                   
                                            headerFormat: '<b>{series.name}</b><br>',                                
                                            pointFormat: '{point.x} cm, {point.y} kg'                                
                                        }                                                                            
                                    }                                                                                
                            },
                             series: [{  
                                type:'scatter',                                                                         
                                name: 'point',                                                                  
                                color: 'rgba(223, 83, 83, .5)',                                                  
                                data: array
                            },{
                                type:'line',
                                name: 'polyfitline', 
                                color: 'black',
                                data: [array.pop(),array.pop()]
                            }]                               
                          });
                  });
              });        
              
      </script>
  </head>
  <body>
          <div id="container"></div>

4、最后实现的效果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值