贝叶斯线性回归——推导及实现

来源:互联网 发布:疯狂美工京东关联促销 编辑:程序博客网 时间:2024/06/05 04:40
  • 推导
  • 算法
  • 代码

理论推导

贝叶斯推断

贝叶斯定理:通过观察到的数据D,把先验概率p(θ)转化为后验概率p(θD)

p(θD)=p(Dθ)p(θ)p(Dθ)p(θ)dθ=p(Dθ)p(θ)p(D)

显然,分母是一个归一化常数,用来确保右侧的后验概率分布是一个合理的概率密度。故有p(θD)p(Dθ)p(θ) 即后验 似然 ×先验 。

贝叶斯线性回归

问题是这样的,不能够一次性接收到整个数据集,而是不断接收到小的数据集Di,i=1,2,...,n,同时由于存储的限制不能存储已经接收到的所有数据集,每次可以处理的数据仅为Di。这就导致不能对所有数据做线性回归,但是可以通过贝叶斯线性回归达到同样的效果。

i 个数据集 Di 中有 m 个训练样本,构成 (X(i),y(i))

p(y(i)X(i),θ)=N(y(i);X(i)θ,I)exp(12(y(i)X(i)θ)T(y(i)X(i)θ))

为了确定模型参数向量 θ 的后验分布
假设其先验分布
p(θ)=N(θ;μ0,Λ0)exp(12(θμ0)TΛ10(θμ0))

其中 μ0,Λ0 分别是先验分布的均值向量和协方差矩阵。通过贝叶斯回归得到的目标为θ 的期望。
模型参数的后验分布:
p(θX(i),y(i))p(y(i)X(i),θ)p(θ)exp(12(y(i)X(i)θ)T(y(i)X(i)θ))exp(12(θμ0)TΛ10(θμ0))exp(12(2y(i)TX(i)θ+θTX(i)TX(i)θ+θTΛ10θ2μT0Λ10θ))

Λi=(X(i)TX(i)+Λ10)1,μi=Λi(X(i)Ty(i)+Λ10μ0)

p(θX(i),y(i))exp(12(θμi)TΛ1i(θμi))

缺点:

1 参数先验分布的不同假设形式,可能会带来计算上的不便。
2 参数先验分布的假设有偏,对于小数据会有较大的影响。

解决方法:

1 参数的先验分布假设为数据分布假设的共轭先验
共轭先验:对于一个给定的概率分布p(xw),能够寻找一个先验 p(w) 能够与似然函数共轭,从而后验分布的函数形式与先验分布相同。

Bern(xμ)=μx(1μ)1xBeta(μa,b)=Γ(a+b)Γ(a)Γ(b)μa1(1μ)b1

N(xm,Λ)N(mμ,Λ)W(ΛW,v)=12π|Λ|exp(12(xm)TΛ1(xm))=12π|Λ|exp(12(mμ)TΛ1(mμ))=B|Λ|vD12exp(12Tr(W1Λ))

2 合理初始化,迭代求解
对于接收到的第1个数据集有:

Λ1=(X(1)TX(1)+Λ10)1,μ1=Λ1(X(1)Ty(1)+Λ10μ0)

p(θX(1),y(1))exp(12(θμ1)TΛ11(θμ1))

这里根据极大似然估计得到的解θ=(X(1)TX(1))1X(1)Ty(1),所以假设Λ10=O, 此时极大似然的解和贝叶斯回归的参数期望一致。

对于接收到的第i 个数据集Di (i>1),将第i1 个数据集计算得到的参数后验作为先验,不断迭代。

Λi=(X(i)TX(i)+Λ1i1)1,μi=Λi(X(i)Ty(i)+Λ1i1μi1)

p(θX(i),y(i))exp(12(θμi)TΛ1i(θμi))

具体算法

输入:D1,D2,D3,...,Dn 其中 Di=(X(i),y(i))
输出: μn
初始化

Λ1=(X(1)TX(1))1μ1=Λ1(X(1)Ty(1))i+=1

while i<=n
Λi=(X(i)TX(i)+Λ1i1)1μi=Λi(X(i)Ty(i)+Λ1i1μi1)i+=1

代码

def BayesLR(path):    la=10    mu=np.mat(np.zeros(3)).T    gama=np.mat(np.eye(3)*la)    for i in range(n):        fileName = path + "%d.csv" % i        x0,y0 = loadDataFromFile(fileName)#从文件中加载数据        X, y = data2Mat(x0,y0)#将数据转换成np.mat的格式        mu0 = mu        gama0 = gama        if i==1:            gama = (X.T*X).I            mu = gama*(X.T*y)        else:            gama = (X.T*X+gama0.I).I            mu = gama*(X.T*y+gama0.I*mu0)    return np.array(mu)
原创粉丝点击