【机器学习】贝叶斯线性回归代码实现(Python)

1、前言

上一篇贝叶斯线性回归,我们已经从贝叶斯派的角度去推导了线性回归的参数表达式。本文,我们将对线性回归的的预测问题就行Python代码实现。

2、代码实现

为了简单起见,我们用一维的训练数据。并且,在上篇文章中,我们是将截距项写入了w中。但是在本文如果我们也写入进去的话会让一维训练数据变成二维,后面还要构造协方差矩阵。有些麻烦,所以简单起见,我们直接将截距项b去掉吧。

回顾一下上一篇所写,最终我们的预测值是服从 N ( x ∗ T μ k , x ∗ T Σ k x ∗ + σ 2 ) N(x^{*T}\mu_k,x^{*T}\Sigma_kx^*+\sigma^2) N(xTμk,xTΣkx+σ2)的高斯分布,也就是其实 μ k \mu_k μk是随机变量w的均值。我们选取概率最大的可能作为w的值,所以就是 w = μ k w=\mu_k w=μk

然后得到

在这里插入图片描述

可以看到得到的直线是比较拟合数据的。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
class Linear_Regression():
    def __init__(self):
        pass
    def train(self,x,y):
        prior_mean=10 #先验期望,随机初始化为10
        prior_var=1.0 #先验方差,随机初始化为1
        error_var=1.0 #误差项方差,初始化为1
        #计算后验方差
        posterior_var=np.reciprocal(x.T@x*np.power(error_var,-2)-np.power(prior_var,-1))

        #计算后验期望
        posterior_mean=np.power(error_var,-2)*posterior_var.T*x.T@y+posterior_var*prior_var*prior_mean

        #求出直线对应的y值
        predict_mean=x.T*posterior_mean

        #绘图
        plot_figure(x,y,predict_mean)

        #绘图函数
def plot_figure(x,y,mean):
    plt.scatter(x,y,linewidths=2,marker="o")
    plt.plot(x,mean)
    plt.show()
if __name__ == '__main__':
    x=np.arange(0,10,0.5) #生成横坐标数据,从0到10,步长0.5
    line_y=np.arange(0,20) #生成纵坐标,从0到20
    y=line_y.copy() #复制一份
    for i in np.arange(0,y.shape[0]): #给y加上期望为0,方差为1的噪声
        y[i]+=stats.norm.rvs(0,1)
    liner_regression=Linear_Regression() #初始化
    liner_regression.train(x,y) #训练

3、结论

显然,实际上从频率派的角度出发的话也能够很好地得一条较为拟合的直线。如有问题,还望指出。阿里嘎多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值