In [116]:
import numpy as np
from scipy.stats import norm
from statsmodels.regression.linear_model import OLS
In [117]:
dim = 3
N = 1000
constants = np.ones(N).reshape(N,1)
var = norm(0, 1).rvs((N, dim))
X = np.concatenate((constants, var), axis = 1)
b0 = 1.2 * np.ones(dim)
b1 = -.9 * np.ones(dim)
b2 = 2.7 * np.ones(dim)
B = np.array(norm(0, 5).rvs(dim + 1)).reshape(dim + 1, 1)
e = norm(0, 5)
y = (np.dot(B.T,X.T) + e.rvs(N)).reshape(N)
In [118]:
class OnlineRegression(object):
def __init__(self, dim):
self.w = np.zeros(dim)
self.gamma = np.identity(dim)
def update(self, x, y):
numerator = self.gamma * x * x.T * self.gamma
denominator = 1 + x.T * self.gamma * x
self.gamma = self.gamma - numerator / denominator
self.w = self.w - self.gamma * x * (x.T * self.w - y)
In [121]:
reg = OnlineRegression(4)
for i in range(N):
reg.update(X[i].reshape((dim+1,1)),np.array([y[i]]).reshape(1,1))
mod = OLS(y, X)
res = mod.fit()
In [122]:
print 'true params: {}'.format(B.reshape(dim + 1))
print
print 'online params: {}'.format(reg.w.diagonal())
print
print 'OLS params: {}'.format(res.params)
In [ ]:
In [ ]: