线性回归的简单实现

1.1 线性回归中的预测模型

1. 预测模型

 \widehat{y} = \theta_0x_0 + \theta_1x_1 + \theta_2x_2 + \dots + \theta_nx_n

 其中,x_0 = 1,如果我们把x_0...表示为向量形式: X = [x_0, x_1, \dots, x_n]^T

\theta_0...表示为 \theta = [\theta_0,\theta_1,\dots,\theta_n] 。一维向量表示为 列向量,表示权重, \theta_0表示偏置。

故上式中的公式可以向量化表示:

2. 预测模型向量化表示:

\widehat{y} = h_\theta(X) =X^T \cdot \theta

 这里 \theta是要求解的未知数,X是实例的特征向量。

3.线性回归模型的MSE成本函数:

MSE(X, h_\theta) = \frac{1}{m} \sum _{i=1} ^m(X^T \cdot \theta^{(i))}-y^{(i)})^2

 由最小二乘法可以推导出 标准方程为:

\widehat{\theta} = (X^T \cdot X)^{-1} \cdot X^T \cdot y

 由标准方程可以求出使得成本函数最小的\theta的值。

 举例:假如 X  向量只有 x0 和 x1 两列值,如下图所示:

特征向量X,假设有2个数,x0, x1, 一共有 100行这样的数。使用NumPy的random 生成随机的数:

# 1.随机生成 x0, x1, x2 ... xn 用 矩阵X 表示:实例的特征向量
# X 表示 标准方程里的x1.
X = 2 * np.random.rand(100, 1)  # np.random : 随机生成[0, 1)的小数; .rand(m, n) : m行n列的矩阵
# .randn() : 表示 从“标准正态”分布返回一个(或多个)样本。 x值在 -1.98 到 1.98之间 概率为 95%

使用 公式:y = 4 + 3x_0 +高斯噪声 生成对应的函数值,代码如下:

# .randn() : 表示 从“标准正态”分布返回一个(或多个)样本。 x值在 -1.98 到 1.98之间 概率为 95%
# y = 4 + 3x0 + 高斯噪声
y = 4 + 3 * X + np.random.randn(100, 1)

其中高斯噪声符合正态分布。

生成向量 X^T

# 这里的 X_b 是 标准方程里面的 X
X_b = np.c_[np.ones((100, 1)), X]  # 此时 X_b 中的元素有:x0, x1;x0 全为1
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print(theta_best)

把生成的数据填写到Excel表格,便于理解,图如下:

代码为:

# 实现功能:把生成的 X_b 的数据 写入到 Excel表格中:
path = r'datasets\X_b.xlsx'  # 相对路径
# 1.把X_b ndarray类型数据 转为 pandas的DataFrame对象
X_b_frame = pd.DataFrame(X_b)
# 2.把 X_b_frame 保存到 Excel 表格中
X_b_frame.to_excel(path, 'Sheet1')

这里,第一列为索引,第二列 为 x0,全为1, 第三列 为 x1 (随机生成的[0, 2))

1.2 开始预测

绘制模型的预测结果:
# 开始预测:X_new 表示预测数据中 x1 的值
X_new = np.array([[0],
                  [2]])
X_new_b = np.c_[np.ones((2, 1)), X_new]
# 使用 y = X * theta 的 转秩
y_predict = X_new_b.dot(theta_best)

# 绘制模型的预测结果:
plt.plot(X_new, y_predict, 'r-')
plt.plot(X, y, 'b.')
plt.axis([0,2, 0,15])  # 设置 x 轴 和 y 轴 的大小
plt.show()

 结果如下:

 全部代码如下:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 1.随机生成 x0, x1, x2 ... xn 用 矩阵X 表示:实例的特征向量
# X 表示 标准方程里的x1.
X = 2 * np.random.rand(100, 1)  # np.random : 随机生成[0, 1)的小数; .rand(m, n) : m行n列的矩阵
# .randn() : 表示 从“标准正态”分布返回一个(或多个)样本。 x值在 -1.98 到 1.98之间 概率为 95%
# y = 4 + 3x0 + 高斯噪声
y = 4 + 3 * X + np.random.randn(100, 1)
# 这里的 X_b 是 标准方程里面的 X
X_b = np.c_[np.ones((100, 1)), X]  # 此时 X_b 中的元素有:x0, x1;x0 全为1
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print(theta_best)
# 实现功能:把生成的 X_b 的数据 写入到 Excel表格中:
path = r'datasets\X_b.xlsx'  # 相对路径
# 1.把X_b ndarray类型数据 转为 pandas的DataFrame对象
X_b_frame = pd.DataFrame(X_b)
# writer = pd.ExcelWriter(X_b_frame)
# 2.把 X_b_frame 保存到 Excel 表格中
X_b_frame.to_excel(path, 'Sheet1')
# writer.save()
# 画出 (X, y) 即(x1, y真实值) 的散点图
# plt.plot(X, y, 'b.')
# plt.show()

# 开始预测:X_new 表示预测数据中 x1 的值
X_new = np.array([[0],
                  [2]])
X_new_b = np.c_[np.ones((2, 1)), X_new]
# 使用 y = X * theta 的 转秩
y_predict = X_new_b.dot(theta_best)

# 绘制模型的预测结果:
plt.plot(X_new, y_predict, 'r-')
plt.plot(X, y, 'b.')
plt.axis([0,2, 0,15])  # 设置 x 轴 和 y 轴 的大小
plt.show()

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值