-2

通常の Linest は簡単ですが、「b を 0 に設定し、m 値を y = mx に合わせて調整する」方法がわかりません。

static class Program
{
    static void Main(string[] args)
    {
        var yValues = new double[] { 1, 9, 5, 7 };
        var xValues = new double[] { 0, 4, 2, 3 };


        var noConst = Linest(yValues, xValues);
        Console.WriteLine("m = {0}, b = {1}", noConst.Slope, noConst.Intercept);


    }

    public static LineSpec Linest(IList<double> yValues, IList<double> xValues)
    {
        var yAvg = yValues.Sum() / yValues.Count;
        var xAvg = xValues.Sum() / xValues.Count;

        double upperSum = 0;
        double lowerSum = 0;
        for (var i = 0; i < yValues.Count; i++)
        {
            upperSum += (xValues[i] - xAvg) * (yValues[i] - yAvg);
            lowerSum += (xValues[i] - xAvg) * (xValues[i] - xAvg);
        }

        var m = upperSum / lowerSum;
        var b = yAvg - m * xAvg;
        return new LineSpec() { Slope = m, Intercept = b };
    }

}

struct LineSpec
{
    public double Slope { get; set; }
    public double Intercept { get; set; }
}
4

1 に答える 1

-1

これは数学の問題であり、コーディングの問題ではありません。切片項なしで線形回帰を使用します。


    public static LineSpec LinestConst(IList<double> yValues, IList<double> xValues)
    {
        var yAvg = yValues.Sum() / yValues.Count;
        var xAvg = xValues.Sum() / xValues.Count;

        double upperSum = 0;
        double lowerSum = 0;
        for (var i = 0; i < yValues.Count; i++)
        {
            upperSum += (xValues[i] * yValues[i] );
            lowerSum += (xValues[i] * xValues[i] );
        }

        var m = upperSum / lowerSum;
        var b = 0;
        return new LineSpec() { Slope = m, Intercept = b };
    }
于 2015-02-25T21:46:40.127 に答える