随笔 - 754  文章 - 0 评论 - 33 阅读 - 135万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

一、机器学习介绍

1、什么是机器学习?

机器学习是实现人工智能的最主流方法。它涉及到算法和统计模型的使用,使得计算机系统能够从数据中“学习”和改进任务的执行,而不是通过明确的编程来实现。机器学习包括多种技术,如线性回归、支持向量机(SVM)、决策树等。

第十个月的工资:y0*1.19 

把月份和工资数据输入计算机,计算机自动求解函数关系,再利用函数关系得到结果。不需要经验公式 .

机器学习是一种实现人工智能的方法。从数据中寻找规律、建立关系,根据建立的关系去解决问题。从数据中学习,实现自我优化升级。

机器学习的应用场景:

  计算机视觉、自然语言处理、证券分析、医学诊断、机器人、DNA测序。。

2、实现机器学习的基本框架

将训练数据喂给计算机,计算机自动求解数据关系,在新的数据上做出预测或给出建议。

3、机器学习的类别

(1)、监督学习(Supervised Learning)

 ----训练数据包括正确的结果(标签-label)

根据给的正确结果找出边界,当再给出数据的时候,就可以进行归类。

监督学习
线性回归
→逻辑回归
→决策树
→神经网络、卷积神经网络、循环神经网络

(2)、无监督学习(Unsupervised Learning)

 ----训练数据不包括正确的结果。(不会告诉正确的结果,即自己去寻找规律。)

无监督学习找不出边界,无监督学习里典型例子是聚类。聚类的目的在于把相似的东西聚在一起,而我们并不关心这一类是什么。因此,一个聚类算法通常只需要知道如何计算相似度就可以开始工作了。

无监督学习
→聚类算法

(3)、半监督学习(Semi-supervised Learning)

 ----训练数据包括少量正确的结果。

根据少量正确的结果也可以找出边界,从而实现自动分类。

混合学习

→监督学习+无监督学习

(4)、强化学习(Reinforcement Learning)

根据每次结果收获的奖惩进行学习,实现优化

程序初始化

→根据执行效果给与奖励/惩罚(分数)

→程序逐步寻找获得高分的方法

 

监督学习的应用场景是最多的。

二、机器学习-监督学习-线性回归

1、什么是回归分析?regression analysis

案例1:百万人口医生数量预测区域人均寿命

案例2:年龄预测身高

案例3:住宅面积预测售价

回归分析的定义:根据数据,确定两种或两种以上变量间相互依赖的定量关系

函数表达式:

回归分析的分类

距离:房价=f(面积)

线性回归:回归分析中,变量与因变量存在线性关系

函数表达式:y=ax+b

举例:

线性回归:距离S=速度xt+S0 

非线性回归:距离S=加速度xt2 +S0 

1、确定P、A间的定量关系(重点)
  P =f(A)

 线性模型:y=ax+b,寻找合理的a和b

下面来看看不同的a和b对结果有什么影响

如何寻找到最合适的a和b?

y'=ax+b,即y'为模型输出结果,y为实际结果。

(1)、预测结果与实际结果之差的平方和最小

 (2)、找到a和b让损失函数最小

其中红色点是真实的数据。蓝色和黑色是预测的值。

损失函数计算:

通过计算可知:y1'=0.5计算出的损失函数比y2'=-x+5的损失函数更小.

如何实现损失函数最小呢?

逐渐接近极小值点(p=2)

上面的梯度下降算法中p为自变量,函数为一个抛物线。这里g(a,b)为二元函数,a和b为自变量,函数图像是一个曲面,故需要对a和b同时进行梯度下降算法。

后面我们会用sklearn的线性回归来训练模型并求解a和b的值.

2、根据关系预测合理价格
  P(A=110)=f(110)

3、做出判断(如果150万远大于P,则不值得投资,如果150万远小于P,则值得投资)

 

三、一元线性回归实战

Scikit-learn

