.NET 3.5 및 VS2008과 호환되므로 MathNet.Iridium 릴리스를 사용했습니다. 이 방법은 Vandermonde 행렬을 기반으로합니다. [1,0.57,-0.15]
의
using MathNet.Numerics.LinearAlgebra;
class Program
{
static void Main(string[] args)
{
Vector x_data = new Vector(new double[] { 0, 1, 2, 3, 4 });
Vector y_data = new Vector(new double[] { 1.0, 1.4, 1.6, 1.3, 0.9 });
var poly = new PolynomialRegression(x_data, y_data, 2);
Console.WriteLine("{0,6}{1,9}", "x", "y");
for (int i = 0; i < 10; i++)
{
double x = (i * 0.5);
double y = poly.Fit(x);
Console.WriteLine("{0,6:F2}{1,9:F4}", x, y);
}
}
}
계산 된 계수를 출력 :
x y
0.00 1.0000
0.50 1.2475
1.00 1.4200
1.50 1.5175
2.00 1.5400
2.50 1.4875
3.00 1.3600
3.50 1.1575
4.00 0.8800
4.50 0.5275
일치 그럼 어떤
using MathNet.Numerics.LinearAlgebra;
public class PolynomialRegression
{
Vector x_data, y_data, coef;
int order;
public PolynomialRegression(Vector x_data, Vector y_data, int order)
{
if (x_data.Length != y_data.Length)
{
throw new IndexOutOfRangeException();
}
this.x_data = x_data;
this.y_data = y_data;
this.order = order;
int N = x_data.Length;
Matrix A = new Matrix(N, order + 1);
for (int i = 0; i < N; i++)
{
A.SetRowVector(VandermondeRow(x_data[i]) , i);
}
// Least Squares of |y=A(x)*c|
// tr(A)*y = tr(A)*A*c
// inv(tr(A)*A)*tr(A)*y = c
Matrix At = Matrix.Transpose(A);
Matrix y2 = new Matrix(y_data, N);
coef = (At * A).Solve(At * y2).GetColumnVector(0);
}
Vector VandermondeRow(double x)
{
double[] row = new double[order + 1];
for (int i = 0; i <= order; i++)
{
row[i] = Math.Pow(x, i);
}
return new Vector(row);
}
public double Fit(double x)
{
return Vector.ScalarProduct(VandermondeRow(x) , coef);
}
public int Order { get { return order; } }
public Vector Coefficients { get { return coef; } }
public Vector XData { get { return x_data; } }
public Vector YData { get { return y_data; } }
}
그때 나는이 같이 사용할 내 다항식 회귀 개최하는 클래스를 생성 quadratic Wolfram Alpha의 결과입니다.
편집 1 당신이 x_data
및 y_data
에 대해 다음 초기화를 시도하려는 맞게 효율적으로 활용하려면 다음 (가장 높은 최저 전력에서) 다음 계수를 생산
Matrix points = new Matrix(new double[,] { { 1, 82.96 },
{ 2, 86.23 }, { 3, 87.09 }, { 4, 84.28 },
{ 5, 83.69 }, { 6, 89.18 }, { 7, 85.71 },
{ 8, 85.05 }, { 9, 85.58 }, { 10, 86.95 },
{ 11, 87.95 }, { 12, 89.44 }, { 13, 93.47 } });
Vector x_data = points.GetColumnVector(0);
Vector y_data = points.GetColumnVector(1);
Coef=[85.892,-0.5542,0.074990]
x y
0.00 85.8920
1.00 85.4127
2.00 85.0835
3.00 84.9043
4.00 84.8750
5.00 84.9957
6.00 85.2664
7.00 85.6871
8.00 86.2577
9.00 86.9783
10.00 87.8490
11.00 88.8695
12.00 90.0401
13.00 91.3607
14.00 92.8312
정확하게 내가 찾은 결과입니다 : http://www3.wolframalpha.com/input/?i=quadratic+fit+%7B1%2C82.96%7D%2C%7B2%2C86.23%7D % 2C % 7B3 % 2C87.09 % 7D % 2C % 7B4 % 2C84.28 % 7D % 2C % 7B5 % 2C83.69 % 7D % 2C % 7B6 % 2C89.18 % 7D % 2C % 7B7 % 2C85.71 % 7D % 2C % 7B8 % 2C85.05 % 7D % 2C % 7B9 % 2C85.58 % 7D % 2C % 7B10 % 2C86.95 % 7D % 2C % 7B11 % 2C87.95 % 7D % 2C % 7B12 % 2C89.44 % 7D % 2C % 7B13 % 2C93.47 % 7D – Polynomial
링크가있는 다른 q : http://stackoverflow.com/questions/882009/is-there-any-tool-for-regression-model 관련된 찾고있는 codeproject 것 : http : //www.codeproject.com/KB/recipes/QuadraticRegression.aspx – AakashM
전자는 보간 모델에 대한 링크 집합이며, 후자는 'double'대신 'decimal'을 사용하도록 변환 한 후에도 사용하기 힘든 부정확 한 결과를 제공합니다. '. – Polynomial