机器学习——线性回归

213 阅读2分钟

「这是我参与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......

image.png