public GPOut Compute(Matrix <double> mTr, Matrix <double> mTeTr, Vector <double> vTrY) { var Mtr = (mTr).RowCount; var gpOut = new GPOut(); var Kte = _kernel.Main(DistanceMatrix.Instance.Matrix, _length); if (Mtr > 0) { var Kxx_p_noise = _kernel.Main(mTr, _length); for (int i = 0; i < Mtr; i++) { Kxx_p_noise[i, i] += _noise; } var svd1 = Kxx_p_noise.Svd(); for (int i = 0; i < Mtr; i++) { svd1.S[i] = svd1.S[i] > Double.Epsilon ? 1.0 / svd1.S[i] : 0; } var tmp = _kernel.Main(mTeTr, _length) * svd1.U; gpOut.mu = tmp * (svd1.S.PointwiseMultiply(svd1.U.Transpose() * (vTrY))); var cov = tmp * Matrix <double> .Build.DenseOfDiagonalVector(svd1.S.PointwiseSqrt()); cov = cov * cov.Transpose(); cov = Kte /*.SubMatrix(0,100,0,100) */ - cov; var svd2 = cov.Svd(); for (int i = 0; i < Mte; i++) { if (svd2.S[i] < Double.Epsilon) { svd2.S[i] = 0.0; } } gpOut.proj = svd2.U * Matrix <double> .Build.DenseOfDiagonalVector(svd2.S.PointwiseSqrt()); gpOut.sd95 = 1.98 * (gpOut.proj * gpOut.proj.Transpose()).Diagonal().PointwiseSqrt(); } else { gpOut.sd95 = 1.98 * (Kte.Diagonal()).PointwiseSqrt(); var svd = Kte.Svd(); gpOut.proj = svd.U * Matrix <double> .Build.DenseOfDiagonalVector(svd.S.PointwiseSqrt()); gpOut.mu = Vector <double> .Build.DenseOfArray(Enumerable.Range(0, Mte).Select(_ => 0d).ToArray()); } return(gpOut); }
public Svd <double> GetDefaultSvd() { Matrix <double> dmTr = MathHelper.ComputeDistanceMatrix(new[] { 0d }, new[] { 0d }); Vector <double> v = Vector <double> .Build.DenseOfArray(new[] { 0d }); var Kxx_p_noise = kernel.Main(dmTr, length); for (int i = 0; i < 1; i++) { Kxx_p_noise[i, i] += noise; } return(Kxx_p_noise.Svd()); }
public GP(IMatrixkernel kernel, double length, double noise) { this._kernel = kernel; this._length = length; this._noise = noise; this._Kte = kernel.Main(DistanceMatrix.Instance.Matrix, length); }
public GPOut Predict(double[] trainingPointsX, double[] trainingPointsY, params double[] TestPointsX) { if (TestPointsX.Count() == 1) { Kte = kernel.Main(Matrix <double> .Build.Dense(1, 1), length); } else { Kte = kernel.Main(DistanceMatrix.Instance.Matrix.SubMatrix(0, TestPointsX.Count(), 0, TestPointsX.Count()), length); } var svd1 = Task.Run(() => trainingPointsX.Length > 0 ? Update(trainingPointsX, trainingPointsY) : GetDefaultSvd()); var gpOut = new GPOut(); Svd <double> svd; (gpOut.mu, svd) = Task.Run(() => { if (trainingPointsX.Count() > 0) { return(Evaluate(TestPointsX, trainingPointsX.ToArray(), trainingPointsY.ToArray(), kernel, length, svd1.Result, Kte)); } else { return(Vector <double> .Build.DenseOfArray(Enumerable.Range(0, TestPointsX.Count()).Select(_ => 0d).ToArray()), Kte.Svd()); //gpOut.sd95 = 1.98 * (Kte.Diagonal()).PointwiseSqrt(); } }).Result; gpOut.proj = svd.U * Matrix <double> .Build.DenseOfDiagonalVector(svd.S.PointwiseSqrt()); gpOut.sd95 = 1.98 * (gpOut.proj * gpOut.proj.Transpose()).Diagonal().PointwiseSqrt(); gpOut.X = TestPointsX; return(gpOut); }
public static (Vector <double>, Svd <double>) Evaluate(double[] testPointsX, double[] trainingPointsX, double[] trainingPointsY, IMatrixkernel kernel, double length, Svd <double> svd1, Matrix <double> Kte) { var gpOut = new GPOut(); Svd <double> svd; var dmTeTr = MathHelper.ComputeDistanceMatrix(testPointsX, trainingPointsX.ToArray()); var tmp = kernel.Main(dmTeTr, length) * svd1.U; Vector <double> v = Vector <double> .Build.DenseOfEnumerable(trainingPointsY); var mu = tmp * (svd1.S.PointwiseMultiply(svd1.U.Transpose() * v)); var cov = tmp * Matrix <double> .Build.DenseOfDiagonalVector(svd1.S.PointwiseSqrt()); cov = cov * cov.Transpose(); cov = Kte - cov; svd = cov.Svd(); for (int i = 0; i < svd.S.Count; i++) { svd.S[i] = svd.S[i] < Double.Epsilon ? 0 : svd.S[i]; } return(mu, svd); }