Python-sklearn-LinearRegression(2)

本文详细介绍了手动实现线性回归(包括单特征和多特征)的过程,以及使用scikit-learn库的LinearRegression进行自动实现。通过实例展示了从初始化参数到训练过程,并比较了两者的结果。
摘要由CSDN通过智能技术生成

线性回归LinearRegression假设函数(Multiple Features):

h(x) = w_{1} * x_{1} + w_{2} * x_{2} + ... + w_{n} * x_{n} + b = w^{T} * x + b

损失函数(平方差损失函数MSE):

J(w_{1},w_{2},...,w_{n}, b) = \frac{1}{2m}\sum_{i=1}^{m}(h(x^{i}) - y^{i})^{2}

优化器(梯度下降Gradient descent):

w_{j} := w_{j} - \alpha \frac{\partial }{\partial w_{j}}J(w, b) = w_{j} - \alpha \frac{1}{m}\sum_{i=1}^{m}(h(x^{i}) - y^{i})x_{j}^{i}

b: = b - \alpha \frac{\partial }{\partial b}J(w, b) = b - \alpha \frac{1}{m}\sum_{i=1}^{m}(h(x^{i}) - y^{i})

"""
@Title: linear_regression_with_multiple_features
@Time: 2024/2/22
@Author: Michael Jie
"""

import random

import numpy as np
from sklearn.linear_model import LinearRegression

print("----------手动实现LinearRegression----------")
# 数据集,h = 1.5 * x1 + 2.5 * x2 + 1.7
x1 = [2, 4.3, 2.7, 9, 0.5, 17, 26, 14.9, 20, 24.8]
x2 = [36.7, 11, 72.8, 21.3, 53.8, 91.1, 43, 64.4, 22, 56.9]
x = []
for inx, item in enumerate(x1):
    x.append([item, x2[inx]])
y = [96.45, 35.65, 187.75, 68.45, 136.95, 254.95, 148.2, 185.05, 86.7, 181.15]

# 初始化训练参数
w1, w2, b = random.random(), random.random(), random.random()
print("初始化训练参数为:({w1}, {w2}, {b})".format(w1=w1, w2=w2, b=b))

x = np.array(x)
y = np.array(y)
m = len(x)

# 训练精度
epsilon = 1e-5
# 学习率
alpha = 67e-5
# 最大训练轮次
max_iter = 50000

num = 0
while True:
    # 假设函数
    h = w1 * x.T[0] + w2 * x.T[1] + b
    # 损失
    j = 1 / (2 * m) * np.sum((h - y) ** 2)
    if j < epsilon or num > max_iter:
        break
    # 梯度下降
    w1 -= alpha * (1 / m * np.sum((h - y) * x.T[0]))
    w2 -= alpha * (1 / m * np.sum((h - y) * x.T[1]))
    b -= alpha * (1 / m * np.sum(h - y))
    num += 1
    if num % 10000 == 0:
        print("第{num}次训练,损失为:{j}".format(num=num, j=j))
print("训练后参数为:({w1}, {w2}, {b})".format(w1=w1, w2=w2, b=b))
print("输入(10, 20)的预测值为:{y}".format(y=w1 * 10 + w2 * 20 + b))

print("----------使用sklearn实现LinearRegression----------")
linear = LinearRegression()
linear.fit(x, y)
print("训练后参数为:({w}, {b})".format(w=linear.coef_, b=linear.intercept_))
print("输入(10, 20)的预测值为:{y}".format(y=linear.predict(np.array([[10, 20]]))))

"""
----------手动实现LinearRegression----------
初始化训练参数为:(0.530463331033288, 0.707705839880781, 0.28382978140974435)
第10000次训练,损失为:0.017031041255342046
第20000次训练,损失为:0.0018574900825865815
第30000次训练,损失为:0.0002025871087491673
第40000次训练,损失为:2.209515787784968e-05
训练后参数为:(1.500215312792436, 2.5001388410844028, 1.6890052437557956)
输入(10, 20)的预测值为:66.69393519336822

----------使用sklearn实现LinearRegression----------
训练后参数为:([1.5 2.5], 1.700000000000017)
输入(10, 20)的预测值为:[66.7]
"""

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值