散点图“最佳拟合”线的算法

9

我正在使用MSChart控件编写一个小型的C#应用程序,用于绘制一组X和Y数据点的散点图。其中一些可能相当大(数百个数据点)。

想问一下是否有一个“标准”算法来绘制最佳拟合线穿过这些点。我考虑将X数据点分成预定义数量的集合,例如10或20个,并为每个集合取相应Y值和中间X值的平均值,以此类推创建线条。这是正确的方法吗?

我已经搜索了现有的线程,但它们似乎都是关于使用现有应用程序(如Matlab)实现相同目的的。

2个回答

15

使用线性最小二乘算法

public class XYPoint
{
    public int X;
    public double Y;
}

class Program
{
    public static List<XYPoint> GenerateLinearBestFit(List<XYPoint> points, out double a, out double b)
    {
        int numPoints = points.Count;
        double meanX = points.Average(point => point.X);
        double meanY = points.Average(point => point.Y);

        double sumXSquared = points.Sum(point => point.X * point.X);
        double sumXY = points.Sum(point => point.X * point.Y);

        a = (sumXY / numPoints - meanX * meanY) / (sumXSquared / numPoints - meanX * meanX);
        b = (a * meanX - meanY);

        double a1 = a;
        double b1 = b;

        return points.Select(point => new XYPoint() { X = point.X, Y = a1 * point.X - b1 }).ToList();
    }

    static void Main(string[] args)
    {
        List<XYPoint> points = new List<XYPoint>()
                                   {
                                       new XYPoint() {X = 1, Y = 12},
                                       new XYPoint() {X = 2, Y = 16},
                                       new XYPoint() {X = 3, Y = 34},
                                       new XYPoint() {X = 4, Y = 45},
                                       new XYPoint() {X = 5, Y = 47}
                                   };

        double a, b;

        List<XYPoint> bestFit = GenerateLinearBestFit(points, out a, out b);

        Console.WriteLine("y = {0:#.####}x {1:+#.####;-#.####}", a, -b);

        for(int index = 0; index < points.Count; index++)
        {
            Console.WriteLine("X = {0}, Y = {1}, Fit = {2:#.###}", points[index].X, points[index].Y, bestFit[index].Y);
        }
    }
}

3
嘿,这是一个非常棒和优雅的解决方案,应该被重复使用!实际上我有一个更正:'b = (a * meanX - meanY);' 应该翻转为 'b = (meanY - a * meanX);',因为 Y=MX+B 中的 B=Y-MX。 - Ryan

2
是的。您需要使用线性回归,特别是简单线性回归
算法基本上是:
  • 假设存在最佳拟合直线,y = ax + b
  • 对于每个点,您希望将它们与该直线的距离最小化
  • 计算每个点到直线的距离,并将距离相加(通常我们使用距离的平方来更重视距离较远的点)
  • 使用基本微积分找到使得结果方程最小化的ab的值(应该只有一个最小值)
维基百科页面将为您提供所需的一切。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接