机器学习(2):线性回归Python实现

server/2025/1/19 8:39:58/

1 概念回顾

1.1 模型假设

        线性回归模型假设因变量y yy与自变量x xx之间的关系可以用以下线性方程表示:

y = β 0 + β 1 ⋅ X 1 + β 2 ⋅ X 2 + … + β n ⋅ X n + ε

  • y 是因变量 (待预测值);
  • X1, X2, ... Xn 是自变量(特征)
  • β0, β1, … βn 是模型的参数,表示截距和各自变量的系数
  • ε 是误差项,表示模型不能解释的随机噪声。

1.2 损失函数

        在线性回归中,常用的损失函数是均方误差 (M S E MSEMSE) ,它衡量了模型预测值与真实值之间的平方差:

        其中 n 是样本数量,yi 是第i个样本的真实值,y^i是模型对第i个样本的预测值。

1.3 参数估计

        线性回归模型的参数估计通常使用最小二乘法来进行。最小二乘法的目标是最小化损失函数,找到能使损失函数达到最小的参数值。

2 一元线性回归

2.1 最小二乘法

python">import numpy as np
import matplotlib.pyplot as plt# ---------------1. 准备数据----------
data = np.array([[32, 31], [53, 68], [61, 62], [47, 71], [59, 87], [55, 78], [52, 79], [39, 59], [48, 75], [52, 71],[45, 55], [54, 82], [44, 62], [58, 75], [56, 81], [48, 60], [44, 82], [60, 97], [45, 48], [38, 56],[66, 83], [65, 118], [47, 57], [41, 51], [51, 75], [59, 74], [57, 95], [63, 95], [46, 79], [50, 83]])# 提取data中的两列数据,分别作为x,y
x = data[:, 0]
y = data[:, 1]# 用plt画出散点图
# plt.scatter(x, y)
# plt.show()# -----------2. 定义损失函数------------------
# 损失函数是系数的函数,另外还要传入数据的x,y
def compute_cost(w, b, points):total_cost = 0M = len(points)# 逐点计算平方损失误差,然后求平均数for i in range(M):x = points[i, 0]y = points[i, 1]total_cost += (y - w * x - b) ** 2return total_cost / M# ------------3.定义算法拟合函数-----------------
# 先定义一个求均值的函数
def average(data):sum = 0num = len(data)for i in range(num):sum += data[i]return sum / num# 定义核心拟合函数
def fit(points):M = len(points)x_bar = average(points[:, 0])sum_yx = 0sum_x2 = 0sum_delta = 0for i in range(M):x = points[i, 0]y = points[i, 1]sum_yx += y * (x - x_bar)sum_x2 += x ** 2# 根据公式计算ww = sum_yx / (sum_x2 - M * (x_bar ** 2))for i in range(M):x = points[i, 0]y = points[i, 1]sum_delta += (y - w * x)b = sum_delta / Mreturn w, b# ------------4. 测试------------------
w, b = fit(data)print("w is: ", w)
print("b is: ", b)cost = compute_cost(w, b, data)print("cost is: ", cost)# ---------5. 画出拟合曲线------------
plt.scatter(x, y)
# 针对每一个x,计算出预测的y值
pred_y = w * x + bplt.plot(x, pred_y, c='r')
plt.show()

2.2 梯度下降法

