贝叶斯分析之利用线性回归模型理解并预测数据(三)
这一节主要讲多元线性回归模型
一元线性回归讨论的是一个因变量与一个自变量的关系,但是在很多例子中,模型可能包含多个自变量。在一元线性回归模型中,我们希望一条直线来解释数据,而在多元线性回归模型中,我们希望找到一个维度为 m 的超平面。
以 y=α+0.9∗x1+1.5∗x2y = \alpha + 0.9 * x_1 + 1.5 * x_2y=α+0.9∗x1+1.5∗x2 为例讲解多元线性回归模型
先生成数据(导入的库与第一节基本一样)
np.random.seed(314)
N = 100
alpha_real = 2.5
beta_real = [0.9, 1.5]
eps_real = np.random.normal(0, 0.5, size=N)X = np.array([np.random.normal(i, j, N) for i,j in zip([10, 2], [1, 1.5])])
X_mean = X.mean(axis=1, keepdims=True)
X_centered = X - X_mean
y = alpha_real + np.dot(beta_real, X) + eps_real
def scatter_plot(x, y):plt.figure(figsize=(10, 10))for idx, x_i in enumerate(x):plt.subplot(2, 2, idx+1)plt.scatter(x_i, y)plt.xlabel('$x_{}$'.format(idx), fontsize=16)plt.ylabel('$y$', rotation=0, fontsize=16)plt.subplot(2, 2, idx+2)plt.scatter(x[0], x[1])plt.xlabel('$x_{}$'.format(idx-1), fontsize=16)plt.ylabel('$x_{}$'.format(idx), rotation=0, fontsize=16)scatter_plot(X_centered, y)
plt.savefig('B04958_04_25.png', dpi=300, figsize=(5.5, 5.5))
再建立多元线性回归模型
with pm.Model() as model_mlr:alpha_tmp = pm.Normal('alpha_tmp', mu=0, sd=10)beta = pm.Normal('beta', mu=0, sd=1, shape=2)epsilon = pm.HalfCauchy('epsilon', 5)mu = alpha_tmp + pm.math.dot(beta, X_centered)alpha = pm.Deterministic('alpha', alpha_tmp - pm.math.dot(beta, X_mean)) y_pred = pm.Normal('y_pred', mu=mu, sd=epsilon, observed=y)start = pm.find_MAP()step = pm.NUTS(scaling=start)trace_mlr = pm.sample(5000, step=step, start=start, nchains=1)varnames = ['alpha', 'beta','epsilon']
pm.traceplot(trace_mlr, varnames)
plt.savefig('B04958_04_26.png', dpi=300, figsize=(5.5, 5.5));
这里使用 pm.math.dot() 来定义变量 mu,即线性代数中的点乘(或矩阵相乘)。
现在看一下推断出来的参数的总结
学了怎么多的线性回归模型,模型显然已经不是重点,接下来讲解多元回归模型中的三个重点:
- 混淆变量
- 多重共线性或相关性太高
- 隐藏的有效变量
1. 混淆变量
一个变量 z 与预测变量 x,y 都相关,如果去掉 z 之后能用 x 预测出 y,则称 z 为混淆变量。
看上面的概念阐述可能很难理解,我们从数据上来理解一下
np.random.seed(314)
N = 100
x_1 = np.random.normal(size=N)
# 其实是 x_1 决定着 x2,并且 x_1 决定着 y,所以 x_1 在分析过程中容易被忽略(混淆变量)
x_2 = x_1 + np.random.normal(size=N, scale=1)
y = x_1 + np.random.normal(size=N)
X = np.vstack((x_1, x_2))scatter_plot(X, y)
plt.savefig('B04958_04_27.png', dpi=300, figsize=(5.5, 5.5));
建立多元线性回归模型,对各个系数进行求解
可以看到 β1\beta_1β1 接近 0,这意味着 x2x_2x2 对 yyy 来说几乎没有作用(即多余的变量)。
2. 多重共线性或相关性太高
修改上述代码给 x1x_1x1 增加一个很小的扰动,因而两个变量可以看做是一样的,即 x1x_1x1 与 x2x_2x2 之间的关系是一条斜率接近于 1 的直线。
x_2 = x_1 + np.random.normal(size=N, scale=0.01)
根据 β\betaβ 系数画出2D的核密度估计图
3. 隐藏的有效变量
每个单独变量 x 不足以预测 y,如果将 x 组合在一起后就可以预测 y。因变量之间具有相关性,每个因变量都有反作用,因而忽略其中任何一个都会造成对变量影响力的低估>
先生成模拟数据,注意观察 x_0 与 x_1 的联系
np.random.seed(314)
N = 100
r = 0.8
x_0 = np.random.normal(size=N)
x_1 = np.random.normal(loc=x_0 * r, scale=(1 - r ** 2) ** 0.5)
y = np.random.normal(loc=x_0 - x_1)
X = np.vstack((x_0, x_1))scatter_plot(X, y)
plt.savefig('B04958_04_31.png', dpi=300, figsize=(5.5, 5.5));
再建立模型并求解
with pm.Model() as model_ma:alpha = pm.Normal('alpha', mu=0, sd=10)beta = pm.Normal('beta', mu=0, sd=10, shape=2)#beta = pm.Normal('beta', mu=0, sd=10)epsilon = pm.HalfCauchy('epsilon', 5)mu = alpha + pm.math.dot(beta, X)#mu = alpha + beta * X[0]y_pred = pm.Normal('y_pred', mu=mu, sd=epsilon, observed=y)start = pm.find_MAP()step = pm.NUTS(scaling=start)trace_ma = pm.sample(5000, step=step, start=start, nchains=1)pm.traceplot(trace_ma)
plt.savefig('B04958_04_32.png', dpi=300, figsize=(5.5, 5.5));
我们根据结果发现,beta 的值接近 1 和 -1,即 x1x_1x1 与 yyy 正相关,而 x2x_2x2 与 yyy 负相关。
项目源码:https://github.com/dhuQChen/BayesianAnalysis
贝叶斯分析之利用线性回归模型理解并预测数据(三)相关推荐
- R语言使用lm函数拟合多元线性回归模型、假定预测变量没有交互作用(Multiple linear regression)
R语言使用lm函数拟合多元线性回归模型.假定预测变量没有交互作用(Multiple linear regression) 目录
- Python建立线性回归模型进行房价预测
Python建立线性回归模型进行房价预测 前期准备 多因子房价预测 实战流程 1.数据加载 2.数据可视化 3.数据预处理 4.模型建立与训练 5.模型预测 6.模型评估 7.房价预测 数据与代码 前 ...
- R语言使用lm函数拟合多元线性回归模型、假定预测变量之间有交互作用、R语言使用effects包的effect函数查看交互作用对于回归模型预测响应变量的影响
R语言使用lm函数拟合多元线性回归模型.假定预测变量之间有交互作用.R语言使用effects包的effect函数查看交互作用对于回归模型预测响应变量的影响 目录
- Tensorflow 2.x(keras)源码详解之第九章:模型训练和预测的三种方法(fittf.GradientTapetrain_steptf.data)
大家好,我是爱编程的喵喵.双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中.从事机器学习以及相关的前后端开发工作.曾在阿里云.科大讯飞.CCF等比赛获得多次Top名次.现 ...
- R语言使用glm函数构建泊松对数线性回归模型处理三维列联表数据构建饱和模型、使用summary函数获取模型汇总统计信息
R语言使用glm函数构建泊松对数线性回归模型处理三维列联表数据构建饱和模型.使用summary函数获取模型汇总统计信息 目录
- R语言使用glm函数构建泊松对数线性回归模型处理三维列联表数据构建饱和模型、使用step函数基于AIC指标实现逐步回归筛选最佳模型、使用summary函数查看简单模型的汇总统计信息
R语言使用glm函数构建泊松对数线性回归模型处理三维列联表数据构建饱和模型.使用step函数基于AIC指标实现逐步回归筛选最佳模型.使用summary函数查看简单模型的汇总统计信息 目录
- Python中利用LSTM模型进行时间序列预测分析
时间序列模型 时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征.这是一类相对比较复杂的预测建模问题,和回归分析模型的预测不同,时间序列模型是依赖于事件发生的先后顺 ...
- 利用线性回归算法取得一段数据变化的趋势(斜率)
最近发现线性回归算法真是个好东西,通过它可以来分析过去一段数据的变化趋势.斜率,本贴分享亲测可用代码块,供需要的小伙伴参考. 1.C语言模块代码: /************************* ...
- 选择退化特征时,利用单调性、鲁棒性、预测性三指标选择(附matlab代码)
为了对RUL预测获得更有效和高效的退化特征选择,提出了三个良度指标/内在满足指标,如单调性.鲁棒性和预测性.单调性度量评估特征的增加或减少趋势信息,鲁棒性复制特征对异常值的容忍度.鲁棒性度量包括特征对 ...
- 一元线性回归模型预测双十一销售额
又是一年一度"剁手节"有人说感到今年的双十一冷清了许多,很多人都很好奇今年双十一会产生多少交易额?SPSAU这里打算科学预测一下今年的天猫"双十一"的销售额. ...
最新文章
- 如安装flashplayer旧版本
- Java and Python: a perfect couple - Developer.com
- 3.7 PPP协议和HDLC协议
- C++ operator两种用法【转】
- 软件测试真实项目_企业中软件测试的项目流程
- Hdu 1029 Ignatius and the Princess IV
- jmeter脚本结合ant执行测试用例并生成测试报告
- 剑指Offer #11 二进制中1的个数(想不到的骚操作)
- java继承中的方法覆盖问题
- python爬虫之路--准备环境
- 英特尔CEO:将在行业整合背景下大力收购半导体企业
- python 返回列表中的偶数
- java openfileoutput_java-openFileOutput在单例类中不能正常工作-想...
- 为什么mfc要注册WNDCLASS样式
- 360搜索引擎能否给苦逼的站长们带来希望?
- wireshark数据包分析 中职网络安全
- 如何安排自己大学阶段的学习才能成为一名优秀的 Quant?
- 水果店开业如何做开店活动,新水果店开业需要做哪些促销活动
- 肺肠轴——看不见的Crosstalk
- 钱多多的互联网金融面试经验谈