Browse Source

Linear Regression: use more efficient LA routines (via tibel)

optimization-3
Christoph Ruegg 13 years ago
parent
commit
13ede7dc3a
  1. 6
      src/Numerics/LinearRegression/MultipleRegression.cs
  2. 8
      src/Numerics/LinearRegression/WeightedRegression.cs

6
src/Numerics/LinearRegression/MultipleRegression.cs

@ -45,7 +45,7 @@ namespace MathNet.Numerics.LinearRegression
/// <returns>Best fitting vector for model parameters β</returns>
public static Vector<T> NormalEquations<T>(Matrix<T> x, Vector<T> y) where T : struct, IEquatable<T>, IFormattable
{
return x.TransposeThisAndMultiply(x).Cholesky().Solve(x.Transpose()*y);
return x.TransposeThisAndMultiply(x).Cholesky().Solve(x.TransposeThisAndMultiply(y));
}
/// <summary>
@ -57,7 +57,7 @@ namespace MathNet.Numerics.LinearRegression
/// <returns>Best fitting vector for model parameters β</returns>
public static Matrix<T> NormalEquations<T>(Matrix<T> x, Matrix<T> y) where T : struct, IEquatable<T>, IFormattable
{
return x.TransposeThisAndMultiply(x).Cholesky().Solve(x.Transpose() * y);
return x.TransposeThisAndMultiply(x).Cholesky().Solve(x.TransposeThisAndMultiply(y));
}
/// <summary>
@ -76,7 +76,7 @@ namespace MathNet.Numerics.LinearRegression
predictor = predictor.InsertColumn(0, Vector<T>.Build.Dense(predictor.RowCount, Vector<T>.One));
}
var response = Vector<T>.Build.Dense(y);
return predictor.TransposeThisAndMultiply(predictor).Cholesky().Solve(predictor.Transpose()*response).ToArray();
return predictor.TransposeThisAndMultiply(predictor).Cholesky().Solve(predictor.TransposeThisAndMultiply(response)).ToArray();
}
/// <summary>

8
src/Numerics/LinearRegression/WeightedRegression.cs

@ -42,7 +42,7 @@ namespace MathNet.Numerics.LinearRegression
/// </summary>
public static Vector<T> Weighted<T>(Matrix<T> x, Vector<T> y, Matrix<T> w) where T : struct, IEquatable<T>, IFormattable
{
return x.TransposeThisAndMultiply(w*x).Cholesky().Solve(x.Transpose()*(w*y));
return x.TransposeThisAndMultiply(w*x).Cholesky().Solve(x.TransposeThisAndMultiply(w*y));
}
/// <summary>
@ -50,7 +50,7 @@ namespace MathNet.Numerics.LinearRegression
/// </summary>
public static Matrix<T> Weighted<T>(Matrix<T> x, Matrix<T> y, Matrix<T> w) where T : struct, IEquatable<T>, IFormattable
{
return x.TransposeThisAndMultiply(w*x).Cholesky().Solve(x.Transpose()*(w*y));
return x.TransposeThisAndMultiply(w*x).Cholesky().Solve(x.TransposeThisAndMultiply(w*y));
}
/// <summary>
@ -65,8 +65,8 @@ namespace MathNet.Numerics.LinearRegression
predictor = predictor.InsertColumn(0, Vector<T>.Build.Dense(predictor.RowCount, Vector<T>.One));
}
var response = Vector<T>.Build.Dense(y);
var weights = Matrix<T>.Build.Diagonal(new DiagonalMatrixStorage<T>(predictor.RowCount, predictor.RowCount, w));
return predictor.TransposeThisAndMultiply(weights*predictor).Cholesky().Solve(predictor.Transpose()*(weights*response)).ToArray();
var weights = Matrix<T>.Build.DenseOfDiagonalArray(w);
return predictor.TransposeThisAndMultiply(weights*predictor).Cholesky().Solve(predictor.TransposeThisAndMultiply(weights*response)).ToArray();
}
/// <summary>

Loading…
Cancel
Save