python">import numpy as np
import matplotlib.pyplot as plt# 准备数据
data = np.array([[32, 31], [53, 68], [61, 62], [47, 71], [59, 87], [55, 78], [52, 79], [39, 59], [48, 75], [52, 71],[45, 55], [54, 82], [44, 62], [58, 75], [56, 81], [48, 60], [44, 82], [60, 97], [45, 48], [38, 56],[66, 83], [65, 118], [47, 57], [41, 51], [51, 75], [59, 74], [57, 95], [63, 95], [46, 79],[50, 83]])x = data[:, 0]
y = data[:, 1]# --------------2. 定义损失函数--------------
def compute_cost(w, b, data):total_cost = 0M = len(data)# 逐点计算平方损失误差,然后求平均数for i in range(M):x = data[i, 0]y = data[i, 1]total_cost += (y - w * x - b) ** 2return total_cost / M# --------------3. 定义模型的超参数------------
alpha = 0.0001
initial_w = 0
initial_b = 0
num_iter = 10# --------------4. 定义核心梯度下降算法函数-----
def grad_desc(data, initial_w, initial_b, alpha, num_iter):w = initial_wb = initial_b# 定义一个list保存所有的损失函数值,用来显示下降的过程cost_list = []for i in range(num_iter):cost_list.append(compute_cost(w, b, data))w, b = step_grad_desc(w, b, alpha, data)return [w, b, cost_list]def step_grad_desc(current_w, current_b, alpha, data):sum_grad_w = 0sum_grad_b = 0M = len(data)# 对每个点,代入公式求和for i in range(M):x = data[i, 0]y = data[i, 1]sum_grad_w += (current_w * x + current_b - y) * xsum_grad_b += current_w * x + current_b - y# 用公式求当前梯度grad_w = 2 / M * sum_grad_wgrad_b = 2 / M * sum_grad_b# 梯度下降,更新当前的w和bupdated_w = current_w - alpha * grad_wupdated_b = current_b - alpha * grad_breturn updated_w, updated_b# ------------5. 测试:运行梯度下降算法计算最优的w和b-------
w, b, cost_list = grad_desc(data, initial_w, initial_b, alpha, num_iter)
print("w is: ", w)
print("b is: ", b)
cost = compute_cost(w, b, data)
print("cost is: ", cost)
# plt.plot(cost_list)
# plt.show()# ------------6. 画出拟合曲线-------------------------
plt.scatter(x, y)
# 针对每一个x,计算出预测的y值
pred_y = w * x + b
plt.plot(x, pred_y, c='r')
plt.show()

2.3 sklearn库实现

python">import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression# -------------1. 数据---------
# points = np.genfromtxt('data.csv', delimiter=',')
data = np.array([[32, 31], [53, 68], [61, 62], [47, 71], [59, 87], [55, 78], [52, 79], [39, 59], [48, 75], [52, 71],[45, 55], [54, 82], [44, 62], [58, 75], [56, 81], [48, 60], [44, 82], [60, 97], [45, 48], [38, 56],[66, 83], [65, 118], [47, 57], [41, 51], [51, 75], [59, 74], [57, 95], [63, 95], [46, 79],[50, 83]])
# 提取points中的两列数据,分别作为x,y
x = data[:, 0]
y = data[:, 1]# --------------2. 定义损失函数--------------
# 损失函数是系数的函数,另外还要传入数据的x,y
def compute_cost(w, b, data):total_cost = 0M = len(data)# 逐点计算平方损失误差,然后求平均数for i in range(M):x = data[i, 0]y = data[i, 1]total_cost += (y - w * x - b) ** 2return total_cost / Mlr = LinearRegression()
x_new = x.reshape(-1, 1)
y_new = y.reshape(-1, 1)
lr.fit(x_new, y_new)
# 从训练好的模型中提取系数和偏置
w = lr.coef_[0][0]
b = lr.intercept_[0]
print("w is: ", w)
print("b is: ", b)
cost = compute_cost(w, b, data)
print("cost is: ", cost)
plt.scatter(x, y)
# 针对每一个x,计算出预测的y值
pred_y = w * x + b
plt.plot(x, pred_y, c='r')
plt.show()

多元线性回归

        sklearn库实现

