线性回归算法推导与实战(二)

简介: 本文属于 线性回归算法【AIoT阶段三】(尚未更新),这里截取自其中一段内容,方便读者理解和根据需求快速阅读。本文通过公式推导+代码两个方面同时进行,因为涉及到代码的编译运行,如果你没有NumPy,Pandas,Matplotlib的基础,建议先修文章:数据分析三剑客【AIoT阶段一(下)】(十万字博文 保姆级讲解)

2.线性回归实战

2.1 使用正规方程进行求解

2.1.1 简单线性回归

🚩y = w x + b 一元一次方程,在机器学习中一元表示一个特征,b  表示截距,y  表示目标值。

import numpy as np
import matplotlib.pyplot as plt
# 转化成矩阵
X = np.linspace(0, 10, num = 30).reshape(-1, 1)
'''
np.linspace(0, 10, num = 30) 是把0~10等分为30段
为什么不实用下述代码?
X = np.random.randint(0, 10, size = (30, 1))
这是因为上面这行代码只会产生整数,而代码np.linspace(0, 10, num = 30)可以产生小数
构图更加的美观
'''
# 斜率和截距,随机生成
w = np.random.randint(1, 5, size = 1)
b = np.random.randint(1, 10, size = 1)
# 根据一元一次方程计算目标值y,并加上“噪声”,数据有上下波动~
y = X * w + b + np.random.randn(30, 1)
plt.scatter(X, y)
# 重新构造X,b截距,相当于系数w0,前面统一乘以1
X = np.concatenate([X, np.full(shape = (30, 1), fill_value = 1)], axis = 1)
# 正规方程求解 
θ = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y).round(2)
print('一元一次方程真实的斜率和截距是:',w, b)
print('通过正规方程求解的斜率和截距是:', θ)
# 根据求解的斜率和截距绘制线性回归线型图
_ = plt.plot(X[:,0],X.dot(θ),color = 'green')

6.png

2.1.2 多元线性回归

image.png

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D # 绘制三维图像
# 转化成矩阵
x1 = np.random.randint(-150, 150, size = (300, 1))
x2 = np.random.randint(0, 300, size = (300, 1))
# 斜率和截距,随机生成
w = np.random.randint(1, 5, size = 2)
b = np.random.randint(1, 10, size = 1)
# 根据二元一次方程计算目标值y,并加上“噪声”,数据有上下波动~
y = x1 * w[0] + x2 * w[1] + b + np.random.randn(300, 1)
fig = plt.figure(figsize = (9, 6))
ax = Axes3D(fig)
ax.scatter(x1, x2, y) # 三维散点图
ax.view_init(elev = 10, azim = -20) # 调整视角
# 重新构造X,将x1、x2以及截距b,相当于系数w0,前面统一乘以1进行数据合并
X = np.concatenate([x1, x2, np.full(shape = (300, 1), fill_value = 1)], axis = 1)
w = np.concatenate([w, b])
# 正规方程求解
θ = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y).round(2)
print('二元一次方程真实的斜率和截距是:', w)
print('通过正规方程求解的斜率和截距是:', θ.reshape(-1))
# # 根据求解的斜率和截距绘制线性回归线型图
x = np.linspace(-150, 150, 100)
y = np.linspace(0, 300, 100)
z = x * θ[0] + y * θ[1] + θ[2]
_ = ax.plot(x,y,z ,color = 'red')

7.png

2.2 机器学习库scikitlearn

🚩这个库我们其实在 线性回归的基本概念以及正规方程 就已经有了介绍,下面的两个代码也是调用函数改写上述的两个代码。

scikit-learn官网

8.png

2.2.1scikit−learn实现简单线性回归

from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt
# 转化成矩阵
X = np.linspace(0, 10, num = 30).reshape(-1, 1)
# 斜率和截距,随机生成
w = np.random.randint(1, 5, size = 1)
b = np.random.randint(1, 10, size = 1)
# 根据一元一次方程计算目标值y,并加上“噪声”,数据有上下波动~
y = X * w + b + np.random.randn(30, 1)
plt.scatter(X, y)
# 使用scikit-learn中的线性回归求解
model = LinearRegression()
model.fit(X, y)
w_ = model.coef_
b_ = model.intercept_
print('一元一次方程真实的斜率和截距是:',w, b)
print('通过scikit-learn求解的斜率和截距是:',w_, b_)
_ = plt.plot(X, X.dot(w_) + b_, color = 'green')

