拟合凑字数

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:
            #print('hello')
            self.data[:,0]=np.ones(len(self.x))
            self.data[:,1]=self.x.reshape(-1)
            #print('self.x.reshape(-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]) #添加正则项,保证矩阵是正定可逆的  X的特征数,维度的第二维
        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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值