1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法

首页 » 算法 » 正文

一、函数形式化表示

1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法

二、梯度下降算法

1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法
当目标函数是凸函数时,梯度下降法是全局最优解。

梯度下降法代码实现

迭代次数控制

# alpha步长,过小—迭代步数过多,容易局部收敛;过大时,容易在最低点周围来回振荡
import numpy as np
import matplotlib.pyplot as plt

# x、y坐标
x = np.linspace(-6, 4, 100)
y = x ** 2 + 2 * x + 5
# 绘图
fig, ax = plt.subplots()
ax.plot(x, y, 'r-', lw=3)
plt.show()

# 初始化初始值x、步长alpha,迭代次数(可以通过设置精度来控制迭代次数)
x = 3
alpha = 0.8
iternum = 100
for i in range(iternum):
    x = x - alpha * (2 * x + 2)
    y = x ** 2 + 2 * x + 5

print("迭代%d次后,最小值点为%d,对应的极小值为%d" % (iternum, x, y))
# 迭代100次后,最小值点为-1,对应的极小值为4

精度控制

# alpha步长,过小—迭代步数过多,容易局部收敛;过大时,容易在最低点周围来回振荡
import numpy as np
import matplotlib.pyplot as plt

# x、y坐标
x = np.linspace(-6, 4, 100)
y = x ** 2 + 2 * x + 5
# 绘图
fig, ax = plt.subplots()
ax.plot(x, y, 'r-', lw=3)
plt.show()

# 初始化初始值x、步长alpha,迭代次数(可以通过设置精度来控制迭代次数)
x = 3
alpha = 0.8
eta = 0
while np.abs(2 * x + 2) > eta:
    x = x - alpha * (2 * x + 2)
    y = x ** 2 + 2 * x + 5

print("最小值点为%d,对应的极小值为%d" % (x, y))
# 最小值点为-1,对应的极小值为4

使用梯度下降法求解线性回归问题

1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法

import numpy as np
import matplotlib.pyplot as plt

# 1.加载数据
def loaddata(filename):
    data = np.loadtxt(filename, delimiter=',')
    n = data.shape[1] - 1  # 特征数
    X = data[:, 0:n]
    y = data[:, n].reshape(-1, 1)
    return X, y


# 2.标准化——减小异常点的影响
# 标准化即将每一个数据减去该列的平均值,再除以该列的方差
def featureNormized(x):
    avg = np.average(x, axis=0)
    std = np.std(x, axis=0, ddof=-1)  # ddof=-1时表示求方差时除的是n-1
    x = (x - avg) / std
    return x, avg, std


# 3.代价函数
def computeCost(X, y, theta):
    m = X.shape[0]  # 数据量
    # np.dot()表示一维向量点乘
    return np.sum(np.power(np.dot(X, theta) - y, 2)) / (2 * m)


# 4.梯度下降法求导
def gradientDescent(X, y, theta, iternum, alpha):
    # 构建x0=1
    c = np.ones(X.shape[0]).transpose()
    X = np.insert(X, 0, values=c, axis=1)
    m = X.shape[0]  # 数据量
    n = X.shape[1]  # 特征数
    # 储存代价值
    costs = np.zeros(iternum)
    # 求导
    for i in range(iternum):
        for j in range(n):
            theta[j] = theta[j] + np.sum((y - np.dot(X, theta)) * X[:, j].reshape(-1, 1)) * alpha / m
        costs[i] = computeCost(X, y, theta)
    return theta, costs


# 5.预测值
def predict(x):
    x = (x - avg) / std
    c = np.ones(x.shape[0]).transpose()
    X = np.insert(x, 0, values=c, axis=1)
    return np.dot(X, theta)


# 6.模型评价-mse
def mse(y_true, y_test):
    return np.sum(np.power(y_true - y_test, 2)) / len(y_true)


if __name__ == '__main__':
    filename = 'data/data1.txt'
    # 加载数据
    X_orign, y = loaddata(filename)
    # 标准化
    X, avg, std = featureNormized(X_orign)
    theta = np.zeros(X.shape[1] + 1).reshape(-1, 1)
    iternum = 100
    alpha = 0.8

    # 梯度下降求解
    theta, costs = gradientDescent(X, y, theta, iternum, alpha)
    # 预测值
    print(predict([[5.734]]))

    # 模型评价
    model_pred = predict(X_orign)
    print(model_pred)
    print('mse=', mse(y, model_pred))

	  # 画图
    ax1 = plt.subplot(121)
    ax2 = plt.subplot(122)

    # 代价函数变化图
    x_ = np.linspace(1,iternum,iternum)
    ax1.plot(x_,costs)

    # 拟合图
    ax2.scatter(X,y)
    h_theta = theta[0]+theta[1]*X
    ax2.plot(X,h_theta)
    plt.show()

