统计建模之线性回归

数据建模

数据分析中,我们可能涉及复杂的场景,这时候需要对未知的样本数据进行预测,此时我们就需要建立模型完成。

模型概念

模型我们可以理解为一个函数。由训练得来的数据确定函书的参数,当参数确定好之后,然后进行训练,通俗点说的就是预测。通过训练数据,通过不断的进行训练,最终得到一个合适的模型,从而可以对位置的数据进行预测。

监督学习

监督学习是从标记的训练数据来推断一个功能的机器学习任务。训练数据包括一套训练示例。在监督学习中,每个实例都是由一个输入对象(通常为矢量)和一个期望的输出值(也称为监督信号)组成。监督学习算法是分析该训练数据,并产生一个推断的功能,其可以用于映射出新的实例。一个最佳的方案将允许该算法来正确地决定那些看不见的实例的类标签。这就要求学习算法是在一种“合理”的方式从一种从训练数据到看不见的情况下形成。

例如 y = x * 2 可以预测这样很简单,我们可以轻松的预测数据

回归分析

在统计学中,回归分析(regression analysis)指的是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。回归分析按照涉及的变量的多少,分为一元回归和多元回归分析;按照因变量的多少,可分为简单回归分析和多重回归分析;按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析。

自定义变量为一个的时候为一元线性回归,当为多个的时候成为是多元线性回归。

y = x * 5

y = x^2 + 2

y = x^3 + e

拟合

形象的说,拟合就是把平面上一系列的点,用一条光滑的曲线连接起来。因为这条曲线有无数种可能,从而有各种拟合方法。拟合的曲线一般可以用函数表示,根据这个函数的不同有不同的拟合名字。

一元线性回归

一元线性回归是分析只有一个自变量(自变量x和因变量y)线性相关关系的方法。一个经济指标的数值往往受许多因素影响,若其中只有一个因素是主要的,起决定性作用,则可用一元线性回归进行预测分析。

口罩的个数(x) 与价格(y)然后我们就可以算出来最终价格

多元线性回归

在回归分析中,如果有两个或两个以上的自变量,就称为多元回归。事实上,一种现象常常是与多个因素相联系的,由多个自变量的最优组合共同来预测或估计因变量,比只用一个自变量进行预测或估计更有效,更符合实际。因此多元线性回归比一元线性回归的实用意义更大。

y = a1 * x + a2 * x + a3 * x + … + an * x + b

y最终价格 a 为影响因素 多元线性回归可以表示三维平面

写几个代码

Sklearn库

Scikit-learn(sklearn)是机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归(Regression)、降维(Dimensionality Reduction)、分类(Classfication)、聚类(Clustering)等方法。当我们面临机器学习问题时,便可根据下图来选择相应的方法。Sklearn具有以下特点:

简单高效的数据挖掘和数据分析工具
让每个人能够在复杂环境中重复使用
建立NumPy、Scipy、MatPlotLib之上

pip install -U scikit-learn

https://sklearn.apachecn.org/

一元线性回归程序

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

a = np.linspace(-5, 20, 100)

b = 1.35 * a - 2.33

c = np.random.normal(loc=0, scale=0.5, size=a.shape)
b += c
# 将x转换为二维数组,因为fit方法要求x为二维结构。
a = a.reshape(-1, 1)
lr = LinearRegression()
a_train, a_test, b_train, b_test = train_test_split(a, b, test_size=0.25, random_state=0)
lr.fit(a_train, b_train)
print("权重:", lr.coef_)
print("截距:", lr.intercept_)
b_hat = lr.predict(a_test)
print("实际数值:", b_test.ravel()[:10])
print("预测数值:", b_hat[:10])

import matplotlib as mpl
import matplotlib.pyplot as plt

mpl.rcParams["font.family"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False

plt.scatter(a_train, b_train, s=15, label="训练集")
plt.scatter(a_test, b_test, s=15, label="测试集")
plt.plot(a, lr.predict(a), "r-")
plt.legend()
plt.figure(figsize=(15, 5))
plt.plot(b_test, label="真实值", color="r", marker="o")
plt.plot(b_hat, label="预测值", color="g", marker="o")
plt.xlabel("序号")
plt.ylabel("数据数值")
plt.legend()

多元线性回归程序

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_regression

# 生成线性回归的样本数据。
# make_regression 用来生成样本数据,用于回归模型。
# n_samples :生成样本个体的数量。
# n_features : 特征的数量(x的数量)
# coef : 是否返回权重。True返回,False不返回。
# bias : 偏置值。
# random_state : 随机种子。
# noise : 噪声。

X, y, coef = make_regression(n_samples=1000, n_features=2, coef=True, bias=5.5, random_state=0, noise=10)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
print("实际权重", coef)
lr = LinearRegression()
lr.fit(X_train, y_train)
print("模型权重:", lr.coef_)
print("截距:", lr.intercept_)
y_hat = lr.predict(X_test)
print("均方误差:", mean_squared_error(y_test, y_hat))
print("训练集R^2:", lr.score(X_train, y_train))
print("测试集R^2:", lr.score(X_test, y_test))

import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams["font.family"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False
# 用于绘制3D图像。
from mpl_toolkits.mplot3d import Axes3D

# 图形显示方式,默认为嵌入显示。%matplotlib inline
# 弹出框显示。
# %matplotlib qt

max1, max2 = np.max(X, axis=0)
min1, min2 = np.min(X, axis=0)
x1 = np.linspace(min1, max1, 30)
x2 = np.linspace(min2, max2, 30)
# 生成网状结果,用来绘制三维立体图。
# 参数x1与x2是一维数组(向量),将x1沿着行进行扩展,扩展的行数与x2元素的个数相同。
# 将x2沿着列进行扩展,扩展的列数与x1元素的个数相同。返回x1,x2扩展之后的数据X1,X2(扩展之后
# 的数组是二维的)。
# 这样扩展的目的是,依次对位获取X1与X2中的每个元素,就能够构成x1与x2的任意组合。
X1, X2 = np.meshgrid(x1, x2)
fig = plt.figure()
# Axes3D在figure对象上进行绘制。
ax = Axes3D(fig)
# 绘制真实的样本散点图。
ax.scatter(X[:, 0], X[:, 1], y, color="b")
# 绘制预测的平面。
# rstride 行上的增量, cstride 列上的增量。增量越大,网格越宽。
surf = ax.plot_surface(X1, X2, lr.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
        rstride=5, cstride=5, cmap=plt.cm.rainbow, alpha=0.8)
# 在参数指定的对象上显示颜色条。
fig.colorbar(surf)
ax.set_xlabel("X1")
ax.set_ylabel("X2")
ax.set_zlabel("Z")
plt.show()

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值