原文链接:http://tecdat.cn/?p=11664 

 我想钻研如何应用pymc3在贝叶斯框架内进行线性回归。依据从数据中学到的常识进行推断。 

 贝叶斯规定是什么? 

实质上,咱们必须将曾经晓得的常识与世界上的事实相结合。

这里有一个例子。

假如存在这种常见疾病,每10,000人中就有1人随机感化这种疾病。换句话说,有0.01%的机会患上这种疾病。 侥幸的是,有一项测试能够99%的正确辨认出患有这种疾病的人,如果没有这种疾病,它也能够正确地说出您99%没有患这种疾病。您加入了测试,后果为阳性。您有多少几率理论患上该病?

好吧,让咱们从逻辑上考虑一下。咱们晓得,每10,000人中就有1人患此病。假如有10,000人。他们中的9,999人没有疾病,但其中1%的人会失去阳性后果。因而,即便只有1人理论患有这种疾病,也有约101人取得了阳性后果。这意味着即便后果为阳性,您也只有101分的几率理论患上该病(或大概1%的几率)。

 数学形容  :

看起来很简略。实际上,这很简略。该公式仅须要一些概率分布的常识。然而实际上,左边的分母通常意味着咱们将要计算很多真正的计算重积分。因而,贝叶斯统计被放弃了很多年。从某种意义上讲,它自然而然地脱离了概率论。如果咱们只有善于计算大量数字的货色,那么这类问题就能够解决。

计算机的确十分快地进行计算贝叶斯回归。

代码

这是进行贝叶斯回归所需的常识。通常,咱们想到这样的回归:

e是正态分布的误差。 

 因而,咱们假如:

与先验:

因而,如果咱们领有X和Y的数据,则能够进行贝叶斯线性回归。 

 代码 

咱们要应用的数据集是《  住房考察: 2013年住房累赘能力数据 》数据集。 

咱们感兴趣的是住房累赘如何随着年龄而变动。AGE1蕴含户主的年龄。BURDEN是一个变量,它通知咱们住房费用绝对于支出有多大。为简略起见,咱们仅关注这两个变量。咱们想晓得的是,随着年龄的增长,住房累赘会变得更容易吗?特地是,咱们想晓得斜率系数是否为负,并且因为咱们处于贝叶斯框架中,因而该概率为负的概率是多少?

因而,咱们将导入所需的库和数据。进行一些数据清理。

df=pd.read_csv('2013n.txt',sep=',')df=df\[df\['BURDEN'\]>0\]df=df\[df\['AGE1'\]>0\]

当初,让咱们构建下面探讨的模型。让咱们做一个散点图,看看数据是什么样子。

plt.scatter(df\['AGE1'\],df\['BURDEN'\])plt.show()

后果如下:

住房累赘很容易超过支出的10倍。

这是构建和运行模型的代码:

pm.traceplot(trace)plt.show()

**看起来与咱们下面的模型齐全一样,不同之处在于咱们还有一个正态分布的截距beta。当初咱们的模型曾经训练好了,咱们能够持续做一些推论工作。
**

实现运行后,会看到相似以下内容:

能够看到,咱们有斜率和截距的后验散布以及回归的标准偏差。

**住房累赘会随着年龄的增长而缩小吗?
**

是的。随着人们的建设,他们的住房老本将绝对于支出降落。这将等于年龄变量的负斜率系数。运行以下代码,则能够找出斜率系数为负的确切概率。

print(np.mean(\[1 if obj<0 else 0 for obj in trace\['x'\]\]))

 该系数为负的概率约为13.8%。