9.png

2.2.2 scikit−learn实现多元线性回归

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D
# 转化成矩阵
x1 = np.random.randint(-150, 150,size = (300, 1))
x2 = np.random.randint(0, 300,size = (300, 1))
# 斜率和截距,随机生成
w = np.random.randint(1, 5, size = 2)
b = np.random.randint(1, 10, size = 1)
# 根据二元一次方程计算目标值y,并加上“噪声”,数据有上下波动~
y = x1 * w[0] + x2 * w[1] + b + np.random.randn(300, 1)
fig = plt.figure(figsize = (9, 6))
ax = Axes3D(fig)
ax.scatter(x1, x2, y) # 三维散点图
ax.view_init(elev = 10, azim = -20) # 调整视角
# 重新构造X,将x1、x2以及截距b,相当于系数w0,前面统一乘以1进行数据合并
X = np.concatenate([x1, x2], axis = 1)
# 使用scikit-learn中的线性回归求解
model = LinearRegression()
model.fit(X, y)
w_ = model.coef_.reshape(-1)
b_ = model.intercept_
print('二元一次方程真实的斜率和截距是:', w, b)
print('通过scikit-learn求解的斜率和截距是:', w_, b_)
# # 根据求解的斜率和截距绘制线性回归线型图
x = np.linspace(-150, 150, 100)
y = np.linspace(0, 300, 100)
z = x * w_[0] + y * w_[1] + b_
_ = ax.plot(x, y, z ,color = 'green')

10.png

2.3 线性回归预测房价

2.3.1 数据加载

首先导包:

import numpy as np
from sklearn import datasets
from sklearn.linear_model import LinearRegression

我们要实现的是对 波士顿 这个国家进行房价预测,有关 波士顿 的数据,可以直接用代码:

boston = datasets.load_boston()

我们来看一下 datasets.load_boston() 里面都有哪些数据:

11.png

数据由三部分组成:

image.png

我们把这些信息分开来处理:

boston = datasets.load_boston()
X = boston['data']   # 数据,这些数据影响了房价,统计指标
y = boston['target'] # 房价,24就表示24万美金
# CRIM:犯罪率
# NOX:空气污染,N含量
# TAX:税收
# 这些指标都和放假有关
feature_names = boston['feature_names'] # 具体指标

2.3.2 数据查看

# 506 表示 506 个统计样本
# 13 表示影响房价的 13 个属性
X.shape

image.png

# 506 个房子
# X -----> y 是一一对应的
# 数据 -----> 目标值对应
y.shape

image.png

2.3.3 数据拆分

# 506个数据、样本
# 拆分成两份:一份 80%用于训练,一份20%用于验证
# 拿出其中的80%,交给算法(线性回归),去进行学习、总结、拟合函数
# 20%作用:验证,测一测,看看算法,学习80%结束,是否准确
# 如何划分:利用 numpy 的 shuffle 打乱数据
index = np.arange(506)
np.random.shuffle(index)
index

12.png

506×80%405,故我们拿出打乱后的前 405 个数据用于训练算法,其余数据用于验证算法:

# 80% 训练数据
train_index = index[:405]
X_train = X[train_index]
y_train = y[train_index]
# 20% 测试数据
test_index = index[405:]
X_test = X[test_index]
y_test = y[test_index]

2.3.4 数据建模

np.set_printoptions(suppress = True) # 不使用科学计数法
model = LinearRegression(fit_intercept = True)
# 建模:算法、方程
model.fit(X_train, y_train)
# 建模获取了斜率,斜率有大有小,有正有负
# 斜率为正代表正相关(面积),为负代表负相关(犯罪率)
display(model.coef_, model.intercept_)

image.png

2.3.5 模型验证

# 模型预测的结果:y_
y_ = model.predict(X_test).round(2)
# 展示前 30 个:
display(y_[:30])
# 展示真实结果的前 30 个:
display(y_test[:30])


image.png

算法的预测难免会有异常值,这是 不可避免的!

2.3.6 模型评估

# 最大值是 1,最小值可以小于 0
# 这个指标越接近 1,说明算法越优秀
model.score(X_test, y_test)

image.png

# 再来判断一下训练数据的得分
model.score(X_train, y_train)

image.png

