Ищем образец, как сделать взвешенную линейную регрессию
Я пытаюсь использовать MathNet для расчета взвешенной линейной регрессии моих данных.
Документация здесь.
Я пытаюсь найти a x + b = y
такой, что лучше всего подходит список (x,y,w), где w
вес каждой точки.
var r = WeightedRegression.Weighted(
weightedPoints.Select(p=>new Tuple<double[],double>(new [] { p.LogAvgAmount}, p.Frequency),
weightedPoints.Select(p=>Convert.ToDouble(p.Weight)).ToArray(), false);
Как результат, в r
Я получаю одно очко. То, что я ожидаю, это значения a и b.
Что я делаю неправильно?
2 ответа
WeightedRegression.Weighted
ожидает матрицу предиктора в качестве первого параметра, и только LogAvgAmount
проходит Попробуйте добавить 1
к списку или вызывая WeightedRegression.Weighted
с intercept: true
var x = weightedPoints.Select(p => new[] {p.LogAvgAmount}).ToArray();
var y = weightedPoints.Select(p => p.Frequency).ToArray();
var w = weightedPoints.Select(p => Convert.ToDouble(p.Weight)).ToArray();
// r1 == r2
var r1 = WeightedRegression.Weighted(weightedPoints.Select(p =>
new[] {1, p.LogAvgAmount}).ToArray(), y, w);
var r2 = WeightedRegression.Weighted(x, y, w, intercept: true);
Использование Math.Net Numerics может быть хорошей идеей.
Взвешенная регрессия
Иногда ошибка регрессии может быть уменьшена путем демпфирования определенных точек данных. Этого можно добиться, введя весовую матрицу W в нормальные уравнения XTy=XTXp. Такие матрицы весов часто являются диагональными, с отдельным весом для каждой точки данных на диагонали.
var p = WeightedRegression.Weighted (X, y, W);
Весовая регрессия становится интересной, если мы можем адаптировать их к интересующей точке и, например, ослабить все точки данных далеко. К сожалению, таким образом параметры модели зависят от интересующей точки t.
1: // предупреждение: предварительный API
2: var p = WeightedRegression.Local(X,y,t, радиус, ядро);
Вы можете найти более подробную информацию по адресу: https://numerics.mathdotnet.com/regression.html