9

MSChart コントロールを使用して X および Y データ ポイントのセットの散布図を作成する小さなアプリケーションを C# で作成しています。これらの一部はかなり大きくなる場合があります (数百のデータ ポイント)。

ポイントを横切る最適な線をプロットするための「標準」アルゴリズムがあるかどうかを尋ねたかった. X データ ポイントを事前に定義された数のセット (10 または 20 など) に分割し、各セットについて、対応する Y 値と中央の X 値などの平均をとって線を作成することを考えています。これは正しいアプローチですか?

私は既存のスレッドを検索しましたが、それらはすべて、Matlab のような既存のアプリケーションを使用して同じことを達成しようとしているようです。

ありがとう、

4

2 に答える 2

14

線形最小二乗アルゴリズムを使用

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);
        }
    }
}
于 2012-10-18T03:30:36.763 に答える
2

はい。Linear Regression、特にSimple Linear Regressionを使用する必要があります。

アルゴリズムは基本的に次のとおりです。

  • 最適な直線が存在すると仮定し、y = ax + b
  • 各ポイントについて、この線からの距離を最小限に抑えたい
  • 線からの各ポイントの距離を計算し、距離を合計します (通常、距離の 2 乗を使用して、線から離れたポイントに大きなペナルティを課します)
  • a基本的な微積分を使用して結果の方程式を最小化するとの値を見つけますb(最小値は 1 つだけである必要があります)。

ウィキペディアのページには、必要なものがすべて揃っています。

于 2012-10-18T02:50:43.600 に答える