显然,训练数据的得分是高的,这就好比我们在考试前都会做模拟题,我们如果考试卷的大部分题目都和模拟题是一样的,那么我们的分数就会高一些,如果考试的题目都是新题,那么我们的分数就会低一些

当然,我们评测数据不止这一个方法,下面简单介绍一下别的方法:

# 最小二乘法
from sklearn.metrics import mean_squared_error
# 这个是测试数据,对应的是 20%
y_pred = model.predict(X_test)
y_true = y_test
mean_squared_error(y_true, y_pred)

image.png

我们再来看那 80 % 的训练数据:

# 80% 的训练数据:
mean_squared_error(y_train, model.predict(X_train))

image.png

注意我们这里的分数是error,越小越好!


目录
相关文章
|
5月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
2月前
|
机器学习/深度学习 算法 文件存储
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
神经架构搜索(NAS)正被广泛应用于大模型及语言/视觉模型设计,如LangVision-LoRA-NAS、Jet-Nemotron等。本文回顾NAS核心技术,解析其自动化设计原理,探讨强化学习、进化算法与梯度方法的应用与差异,揭示NAS在大模型时代的潜力与挑战。
291 6
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
|
14天前
|
机器学习/深度学习 资源调度 算法
遗传算法模型深度解析与实战应用
摘要 遗传算法(GA)作为一种受生物进化启发的优化算法,在复杂问题求解中展现出独特优势。本文系统介绍了GA的核心理论、实现细节和应用经验。算法通过模拟自然选择机制,利用选择、交叉、变异三大操作在解空间中进行全局搜索。与梯度下降等传统方法相比,GA不依赖目标函数的连续性或可微性,特别适合处理离散优化、多目标优化等复杂问题。文中详细阐述了染色体编码、适应度函数设计、遗传操作实现等关键技术,并提供了Python代码实现示例。实践表明,GA的成功应用关键在于平衡探索与开发,通过精心调参维持种群多样性同时确保收敛效率
|
14天前
|
机器学习/深度学习 边缘计算 人工智能
粒子群算法模型深度解析与实战应用
蒋星熠Jaxonic是一位深耕智能优化算法领域多年的技术探索者,专注于粒子群优化(PSO)算法的研究与应用。他深入剖析了PSO的数学模型、核心公式及实现方法,并通过大量实践验证了其在神经网络优化、工程设计等复杂问题上的卓越性能。本文全面展示了PSO的理论基础、改进策略与前沿发展方向,为读者提供了一份详尽的技术指南。
粒子群算法模型深度解析与实战应用
|
8月前
|
人工智能 编解码 算法
DeepSeek加持的通义灵码2.0 AI程序员实战案例:助力嵌入式开发中的算法生成革新
本文介绍了通义灵码2.0 AI程序员在嵌入式开发中的实战应用。通过安装VS Code插件并登录阿里云账号,用户可切换至DeepSeek V3模型,利用其强大的代码生成能力。实战案例中,AI程序员根据自然语言描述快速生成了C语言的base64编解码算法,包括源代码、头文件、测试代码和CMake编译脚本。即使在编译错误和需求迭代的情况下,AI程序员也能迅速分析问题并修复代码,最终成功实现功能。作者认为,通义灵码2.0显著提升了开发效率,打破了编程语言限制,是AI编程从辅助工具向工程级协同开发转变的重要标志,值得开发者广泛使用。
8521 71
DeepSeek加持的通义灵码2.0 AI程序员实战案例:助力嵌入式开发中的算法生成革新
|
11月前
|
机器学习/深度学习 自然语言处理 算法
深入理解机器学习算法:从线性回归到神经网络
深入理解机器学习算法:从线性回归到神经网络
|
12月前
|
存储 缓存 算法
前端算法:优化与实战技巧的深度探索
【10月更文挑战第21天】前端算法:优化与实战技巧的深度探索
162 1
|
12月前
|
算法 索引
HashMap扩容时的rehash方法中(e.hash & oldCap) == 0算法推导
HashMap在扩容时,会创建一个新数组,并将旧数组中的数据迁移过去。通过(e.hash & oldCap)是否等于0,数据被巧妙地分为两类:一类保持原有索引位置,另一类索引位置增加旧数组长度。此过程确保了数据均匀分布,提高了查询效率。
196 2
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
233 2
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
232 4

热门文章

最新文章