python">import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn import datasets# data = fetch_california_housing()
iris = datasets.load_iris()
df = pd.DataFrame(iris.data , columns=iris.feature_names)
target = pd.DataFrame(iris.target, columns=['MEDV'])
X = df
y = target# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=1)
print(X_train.shape)
print(X_test.shape)# 模型训练
lr = LinearRegression()
lr.fit(X_train, y_train)
print(lr.coef_)
print(lr.intercept_)# 模型评估
y_pred = lr.predict(X_test)
from sklearn import metricsMSE = metrics.mean_squared_error(y_test, y_pred)
RMSE = np.sqrt(metrics.mean_squared_error(y_test, y_pred))
print('MSE:', MSE)
print('RMSE:', RMSE)# -----------图像绘制--------------
import matplotlib.pyplot as plt
import matplotlib as mplmpl.rcParams['font.family'] = ['sans-serif']
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False# 绘制图
plt.figure(figsize=(15, 5))
plt.plot(range(len(y_test)), y_test, 'r', label='测试数据')
plt.plot(range(len(y_test)), y_pred, 'b', label='预测数据')
plt.legend()
plt.show()# # 绘制散点图
plt.scatter(y_test, y_pred)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--')
plt.xlabel('真实值')
plt.ylabel('预测值')
plt.show()


http://www.ppmy.cn/server/159580.html

相关文章

SpringBoot3-整合WebSocket指南

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞??收藏评论 SpringBoot3-整合WebSocket指南 1. 什么是WebSocket?2. 环境准备 2.1 项目依赖 3. WebSocket配置 3.1 WebSocket配置类3.2 自定义WebSocket处理器 4. 控制器5. 前端实现 5.1 HTML页面…

Linux——动静态库

库的本质实际上就是已经写好的,现有的、可以被复用的代码的集合。库被分为两类,一类是静态库:.a[Linux]、.lib[windows];一类是:动态库:.so[Linux]、.dll[Windows]。其实这里就会有疑问,为什么我…

【PowerQuery专栏】PowerQuery的函数Excel.WorkBook

对于Excel文件来说,目前有两种不同场景需要使用到Excel函数进行解析: 当前Excel数据解析 Excel.CurrentWorkbook外部引用Excel数据解析 Excel.Workbook这里先来看一下当前Excel当前文件数据的引用,Excel.CurrentWorkbook 是基于当前的Excel中的表对象进行数据…

从零搭建SpringBoot3+Vue3前后端分离项目基座,中小项目可用

文章目录 1. 后端项目搭建 1.1 环境准备1.2 数据表准备1.3 SpringBoot3项目创建1.4 MySql环境整合,使用druid连接池1.5 整合mybatis-plus 1.5.1 引入mybatis-plus1.5.2 配置代码生成器1.5.3 配置分页插件 1.6 整合swagger3(knife4j) 1.6.1 整…

mongodb详解二:基础操作

基础操作 数据库操作collection操作查看表插入数据查找数据 数据库操作 1.创建数据库 use test_db;如果没有数据库,use命令会新建一个;有的话,会切换到这个数据库 2.查看数据库 show dbs;collection操作 查看表 show tables;插入数据 …

“AI 自动化效能评估系统:开启企业高效发展新征程

在当今数字化飞速发展的时代,企业面临着日益激烈的市场竞争,如何提升效率、降低成本成为了企业生存与发展的关键。AI 自动化效能评估系统应运而生,它如同一把智能钥匙,为企业开启了高效发展的新征程。 AI 自动化效能评估系统&…

【Kotlin】上手学习之类型篇

一、类型 1.1 基本类型 主要分为 数字及其无符号版布尔字符字符串数组 1.1.1 数字 整数类型 Kotlin 提供了一组表示数字的内置类型。 对于整数,有四种不同大小的类型,因此值的范围也不同: 类型大小(比特数)最小…

题解 CodeForces 430B Balls Game 栈 C/C++

题目传送门: Problem - B - Codeforceshttps://mirror.codeforces.com/contest/430/problem/B翻译: Iahub正在为国际信息学奥林匹克竞赛(IOI)做准备。有什么比玩一个类似祖玛的游戏更好的训练方法呢? 一排中有n个球…