C#实现最小二乘法
根據http://zh.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95里面的說法:
?
線性函數模型
?
典型的一類函數模型是線性函數模型。最簡單的線性式是?,寫成矩陣式,為
?
直接給出該式的參數解:
??和???
其中,為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;
}
}
?/// <summary> ? ? ? ?/// 計算一元一次方程系數(利用最小二乘法) ? ? ? ?/// 20200320新增 ? ? ? ?/// </summary> ? ? ? ?/// <param name="xValues"></param> ? ? ? ?/// <param name="yValues"></param> ? ? ? ?/// <returns></returns> ? ? ? ?private double[] CalCoefficientOfLinearEquation(double[] xValues, double[] yValues) ? ? ? ?{ ? ? ? ? ? ?if (xValues.Length != yValues.Length) ? ? ? ? ? ? ? ?return null; ? ? ? ? ? ?int valCount = xValues.Length; ? ? ? ? ? ?//計算X2=∑(xi)^2 , X=∑ xi , Yx=∑(xi*yi) , Y=∑ yi ? ? ? ? ? ?double X2 = 0; ? ? ? ? ? ?double X = 0; ? ? ? ? ? ?double Yx = 0; ? ? ? ? ? ?double Y = 0; ? ? ? ? ? ?for (int i = 0; i < valCount; i++) ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?X2 += Math.Pow(xValues[i], 2); ? ? ? ? ? ? ? ?X += xValues[i]; ? ? ? ? ? ? ? ?Yx += xValues[i] * yValues[i]; ? ? ? ? ? ? ? ?Y += yValues[i]; ? ? ? ? ? ?} ? ? ? ? ? ?//計算線性方程系數y=ax+b ? ? ? ? ? ?double a = (Yx * valCount - X * Y) / (X2 * valCount - X * X); ? ? ? ? ? ?double b = (X2 * Y - Yx * X) / (X2 * valCount - X * X); ? ? ? ? ? ?//返回系數的數組 ? ? ? ? ? ?double[] temp = new double[] { a, b }; ? ? ? ? ? ?return temp; ? ? ? ?}
總結
- 上一篇: 《 Docker 技术入门与实战 》读书
- 下一篇: 安装 Git ( Windows、li