1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法

梯度下降算法变形

1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法

三、模型评价指标

1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法
1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法

代码实现

import numpy as np


# mse
def mse(y_true, y_pred):
    return np.sum(np.power(y_true - y_pred, 2)) / (len(y_true))


# rmse
def rmse(y_true, y_pred):
    return np.sqrt(np.sum(np.power(y_true - y_pred, 2)) / (len(y_true)))


# mae
def mae(y_true, y_pred):
    return np.sum(np.abs(y_true - y_pred)) / (len(y_true))


# mape
def mape(y_true, y_pred):
    return (100 / len(y_true) * np.sum(np.abs((y_true - y_pred) / y_true)))


if __name__ == '__main__':
    y_true = np.array([1, 2, 3, 4, 5]).reshape(-1, 1)
    y_pred = np.array([1.1, 2.1, 3.2, 3.9, 5]).reshape(-1, 1)
    print('mse = %.4f' % mse(y_true, y_pred))
    print('rmse = %.4f' % rmse(y_true, y_pred))
    print('mae = %.4f' % mae(y_true, y_pred))
    print('mape = %.4f' % mape(y_true, y_pred))

mse = 0.0140
rmse = 0.1183
mae = 0.1000
mape = 4.8333

四、岭回归

1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法

岭回归代码实现

# 岭回归
import numpy as np
import matplotlib.pyplot as plt


# 1.加载数据
def loaddata(filename):
    data = np.loadtxt(filename, delimiter=',')
    n = data.shape[1] - 1
    X = data[:, 0:n]
    y = data[:, n].reshape(-1, 1)
    return X, y


# 2.标准化
def featureNormized(x):
    avg = np.average(x, axis=0)
    # 参数ddof=1时,表示求方差时除的是n-1
    std = np.std(x, axis=0, ddof=1)
    x = (x - avg) / std
    return x, avg, std


# 3.代价函数
def computeCosts(X, y, lamda, theta):
    m = X.shape[0]
    return np.sum(np.power((np.dot(X, theta) - y), 2)) / (2 * m) + lamda * np.sum(np.power(theta, 2))


# 4.梯度下降法求解
def gradientDescent(X, y, alpha, iternum, lamda, theta):
    # 构造x0=1那一列
    c = np.ones(X.shape[0]).transpose()
    X = np.insert(X, 0, values=c, axis=1)
    m = X.shape[0]  # 数据量
    n = X.shape[1]  # 特征量
    costs = np.ones(iternum)
    for i in range(iternum):
        for j in range(n):
            theta[j] = theta[j] + np.sum((y - np.dot(X, theta)) * X[:, j].reshape(-1, 1)) * (alpha / m) - 2 * lamda * /
                       theta[j]
        costs[i] = computeCosts(X, y, lamda, theta)
    return costs, theta


# 5.预测
def predict(x):
    x = (x - avg) / std
    c = np.ones(x.shape[0]).transpose()
    x = np.insert(x, 0, values=c, axis=1)
    return np.dot(x, theta)


# 6.模型评价
def rmse(y_true, y_pred):
    return np.sqrt(np.sum(np.power((y_true - y_pred), 2)) / len(y_true))


if __name__ == '__main__':
    filename = '../data/data1.txt'
    # 加载数据
    X_Orign, y = loaddata(filename)
    # 标准化
    X, avg, std = featureNormized(X_Orign)
    # 参数
    theta = np.zeros(X.shape[1] + 1).reshape(-1, 1)
    alpha = 0.01
    iternum = 400
    lamda = 0.001
    # 梯度下降法求解
    costs, theta = gradientDescent(X, y, alpha, iternum, lamda, theta)
    print(costs)
    # 预测
    print(predict([[5]]))

    # 模型评价
    y_pred = predict(X_Orign)
    print('rmse = %.4f' % rmse(y, y_pred))

    # 画图
    ax1 = plt.subplot(121)
    ax2 = plt.subplot(122)
    # 代价函数变化图
    x_ = np.linspace(1, iternum, iternum)
    ax1.plot(x_, costs, 'r-', lw=3)

    # 拟合图
    ax2.scatter(X, y)
    h_theta = theta[0] + theta[1] * X
    ax2.plot(X, h_theta, 'r-', lw=3)
    plt.show()


[[1.71717285]]
rmse = 3.2595

1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法

五、LASSO回归

1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法
1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法

LASSO回归代码实现

# LASSO回归
import numpy as np
import matplotlib.pyplot as plt


# 1.加载数据
def loaddata(filename):
    data = np.loadtxt(filename, delimiter=',')
    n = data.shape[1] - 1
    X = data[:, 0:n]
    y = data[:, n].reshape(-1, 1)
    return X, y


