「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」
线性回归
线性回归(Linear Regression)是一种通过属性的线性组合来进行预测的线性模型,其目的是找到一条直线或者一个平面或者更高维的超平面,使得预测值与真实值之间的误差最小化。
线性回归符号约定
𝑚 代表训练集中样本的数量 𝑛 代表特征的数量 𝑥 代表特征/输入变量 𝑦 代表目标变量/输出变量 𝑥, 𝑦 代表训练集中的样本 (𝑥 (𝑖) , 𝑦 (𝑖) )代表第𝑖个观察样本 ℎ 代表学习算法的解决方案或函数也称为假设(hypothesis)𝑦1 = ℎ(𝑥),代表预测的值。
建筑面积 总层数 楼层 实用面积 房价
143.7 31 10 105 36200
162.2 31 8 118 37000
199.5 10 10 170 42500
96.5 31 13 74 31200
…… …… …… …… ……
线性回归算法流程
graph TD
训练数据 --> 机器学习算法-->模型
特征-->模型-->预测结果
𝑥 和𝑦 的关系 ℎ 𝑥 = 𝑤0 + 𝑤1𝑥1 + 𝑤2𝑥2 + . . . +𝑤𝑛𝑥𝑛 可以设𝑥0 = 1 则:ℎ 𝑥 = 𝑤0𝑥0 + 𝑤1𝑥1 + 𝑤2𝑥2+. . . +𝑤𝑛𝑥𝑛=𝑤𝑇X
损失函数(Loss Function):度量单样本预测的错误程度,损失函数值越小,模型就越好。 常用的损失函数包括:0-1损失函数、平方 损失函数、绝对损失函数、对数损失函数等
代价函数(Cost Function):度量全部样本集的平均误差。常用的代价函数包括均方误差、 均方根误差、平均绝对误差等
目标函数(Object Function)代价函数和正则化函数,最终要优化的函数。
损失函数采用平方和损失: 𝑙(𝑥 (𝑖) ) = 1/2 (ℎ(𝑥 (𝑖) ) − 𝑦 (𝑖) ) 2
要找到一组 𝑤(𝑤0, 𝑤1, 𝑤2, . . . , 𝑤𝑛) , 使得𝐽(𝑤)= 1/2E[m,i=1]( ℎ(𝑥 (𝑖)) − 𝑦(𝑖)) 2 (残差平方和) 最小
最小二乘法
𝐽(𝑤) = 1/2(𝑋𝑤 − 𝑌)2= 1/2(𝑋𝑤 − 𝑌)𝑇 (𝑋𝑤 − Y)
随机梯度下降法
参数更新: 𝑤𝑗= 𝑤𝑗 − 𝛼 (ℎ (𝑥(𝑖)) − 𝑦(𝑖))𝑥𝑗(𝑖)
代码实现
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
path = 'D:\MachineL\regress_data2.csv'
data2 = pd.read_csv(path)
data2.head()
# add ones column
data2 = (data2 - data2.mean()) / data2.std()
data2.insert(0, 'Ones', 1)
data2.head()
alpha = 0.01
iters = 1000
cols = data2.shape[1]
X2 = data2.iloc[:, 0:cols - 1]
y2 = data2.iloc[:, cols - 1:cols]
X2 = np.matrix(X2.values)
y2 = np.matrix(y2.values)
w2 = np.matrix(np.array([0, 0, 0]))
def computeCost(X, y, w):
inner = np.power(((X * w.T) - y), 2) # (m,n) @ (n, 1) -> (n, 1)
# return np.sum(inner) / (2 * len(X))
return np.sum(inner) / (2 * X.shape[0])
def batch_gradientDescent(X, y, w, alpha, iters):
temp = np.matrix(np.zeros(w.shape))
parameters = int(w.ravel().shape[1])
cost = np.zeros(iters)
for i in range(iters):
error = (X * w.T) - y
for j in range(parameters):
term = np.multiply(error, X[:, j])
temp[0, j] = w[0, j] - ((alpha / len(X)) * np.sum(term))
w = temp
cost[i] = computeCost(X, y, w)
return w, cost
g2, cost2 = batch_gradientDescent(X2, y2, w2, alpha, iters)
print(g2)
print(computeCost(X2, y2, g2))
fig, ax = plt.subplots(figsize=(6,4))
ax.plot(np.arange(iters), cost2, 'r')
ax.set_xlabel('迭代次数', fontsize=18)
ax.set_ylabel('代价', rotation=0, fontsize=18)
ax.set_title('误差和训练Epoch数', fontsize=18)
plt.show()
最终误差为0.13......