-
Notifications
You must be signed in to change notification settings - Fork 1
/
NBfit.py
76 lines (60 loc) · 2.45 KB
/
NBfit.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
"""
NBfit.py
Module to fit negative binomial means and dispersions to contact count data.
Note that much of this was copied directly or re-written from code provided by Nelle Varoquaux.
"""
import logging
import numpy as np
from scipy import sparse
from sklearn.base import BaseEstimator
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import r2_score
from sklearn.utils.validation import check_is_fitted
class PolynomialEstimator(LinearRegression):
"""
Estimator to perform polynomial regression.
"""
def __init__(self,degree=1,fit_intercept=False):
assert isinstance(degree,int), "degree should be integer"
assert isinstance(fit_intercept,bool), "fit_intercept should be boolean"
self.degree = degree
self.fit_intercept = fit_intercept
poly = PolynomialFeatures(degree=self.degree, include_bias=self.fit_intercept)
self.poly = poly
# set up defaults for LinearRegression object so it doesn't complain
self.n_jobs = 1
self.normalize = False
self.copy_X = True
def fit(self, X, y):
X_poly = self.poly.fit_transform(X)
LinearRegression.fit(self,X_poly,y)
return self
def predict(self,X):
X_poly = self.poly.fit_transform(X)
return LinearRegression.predict(self,X_poly)
class LogPolyEstimator(LinearRegression):
"""
Estimator to perform polynomial regression in log space.
"""
def __init__(self,degree=2,fit_intercept=True):
assert isinstance(degree,int), "degree should be integer"
assert isinstance(fit_intercept,bool), "fit_intercept should be boolean"
self.degree = degree
self.fit_intercept = fit_intercept #this is always true for log space regression
poly = PolynomialFeatures(degree=self.degree, include_bias=False)
self.poly = poly
# set up defaults for LinearRegression object so it doesn't complain
self.n_jobs = 1
self.normalize = False
self.copy_X = True
def fit(self, X, y):
n = np.shape(X)[0]
X = np.reshape(X,(n,1))
y = np.reshape(y,(n,1))
X_poly = self.poly.fit_transform(np.log(X))
LinearRegression.fit(self,X_poly,np.log(y))
return self
def predict(self,X):
X_poly = self.poly.fit_transform(np.log(X))
return np.exp(LinearRegression.predict(self,X_poly))