# 2.标准化
def featureNorimized(x):
    avg = np.average(x, axis=0)
    std = np.std(x, axis=0, ddof=1)
    x = (x - avg) / std
    return x, avg, std


# 3.代价函数
def computerCosts(X, y, lamda, theta):
    m = X.shape[0]
    return np.sum(np.power((np.dot(X, theta) - y), 2)) / (2 * m) + lamda * np.sum(np.abs(theta))


# 4.梯度下降求解函数
def gradientDescent(X, y, iternum, lamda):
    m, n = X.shape
    theta = np.matrix(np.zeros((n, 1)))
    costs = np.zeros(iternum)
    # 循环
    for it in range(iternum):
        for k in range(n):  # n个特征
            # 计算z_k和p_k
            z_k = np.sum(np.power(X[:, k], 2))
            p_k = 0
            for i in range(m):
                p_k += X[i, k] * (y[i, 0] - np.sum([X[i, j] * theta[j, 0] for j in range(n) if j != k]))
            # 根据p_k的不同取值进行计算
            if p_k < -lamda / 2:
                w_k = (p_k + lamda / 2) / z_k
            elif p_k > lamda / 2:
                w_k = (p_k - lamda / 2) / z_k
            else:
                w_k = 0
            theta[k, 0] = w_k
        costs[it] = computerCosts(X, y, lamda, theta)
    return theta, costs


# 5.预测
def predict(x):
    x = (x - avg) / std
    c = np.ones(x.shape[0]).transpose()
    x = np.insert(x,0,values=c,axis=1)
    return np.dot(x, theta)


if __name__ == '__main__':
    filename = '../data/data1.txt'
    iternum = 400
    # 加载数据
    X_orgin, y = loaddata(filename)
    # 标准化
    X, avg, std = featureNorimized(X_orgin)
    # 插入一列数值为1的数据
    X_1 = np.insert(X, 0, values=1, axis=1)
    # 梯度下降法
    theta, costs = gradientDescent(X_1, y, iternum, lamda=0.01)
    print(theta)

    # 预测
    print(predict([[5.55]]))

    # 画图
    ax1 = plt.subplot(121)
    ax2 = plt.subplot(122)
    # 画损失变化图
    x_ = np.linspace(1, iternum, iternum)
    ax1.plot(x_, costs, 'r-')

    # 画拟合图
    ax2.scatter(X, y)
    h_theta = theta[0, 0] + theta[1, 0] * X
    ax2.plot(X, h_theta, 'r-')
    plt.show()

[[5.83908351]
 [4.61684916]]
[[2.72553942]]

1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法

六、Elastic Net回归

1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法
Elastic Net是一种使用L1和L2作为正则化矩阵的线性回归模型。当多个特征和另一个特征相关的时候,弹性网络就非常好用。LASSO倾向于随机选择其中一个特征,而弹性网络更倾向于选择两个。
ElasticNetCV可以通过交叉验证来设置参数alpha和l1_ratio,l1_ratio可以用来调节L1和L2的凸组合。

七、最小二乘法求线性回归

1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法

最小二乘法代码实现

# 最小二乘法
import numpy as np
import matplotlib.pyplot as plt


# 1.加载数据
def loaddata(filename):
    data = np.loadtxt(filename, delimiter=',')
    n = data.shape[1] - 1
    X = data[:, 0:n]
    y = data[:, n].reshape(-1, 1)
    return X, y


# 2.标准化
def featureNorimized(x):
    avg = np.average(x, axis=0)
    std = np.std(x, axis=0, ddof=1)
    x = (x - avg) / std
    return x, avg, std


# 3.目标函数
def computerCosts(X, y, theta):
    return np.sum(np.power(np.dot(X, theta) - y, 2)) / 2


# 4.最下二乘法求解——逆矩阵存在时
def LeastSquaresMethod(X, y):
    theta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
    costs = computerCosts(X, y, theta)
    return theta, costs


if __name__ == '__main__':
    filename = '../data/data1.txt'
    # 加载数据
    X_orgin, y = loaddata(filename)
    # 构造x0=1的列
    X_1 = np.insert(X_orgin, 0, values=1, axis=1)
    # 最小二乘法求解线性回归
    # 逆矩阵存在时
    theta, costs = LeastSquaresMethod(X_1, y)
    print(theta)

    # 画图——散点图与直线图
    fig, ax = plt.subplots()
    ax.scatter(X_orgin, y)
    h_theta = theta[0] + theta[1] * X_orgin
    ax.plot(X_orgin, h_theta, 'r-', lw=2)
    plt.show()

[[-3.89578088]
 [ 1.19303364]]

1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法

未经允许不得转载:作者:1147-柳同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法》 发布于2021-01-05

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录