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)


true params: [-4.5115762  -6.74543601  3.38123103  4.08243683]

online params: [-4.38579869 -6.4153256   3.14261077  4.23708842]

OLS params: [-4.39685674 -6.59708334  3.2617021   4.12378786]

In [ ]:


In [ ]: