PRML-1.2.6 贝叶斯曲线拟合

一些记号和回顾

参数 含义
N                                                                                                                                                   样本量                                                                     
x=(x1,...,xN)T
t=(t1,...,tN)T
p(x|μ,σ2)=n=1NN(xn|μ,σ2) xμσ2
w
μ
σ2
β ,β1=σ2
y(x,w)=w0+w1x+w2x2+...+wMxM=j=0Mwjxj
α

虽然我们已经谈到了先验分布p(w|α),但是我们⽬前仍然在进⾏w的点估计(最大似然估计),这并不是贝叶斯观点,在⼀个纯粹的贝叶斯⽅法中,我们应该⾃始⾄终地应⽤概率的加和规则和乘积规则。我们稍后会看到,这需要对所有w值进⾏积分。对于模式识别来说,这种积分是贝叶斯⽅法的核⼼

1.纯贝叶斯派的推导和计算

使(αβ)
p(t|x,x,t)=p(t|x,w)p(w|x,t)dw,1.68,x,,x
p(t|x,w)1.60,p(t|x,w,β)=N(t|y(x,w),β1)
p(w|x,t)1.66p(w|x,t,α,β)p(t|x,w,β)p(w|α),,,1.68

p(t|x,x,t)=Nt|m(x),s2(x)

m(x)=βϕ(x)TSn=1Nϕ(xn)tn
s2(x)=β1+ϕ(x)TSϕ(x)
.......

2.贝叶斯回归代码

点击查看代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures


# %matplotlib inline
# 定义数据集:
def uniform(size):
    x = np.linspace(0, 1, size)
    return x.reshape(-1, 1)


def create_data(size):
    x = uniform(size)
    np.random.seed(42)
    y = sin_fun(x) + np.random.normal(scale=0.15, size=x.shape)
    return x, y


def sin_fun(x):
    return np.sin(2 * np.pi * x)


x_train, y_train = create_data(10)
x_test = uniform(100)
y_test = sin_fun(x_test)

poly = PolynomialFeatures(9)
X_train = poly.fit_transform(x_train)
X_test = poly.fit_transform(x_test)


#### 定义贝叶斯估计方法:


class BayesianRegressor():

    def __init__(self, alpha=1., beta=1.):
        self.alpha = alpha
        self.beta = beta
        self.mean_prev = None
        self.S = None

    def fit(self, X, t):
        S_inv = self.alpha * np.eye(np.size(X, 1)) + self.beta * np.matmul(X.T, X)
        mean_prev = np.linalg.solve(
            S_inv,
            self.beta * np.matmul(X.T, t)
        )
        self.mean_prev = mean_prev
        self.S = np.linalg.inv(S_inv)

    def predict(self, X):
        y = np.matmul(X, self.mean_prev)
        y_var = 1 / self.beta + np.sum(np.matmul(X, self.S) * X, axis=1)
        y_std = np.sqrt(y_var)
        return y, y_std


# 最后使用我们的模型拟合观察数据,然后对新数据进行预测并绘制曲线:

model = BayesianRegressor(alpha=2e-3, beta=2)
y_train = y_train.reshape(10)
model.fit(X_train, y_train)
y, y_std = model.predict(X_test)
fig = plt.figure(figsize=(12, 8))
plt.scatter(x_train, y_train, facecolor="none", edgecolor="b", s=50, label="training data")
plt.plot(x_test, y_test, c="g", label="$\sin(2\pi x)$")
plt.plot(x_test, y, c="r", label="Mean")
plt.fill_between(x_test[:, 0], y - y_std, y + y_std, color="pink", label="std", alpha=0.5)
plt.title("M=9")
plt.legend(loc=2)
plt.show()

posted @   筷点雪糕侠  阅读(538)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示