Arsen Zahray
Arsen Zahray

Reputation: 25337

Looking for a sample how to do weighted linear regression

I'm trying to use MathNet to calculate weighted linear regression of my data.

The documentation is here.

I'm trying to find a x + b = y such that it would best fit a list of (x,y,w), where w is weight of each point.

        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);

As result, in r I'm getting a single point. What I'm expecting is values of a and b.

What am I doing wrong?

Upvotes: 2

Views: 1072

Answers (2)

Using Math.Net Numerics might be a good idea.

Weighted Regression

Sometimes the regression error can be reduced by dampening specific data points. We can achieve this by introducing a weight matrix W into the normal equations XTy=XTXp. Such weight matrices are often diagonal, with a separate weight for each data point on the diagonal.

var p = WeightedRegression.Weighted(X,y,W);

Weighter regression becomes interesting if we can adapt them to the point of interest and e.g. dampen all data points far away. Unfortunately this way the model parameters are dependent on the point of interest t.

1: // warning: preliminary api

2: var p = WeightedRegression.Local(X,y,t,radius,kernel);

You can find more info at: https://numerics.mathdotnet.com/regression.html

Upvotes: 1

Peter
Peter

Reputation: 684

WeightedRegression.Weighted expects a predictor matrix as the first parameter, and only the LogAvgAmount is being passed. Try adding a 1 to the list or invoking WeightedRegression.Weighted with 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);

Upvotes: 2

Related Questions