最小二乘法C#实现,简单代码
線性函數模型
典型的一類函數模型是線性函數模型。最簡單的線性式是,寫成矩陣式,為
直接給出該式的參數解:
?和?
其中,為t值的算術平均值。也可解得如下形式:
b1為斜率,b0為截距,可以先根據x,y數組,以及上面的公式先計算出斜率,再計算截距。
因為原來參考代碼中,返回為一個數組,根據與原來代碼的兼容性,調用LinearResult(double[],double[])方法返回是一個數組。result[0]為斜率,result[1]為截距。
?class Linear
? ? {
? ? ? ? public double[] LinearResult(double[] arrayX, double[] arrayY)
? ? ? ? {
? ? ? ? ? ? double[] result = { 0, 0 };
?
? ? ? ? ? ? if (arrayX.Length == arrayY.Length)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? double averX = arrayX.Average();
? ? ? ? ? ? ? ? double averY = arrayY.Average();
? ? ? ? ? ? ? ? result[0] = Scale(averX, averY, arrayX, arrayY);
? ? ? ? ? ? ? ? result[1] = Offset(result[0],averX,averY);
? ? ? ? ? ? }
?
? ? ? ? ? ? return result;
? ? ? ? }
?
? ? ? ? private double Scale(double averX, double averY, double[] arrayX, double[] arrayY)
? ? ? ? {
? ? ? ? ? ? double scale = 0;
? ? ? ? ? ? if (arrayX.Length == arrayY.Length)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? double Molecular = 0;
? ? ? ? ? ? ? ? double Denominator = 0;
? ? ? ? ? ? ? ? for (int i = 0; i < arrayX.Length; i++)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Molecular += (arrayX[i] - averX) * (arrayY[i] - averY);
? ? ? ? ? ? ? ? ? ? Denominator += Math.Pow((arrayX[i] - averX), 2);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? scale = Molecular / Denominator;
? ? ? ? ? ? }
?
? ? ? ? ? ? return scale;
? ? ? ? }
?
? ? ? ? private double Offset(double scale, double averX,double averY)
? ? ? ? {
? ? ? ? ? ? double offset = 0;
? ? ? ? ? ? offset = averY - scale * averX;
? ? ? ? ? ? return offset;
? ? ? ? }
? ? }
?
總結
以上是生活随笔為你收集整理的最小二乘法C#实现,简单代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 各种学习资源 文档、手册 (Docker
- 下一篇: VUE 解决:Property or m