它是Python语言中专门针对机器学习应用而发展起来的一款开源框架(算法库),可以实现数据预处理preprocessing、分类classification、回归regression、降维dimensionality reduction、模型选择model selection、聚类clustering等常用的机器学习算法。

 

特点:
(1)、集成了机器学习中各类成熟的算法,容易安装和使用,样例丰富,教程和文档也非常详细

(2)、不支持Python之外的语言,不支持深度学习和强化学习.
https://scikit-learn.org/stable/index.html

点击Regression

点击Generalized Linear Models,找到Ordinary Least Squares

from sklearn import linear_model
reg = linear_model.LinearRegression() # 线性回归
reg.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
reg.coef_
reg.intercept_

a=reg.coef_

b=reg.intercept_

对新数据做预测:

predictions =reg.predict(x_new)

评估模型表现:

(1)、y与y'的均方误差(MSE):

与损失函数很像,除以2就是损失函数

 (2)、R方值(R2

MSE越小越好,R2分数越接近1越好

计算y与y'的均方误差(MSE)、R方值(R2 score):

from sklearn.metrics import mean_squared_error,r2_socre
MSE=mean_squared_error(y,y_predict)
R2 =r2_score(y,y_predict)

(3)、画图对比y与y',可视化模型表现:

from matplotlib import pyplot as plt
plt.scatter(y,y')

MSE越小越好,R2分数越接近1越好

y'vs y集中度越高越好(越接近直线分布)

多张图同时展示

fig1 = plt.subplot(211)
plt.scatter(x1,y1)
fig2 = plt.subplot(212)
plt.scatter(x2,y2)

其中211前面的2表示两行,中间的1表示1列,第三个1表示第一个

用Sklearn求解线性回归问题

寻找a和b(y=ax+b)

 

复制代码
import numpy as np
from sklearn import linear_model
from sklearn.metrics import mean_squared_error,r2_score
from matplotlib import pyplot as plt
reg = linear_model.LinearRegression()
X = np.array([[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]])  # 特征值
y = np.array([7, 9, 11, 13, 15, 17, 19, 21, 23, 25])            # 目标值
reg.fit(X, y)
print(reg.coef_) # a的值为2
print(reg.intercept_) # b的值为5,即y=2x+5
# reg.coef_
# reg.intercept_
predictions =reg.predict([[11], [12]])
print("新数据的预测值:", predictions)
y_predictions =reg.predict([[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]])
MSE=mean_squared_error(y,y_predictions)
print("均方误差",MSE)
R2 =r2_score(y,y_predictions)
print("R方值",R2)
plt.scatter(X,y)
plt.plot(X, y_predictions, color='blue', label='拟合线')
plt.show()
复制代码

结果:

[2.]
5.000000000000002
新数据的预测值: [27. 29.]
均方误差 3.1554436208840474e-31
R方值 1.0

案例2:

复制代码
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# 生成散点图数据
X = [[1], [2], [4], [5]]
Y = [2, 4, 6, 8]
# 构建线性回归模型
regr = LinearRegression()
regr.fit(X, Y)
print('系数a为:' + str(regr.coef_[0]))
print('截距b为:' + str(regr.intercept_))
# y = regr.predict([[1.5]])
# print(y)
y = regr.predict([[1.5], [2.5], [4.5]])
print(y)
plt.scatter(X, Y)
plt.plot(X, regr.predict(X))
plt.show()
复制代码

结果:

系数a为:1.4000000000000004
截距b为:0.7999999999999989
[2.9 4.3 7.1]

四、多元线性回归实战

多元线性回归相关知识

一元线性回归模型反映的是单个自变量对因变量的影响,然而实际情况中,影响因变量的自变量往往不止一个,从而需要将一元线性回归模型扩展到多元线性回归模型。

如果构建多元线性回归模型的数据集包含n个观测、p+1个变量(其中p个自变量和1个因变量),则这些数据可以写成下方的矩阵形式:

 其中,xij代表第个i行的第j个变量值。如果按照一元线性回归模型的逻辑,那么多元线性回归模型应该就是因变量y与自变量X的线性组合,即可以将多元线性回归模型表示成:y=β01x12x2+…+βpxn

根据线性代数的知识,可以将上式表示成y=Xβ+ε。

其中,β为p×1的一维向量,代表了多元线性回归模型的偏回归系数;ε为n×1的一维向量,代表了模型拟合后每一个样本的误差项。

回归模型的参数求解

在多元线性回归模型所涉及的数据中,因变量y是一维向量,而自变量X为二维矩阵,所以对于参数的求解不像一元线性回归模型那样简单,但求解的思路是完全一致的。为了使读者掌握多元线性回归模型参数的求解过程,这里把详细的推导步骤罗列到下方:

第一步:构建目标函数

根据线性代数的知识,可以将向量的平方和公式转换为向量的内积,接下来需要对该式进行平方项的展现。

第二步:展开平方项

由于上式中的y'Xβ和β'X'y均为常数,并且常数的转置就是其本身,因此y'Xβ和β'X'y是相等的。接下来,对目标函数求参数β的偏导数

第三步:求偏导

 

如上式所示,根据高等数学的知识可知,欲求目标函数的极值,般都需要对目标函数求导数,再令导函数为0,进而根据等式求得导函数中的参数值。

第四步:计算偏回归系数的值

经过如上四步的推导,最终可以得到偏回归系数β与自变量X、因变量y的数学关系。这个求解过程也被成为“最小二乘法”。基于已知的偏回归系数β就可以构造多元线性回归模型。前文也提到,构建模型的最终目的是为了预测,即根据其他已知的自变量X的值预测未知的因变量y的值。

多元线性回归模型的建立可以分为以下几个步骤:

二元线性回归案例: 根据市人口数x1和城市GDPx2来预测水路客运量y

注意: 二元一次函数(如 z = ax + by + c)的图像是三维空间中的平面

test.xlsx文件下载

通过网盘分享的文件:test.xlsx
链接: https://pan.baidu.com/s/1hghCb164r3WeZGgk1TflGA 提取码: t655 
--来自百度网盘超级会员v6的分享

完整代码:

复制代码
import torch
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
# from matplotlib import pyplot as plt
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score


# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 读取Excel文件
data = pd.read_excel('C:\\Users\\miracle\\Desktop\\test.xlsx')
X = data[['市人口数x1', '城市GDPx2']]
y = data['水路客运量y']
print(X)
print(y)

# 数据分割
# X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练模型
model = LinearRegression()
model.fit(X, y) # 所有数据拿来训练
# model.fit(X_train, y_train)

# y_pred = model.predict(X_test)
# mse = mean_squared_error(y_test, y_pred)
# r2 = r2_score(y_test, y_pred)
# print(f"MSE: {mse:.2f}")  # 3755.91
# print(f"R²: {r2:.2f}")    # 0.85

# print(f"Coefficients: {model.coef_}")
# print(f"Intercept: {model.intercept_}")

# 预测未来水路客运量
x_new = [[560, 1546]]
y_pred = model.predict(x_new)

print("预测未来水路客运量为:", y_pred[0])
print(X)
print(X['市人口数x1'])
# 绘制图像
fig = plt.figure()
ax = fig.add_subplot(projection='3d') # 绘制3d散点图
# ax.scatter(X[:, 0], X[:, 1], y)
ax.scatter(X['市人口数x1'], X['城市GDPx2'], y)
# x1, x2 = np.meshgrid(X[:, 0], X[:, 1])
x1, x2 = np.meshgrid(X['市人口数x1'], X['城市GDPx2'])
y_pred = model.predict(np.array([x1.flatten(), x2.flatten()]).T).reshape(x1.shape)
ax.plot_surface(x1, x2, y_pred, alpha=0.5, cmap='viridis')
ax.set_xlabel('市人口数x1')
ax.set_ylabel('城市GDPx2')
ax.set_zlabel('水路客运量y')
plt.title('多元线性回归预测模型案例')
plt.show()
复制代码

结果:

 



感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接
posted on   周文豪  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示