Python实现岭回归

题目:

随机产生100组数据集,每组数据集包含25个点,每个点满足:y=sin(2\pi x)+e,这里x\in \{0.041\times i,i=0,1,...,24\},e是添加的高斯噪声(0, 0.3^2)。在每组数据集上用具有不同\lambda的7阶多项式进行岭回归拟合

import numpy as np 
import matplotlib.pyplot as plt
from tkinter import _flatten

x_arange = 0.041 * np.arange(0, 25, 1) #每组数据的25个点
y_True = np.sin(2 * np.pi * x_arange)  #每个数据点对应的值(没有添加噪声)
y_Noise = np.zeros(y_True.shape)       #添加噪声的值
x_Prec = np.linspace(0, 24*0.041, 100) #画图范围

mu = 0  #噪声的mu值
sigma = 0.3  #噪声的sigma值
Num = 100  #100组数据集
n = 8  #7阶多项式
lamda = [np.exp(1), np.exp(0), np.exp(-5), np.exp(-10)]  #不同的lambda值
phi = np.mat(np.zeros((x_arange.size, n)))  #phi矩阵
x = np.mat(x_arange).T  #输入数据矩阵

#phi矩阵运算
for i_n in range(n):
    for y_n in range(x_arange.size):
        phi[y_n, i_n] = x[y_n, 0] ** i_n

plt.figure(figsize=(15, 10))
index = 221
for i_lamda in lamda:
    plt.subplot(index)
    index += 1
    plt.title("lambda = %f" % i_lamda)
    plt.plot(x_Prec, np.sin(2 * np.pi * x_Prec), color='g')
    for k in range(Num):
        for i in range(x_arange.size):
            y_Noise[i] = y_True[i] + np.random.normal(mu, sigma)
        y = np.mat(y_Noise).T
        #求解w参数
        W = (phi.T * phi + i_lamda*np.eye(n)).I * phi.T * y
    
        ploy = list(_flatten(W.T.tolist()))
        ploy.reverse()
        p = np.poly1d(ploy)
        if k%5==0:  #只画20条曲线
            plt.plot(x_Prec, p(x_Prec), color='r')
plt.show()

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深山里的小白羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值