 |
NumCpp
2.1.0
A C++ implementation of the Python Numpy library
|
Go to the documentation of this file.
44 #include <type_traits>
74 template<
typename dtype,
typename ...Params,
80 const uint32 numIterations,
85 Params... initialGuess)
89 const auto coordinatesShape = coordinates.
shape();
91 if (coordinatesShape.rows != measurements.
size())
100 const auto colSlice = coordinates.
cSlice();
101 for (
uint32 iteration = 1; iteration <= numIterations; ++iteration)
103 for (
uint32 measIdx = 0; measIdx < coordinatesShape.rows; ++measIdx)
105 const auto coordinate = coordinates(measIdx, colSlice);
107 residuals[measIdx] =
static_cast<double>(measurements[measIdx]) -
108 static_cast<double>(
function(coordinate,
beta));
110 for (
uint32 paramIdx = 0; paramIdx <
sizeof...(Params); ++paramIdx)
112 const auto& derivative = derivatives[paramIdx];
113 jacobian(measIdx, paramIdx) =
static_cast<double>(derivative(coordinate,
beta));
118 const auto jacobianT = jacobian.
transpose();
119 const auto jacobianPsuedoInverse =
linalg::inv(jacobianT.dot(jacobian));
120 const auto intermediate = jacobianPsuedoInverse.dot(jacobianT);
121 const auto deltaBeta = intermediate.dot(residuals);
126 for (
uint32 measIdx = 0; measIdx < coordinatesShape.rows; ++measIdx)
128 const auto coordinate = coordinates(measIdx, colSlice);
130 residuals[measIdx] =
static_cast<double>(measurements[measIdx]) -
131 static_cast<double>(
function(coordinate,
beta));
134 return std::make_pair(
beta.flatten(),
rms(residuals).item());
typename std::enable_if< B, T >::type enable_if_t
Definition: TypeTraits.hpp:41
NdArray< double > inv(const NdArray< dtype > &inArray)
Definition: inv.hpp:55
Shape shape() const noexcept
Definition: NdArrayCore.hpp:4312
#define STATIC_ASSERT_ARITHMETIC(dtype)
Definition: StaticAsserts.hpp:38
std::pair< NdArray< double >, double > gaussNewtonNlls(const uint32 numIterations, const NdArray< dtype > &coordinates, const NdArray< dtype > &measurements, const std::function< dtype(const NdArray< dtype > &, const NdArray< dtype > &)> &function, const std::array< std::function< dtype(const NdArray< dtype > &, const NdArray< dtype > &)>, sizeof...(Params)> &derivatives, Params... initialGuess)
Definition: gaussNewtonNlls.hpp:79
NdArray< dtype > transpose() const
Definition: NdArrayCore.hpp:4608
dtype beta(dtype inAlpha, dtype inBeta)
Definition: Random/beta.hpp:58
std::uint32_t uint32
Definition: Types.hpp:41
Slice cSlice(int32 inStartIdx=0, uint32 inStepSize=1) const noexcept
Definition: NdArrayCore.hpp:891
NdArray< double > rms(const NdArray< dtype > &inArray, Axis inAxis=Axis::NONE)
Definition: rms.hpp:53
size_type size() const noexcept
Definition: NdArrayCore.hpp:4326
constexpr bool all_arithmetic_v
Definition: TypeTraits.hpp:103
Definition: Coordinate.hpp:45
constexpr bool all_same_v
Definition: TypeTraits.hpp:137
#define THROW_INVALID_ARGUMENT_ERROR(msg)
Definition: Error.hpp:37