javascript - 拟合最佳散点图的回归

标签 javascript d3.js regression c3.js

我绘制了以下散点图,我想向我的数据添加线性多项式回归(最适合的回归)。有什么简单的方法可以实现吗?

我的图表是一个简单的图表,由 c3 库 v4 完成(取决于 d3 v3):

            <div id="chart2"></div>
            <script>
                var chart = c3.generate({
                    bindto: '#chart2',
                    data: {
                        url: '../static/CSV/Chart_data/grades_access.csv'+(new Date).getTime(),
                        x:'Access_grade',
                        type: 'scatter'
                    },
                    axis: {
                        y: {
                            label: {
                                text:"Average grade",
                                position: "outer-middle"
                            },
                            min:1,
                            max:9
                        },
                        x: {
                            label: {
                                text:"Access grade PAU",
                                position: "outer-center"
                            },
                            min:9,
                            max:14
                        }
                    },
                    size: {
                        height: 400,
                        width: 800
                    },
                    zoom: {
                        enabled: true
                    },
                    legend: {
                        show: true,
                        position: 'inset',
                        inset: {
                            anchor: 'top-right',
                            x: 20,
                            y: 300,
                            step: 1
                        }
                    }     
                }); 
            </script>

grades_access.csv 是:

Access_grade,Subject
9.85,2.5
10.64,8.1
10.0,3.2
10.92,4.0
11.69,2.9
11.79,7.8
11.03,5.0
10.47,6.2
...

有人能给我提示吗?我想要一个简单的东西,而不是太复杂的。但如果可能的话,用回归方程:) 谢谢!

最佳答案

我已经多次回答过这个问题 other libraries但从来没有c3.js。以下是使用简单的最小二乘法拟合线性回归的代码。它会onrendered执行此操作,以便您仍然可以使用c3的功能来获取和解析您的csv文件:

<div id="chart2"></div>
<script>
    var chart = c3.generate({
      bindto: '#chart2',
      data: {
        url: 'data.csv',
        x: 'Access_grade',
        type: 'scatter'
      },
      axis: {
        y: {
          label: {
            text: "Average grade",
            position: "outer-middle"
          },
          min: 1,
          max: 9
        },
        x: {
          label: {
            text: "Access grade PAU",
            position: "outer-center"
          },
          min: 9,
          max: 14
        }
      },
      size: {
        height: 400,
        width: 800
      },
      zoom: {
        enabled: true
      },
      legend: {
        show: true,
        position: 'inset',
        inset: {
          anchor: 'top-right',
          x: 20,
          y: 300,
          step: 1
        }
      },

      onrendered: function(c) {
        var points = chart.data()[0].values.map((d) => [d.x, d.value]),
          slopeIntercept = slopeAndIntercept(points),
          fitPoints = chart.data()[0].values.map((d) => slopeIntercept.slope * d.x + slopeIntercept.intercept);

        chart.load({
          columns: [
            ['Regression'].concat(fitPoints)
          ],
          type: 'line'
        });
      }
    });

    // simple linear regression
    slopeAndIntercept = function(points) {
      var rV = {},
        N = points.length,
        sumX = 0,
        sumY = 0,
        sumXx = 0,
        sumYy = 0,
        sumXy = 0;

      // can't fit with 0 or 1 point
      if (N < 2) {
        return rV;
      }

      for (var i = 0; i < N; i++) {
        var x = points[i][0],
          y = points[i][1];
        sumX += x;
        sumY += y;
        sumXx += (x * x);
        sumYy += (y * y);
        sumXy += (x * y);
      }

      // calc slope and intercept
      rV['slope'] = ((N * sumXy) - (sumX * sumY)) / (N * sumXx - (sumX * sumX));
      rV['intercept'] = (sumY - rV['slope'] * sumX) / N;
      rV['rSquared'] = Math.abs((rV['slope'] * (sumXy - (sumX * sumY) / N)) / (sumYy - ((sumY * sumY) / N)));

      return rV;
    }
</script>

这是一个正在运行的 example .

关于javascript - 拟合最佳散点图的回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50257760/

相关文章:

javascript - 如何堆叠 rects 各自的前一个 rect 的高度?

d3.js - d3 v4 scaleBand滴答声

python - 使用 numpy 数组进行矩阵乘法

python - 逻辑回归获取值错误无法将字符串转换为 float : '?'

javascript 'this' 链接代码

javascript - jquery 函数 '.on("click")' starts uncalled

javascript - Quill 富文本编辑器调整图像大小仅适用于 IE,但不适用于 Chrome 或 Edge

javascript - client.on 没有在单次连接上获取数据

javascript - 如何制作具有多个数据系列和 2 个 y 轴的鼠标悬停交互式折线图?

python - 在二进制分类中使用套索回归寻找最佳特征