-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 回答