import numpy as np
class PolynomialFeaatureData:
'''
生成特征多项式数据
'''
def __init__(self,x,degree,with_bias=False):
'''
参数初始化
x 采样数据,向量形式
degree 多项式最高阶次
with_bias 是否需要偏置项
'''
self.x=np.asarray(x)
self.degree=degree
self.with_bias=with_bias
if with_bias:
self.data=np.zeros((len(x),degree+1))
else:
self.data=zp.zeros((len(x),degree))
def fit_transform(self):
'''
构造特征数据
----------
self
Returns
-------
'''
if self.with_bias:
self.data[:,0]=np.ones(len(self.x))
self.data[:,1]=self.x.reshape(-1)
for i in range(2,self.degree+1):
self.data[:,i]=(self.x**i).reshape(-1)
else:
self.data[:, 0] = self.reshape(-1)
for i in range(1, self.degree):
self.data[:, i] = (self.x ** (i+1)).reshape(-1)
return self.data
if __name__=='__main__':
x=np.random.randn(5)
print(x)
feat_obj=PolynomialFeaatureData(x,5,with_bias=True)
data=feat_obj.fit_transform()
print(data)
import numpy as np
from MCL.polynomial_features import PolynomialFeaatureData
class PolynomialRegressionCurve:
'''
多项曲线拟合,采用线性回归i方法,且是闭式解
'''
def __init__(self,X,y,fit_intercept=False):
'''
参数的初始化
X 训练数据,样本数据,矩阵形式
y 目标值,向量
fit_intercept 是否拟合截距,偏置项
'''
self.X,self.y=np.asarray(X),np.asarray(y)
self.fit_intercept = fit_intercept
self.theta = None
def fit(self):
'''
采用线性回归闭式解求参数
pinv()伪逆
'''
xtx=np.dot(self.X.T,self.X)+0.01*np.eye(self.X.shape[1])
self.theta=np.linalg.inv(xtx).dot(self.X.T).dot(self.y)
return self.theta
def predict(self,x_test):
'''
模型预测
x_test 测试样本
Returns
'''
x_test = x_test[:,np.newais]
if x_test.shape[1] != self.X.shape[1]:
if self.fit_intercept:
feat_obj=PolynomialFeaatureData(x_test,self.X.shape[1]-1,width_bias=True)
x_test=feat_obj.fit_transform()
else:
feat_obj = PolynomialFeaatureData(x_test, self.X.shape[1])
x_test = feat_obj.fit_transform()
if self.theta is None:
self.fit()
y_pred=np.dot(self.theta,x_test.T)
return y_pred.reshape(-1)
import numpy as np
import matplotlib.pyplot as plt
from MCL.polynomial_features import PolynomialFeaatureData
from MCL.polynomial_regression_curve import PolynomialRegressionCurve
objective_function = lambda x:3*np.exp(-1)*np.sin(x)
np.random.seed(0)
n=10
raw_x=np.linspace(0,6,n)
raw_y= objective_function(raw_x)+np.random.randn(n)
degrees = [1,3,5,7,10,12]
plt.figure(figsize=(15,7))
for i,degree in enumerate(degrees):
feat_data=PolynomialFeaatureData(raw_x,degree,with_bias=True)
X_sample=feat_data.fit_transform()
poly_obj=PolynomialRegressionCurve(X_sample,raw_y,fit_intercept=True)
theta=poly_obj.fit()
print('degree:%d,theta is '% degree,theta)