五、特征缩放和多项式回归

目录

一、为什么要使用特征缩放(Feature Scaling)

1.首先来看预测房价的例子

2.特征缩放前后效果对比

二、特征缩放方法

1.统一除以范围最大值

2.均值归一化(Mean Normalization)

3.Z-score标准化(Z-score Normalization)

4.一些可以接受/不接受的缩放范围

三、如何识别梯度下降是否收敛

四、如何选择一个合适的学习率

1.学习曲线(J(w,b)-迭代次数)

2.学习率选择技巧

3.特征缩放和学习率选择实验

(1)在具有多个特征的数据集上运行梯度下降,探索学习率alpha对梯度下降的影响

①多特征数据集

②导入数据集

③绘制每一个特征和结果(房价)的散点分布图

④多特征的梯度下降算法

⑤选用学习率为9.9*10^-7时,迭代10次

⑥选择较小的学习率9.0*10^-7

⑦继续缩小学习率,使用1.0*10^-7

(2)使用z-score标准化通过特征缩放提高梯度下降的性能

①z-score计算公式及各参数计算方法

②代码实现

③标准化过程及效果

④比较原始数据和标准化处理后的各特征值x

⑤用标准化处理后的数据重新执行梯度下降算法

⑥使用训练好的模型进行预测

⑦J(w,b)等值线图下观察标准化对梯度下降算法效果

4.总结

五、特征工程和多项式回归

1.特征工程

2.多项式回归(也是很重要的回归模型)

3.特征工程和多项式回归实验

(1)没有进行特征工程的线性回归模型

(2)使用梯度下降的方式去训练多项式回归模型

(3)使用三次多项式回归模型训练

(4)从另一个角度来考虑选择什么样的模型更好的拟合训练数据

(5)使用特征缩放对x,x^2,x^3进行处理以后的效果

(6)使用特征工程还可以对复杂场景进行函数建模

4.总结

六、本章小结


一、为什么要使用特征缩放(Feature Scaling)

目的:使梯度下降算法运行速度更快,效果更好

1.首先来看预测房价的例子

        x1表示房子面积(范围较大),x2表示卧室数量(范围较小)

        (1)如果初始时,w1设置为50,w2设置为0.1,那么初始计算的price为:100050

        (2)如果初始时,w1设置为0.1,w2设置为50,那么初始计算的price为:500(这个相对更合理)

        从上面可以看到,如果x1和x2两个特征差距太大,相应的w1和w2两个参数也会差距太大

        当x1范围大则w1相应的变化范围就会很小当x2范围小则w2相应的变化范围就会很大

2.特征缩放前后效果对比

        下图是x1、x2进行特征缩放前后的f(x1,x2)散点分布图代价函数J(w,b)的等高线图

        如果按原样训练数据。因为J(w,b)轮廓高而细,梯度下降可能会在结束前来回反弹了很长时间都没办法找到全局最小值的方法。在这种情况下,一个有用的要做的就是缩放特征。这意味着执行一些对训练数据进行变换,使x1的范围现在可以从0到1x2的取值范围也可以是0到1

        数据点看起来更像这样左下的散点图;你可能会注意到下面的图的比例现在相当和上面的不一样。关键是x1和x2现在都是可比较的,如果你运行梯度下降在这里找到一个成本函数,使用它重新缩放x1和x2变换后的数据,轮廓看起来会更像圆圈(右下),梯度下降法可以通过更直接的路径到全局最小值,缩放后更容易找到合适的w和b参数值


二、特征缩放方法

1.统一除以范围最大值

2.均值归一化(Mean Normalization)

        分子为x1-μ(均值)

        分母为范围最大值-范围最小值

        均值归一化的取值范围为-1~1

3.Z-score标准化(Z-score Normalization)

        计算公式为𝑍=(𝑋−𝜇)/𝜎,其中Z表示Z分数,X表示一个数据点的值,μ表示数据集的均值,𝜎表示数据集的标准差

4.一些可以接受/不接受的缩放范围


三、如何识别梯度下降是否收敛

        可以借助J(w,b)-迭代次数学习曲线来获取一些梯度下降的信息

1.如果随着迭代次数增加,J(w,b)不降反增,这表示α可能选择的太大,或者程序出现了bug

2.当迭代到一定次数后,J(w,b)趋于平稳,那么就可能意味着经过这些次数迭代J(w,b)收敛

3.不同的代价函数迭代次数不一样,有的30次就收敛,有的1000次,有的100000次,这个次数经过我们绘制学习曲线也会有个比较直观的认识。

        具体什么时候达到收敛,我们可以设置一个阈值ε,当迭代过程中代价函数的减少值小于这个阈值就可以认为已收敛。


四、如何选择一个合适的学习率

1.学习曲线(J(w,b)-迭代次数)

        可能出现的情况,原因可能是程序存在bug或者学习率过大

        技巧:设置一个非常小的学习率α,如果在这样的学习率下还是会有J(w,b)在迭代中增加,此时就要注意程序内是否存在bug了,这里选择非常小的学习率只是一个调试过程,用于发现程序内可能存在的bug,但不是训练学习算法最好的选择(学习率太小可能会导致需要迭代很多次才能收敛)。

2.学习率选择技巧

        可以使用下面的方式 3× 提高学习率的技巧去给算法选择合适的学习率

3.特征缩放和学习率选择实验

        C1_W2_Lab03_Feature_Scaling_and_Learning_Rate

(1)在具有多个特征的数据集上运行梯度下降,探索学习率alpha对梯度下降的影响

①多特征数据集

②导入数据集
# load the dataset
X_train, y_train = load_house_data()
X_features = ['size(sqft)','bedrooms','floors','age']
③绘制每一个特征和结果(房价)的散点分布图

        可以看出哪些特征对价格影响最大。以上,增大尺寸也会增加价格。卧室和地板似乎对价格没有太大影响。新房子比老房子价格高。

④多特征的梯度下降算法

⑤选用学习率为9.9*10^-7时,迭代10次
#set alpha to 9.9e-7
_, _, hist = run_gradient_descent(X_train, y_train, 10, alpha = 9.9e-7)

可以看到随着迭代次数增加,Cost是变大的,没有收敛

绘制图像如下:(右图只是展示了Cost和w0的关系,不代表和其他特征的关系也是如此)

⑥选择较小的学习率9.0*10^-7

可见Cost是不断下降了,但是因为学习率太大,没有收敛,一直在“左右横跳”

⑦继续缩小学习率,使用1.0*10^-7

可见效果明显变好

(2)使用z-score标准化通过特征缩放提高梯度下降的性能

z-score计算公式及各参数计算方法

②代码实现
def zscore_normalize_features(X):"""computes  X, zcore normalized by columnArgs:X (ndarray): Shape (m,n) input data, m examples, n featuresReturns:X_norm (ndarray): Shape (m,n)  input normalized by columnmu (ndarray):     Shape (n,)   mean of each featuresigma (ndarray):  Shape (n,)   standard deviation of each feature"""# find the mean of each column/featuremu     = np.mean(X, axis=0)                 # mu will have shape (n,)# find the standard deviation of each column/featuresigma  = np.std(X, axis=0)                  # sigma will have shape (n,)# element-wise, subtract mu for that column from each example, divide by std for that columnX_norm = (X - mu) / sigma      return (X_norm, mu, sigma)#check our work
#from sklearn.preprocessing import scale
#scale(X_orig, axis=0, with_mean=True, with_std=True, copy=True)
③标准化过程及效果

房屋年龄和面积都归一化后散点分布更加均匀了

④比较原始数据和标准化处理后的各特征值x
# normalize the original features
X_norm, X_mu, X_sigma = zscore_normalize_features(X_train)
print(f"X_mu = {X_mu}, \nX_sigma = {X_sigma}")
print(f"Peak to Peak range by column in Raw        X:{np.ptp(X_train,axis=0)}")   
print(f"Peak to Peak range by column in Normalized X:{np.ptp(X_norm,axis=0)}")

观察图像,标准化处理前后范围变化:

注意,上面规范化数据的范围以0为中心,大致为+/- 1。最重要的是,每个特征的范围是相似的。

⑤用标准化处理后的数据重新执行梯度下降算法

注意alpha的值要大得多,这将加速下降

w_norm, b_norm, hist = run_gradient_descent(X_norm, y_train, 1000, 1.0e-1, )

 在上一章的最后我们使用原始的方法进行计算:

四、多特征的线性回归模型-CSDN博客文章浏览阅读1.3k次,点赞41次,收藏17次。在本文中介绍了多特征的线性回归模型的应用场景、多特征的线性回归模型梯度下降法、多特征变量的向量表示并强调了向量化操作在效率提升上的重要性。接着,文章详细比较了单特征和多特征梯度下降的区别,以及传统设置变量法与向量表示的异同。最后,通过实际实验,展示了如何运用numpy包对向量或矩阵的各种处理操作,如何运用多特征的线性回归模型梯度下降法迭代计算令代价最小的多个特征参数的值。整篇文章系统地概述了梯度下降在多元线性回归中的应用。https://blog.csdn.net/hehe_soft_engineer/article/details/139449052#t21

上面使用原始数据计算在1000次后还没有收敛,可以看到在标准化处理后进行训练300次后就达到了收敛,收敛速度比较快。

⑥使用训练好的模型进行预测

注意:生成我们的模型的目的是用它来预测数据集中不存在的房价。让我们来预测一套拥有1200平方英尺、3间卧室、1层楼、40年历史的房子的价格。回想一下,你必须用归一化训练数据时得到的均值和标准差来归一化新的输入数据。

# First, normalize out example.
x_house = np.array([1200, 3, 1, 40])
x_house_norm = (x_house - X_mu) / X_sigma
print(x_house_norm)
x_house_predict = np.dot(x_house_norm, w_norm) + b_norm
print(f" predicted price of a house with 1200 sqft, 3 bedrooms, 1 floor, 40 years old = ${x_house_predict*1000:0.0f}")

⑦J(w,b)等值线图下观察标准化对梯度下降算法效果

在下面的J(w,b)等值线图中,参数的比例是匹配的。左边的图是归一化特征前的w[0]平方英尺与w[1]的卧室数量对比图。这幅图太不对称了,无法看到补全轮廓的曲线。相反,当特征归一化后,代价轮廓更加对称。结果是,在梯度下降过程中对参数的更新可以对每个参数的变化取得相似的效果。

4.总结

        选择学习率是训练许多学习算法的重要组成部分,通过理论和实验的学习帮助我们用科学的方式为梯度下降选择一个好的学习率,了解不同的学习率选择对模型训练带来的效果,在直觉上也有助于我们更好的理解如何选择一个好的学习率。


五、特征工程和多项式回归

1.特征工程

    通过直觉或者对问题专业知识的理解去设计新的特性,通常的方式是通过转换或者结合问题的原始特征来完成,目的是让学习算法更容易做出准确合理的预测。

比如刚开始f(x)只是使用长和宽作为特征来构造线性回归模型,但是发现长×宽=面积引入后,面积更能决定房价,所以我们就可以完善我们的模型,将面积作为特征引入。

2.多项式回归(也是很重要的回归模型)

下面根据数据可以选择不同的模型来训练,有的效果好,有的效果差

3.特征工程和多项式回归实验

C1_W2_Lab04_FeatEng_PolyReg:探索特征工程和多项式回归,它允许你使用线性回归的机制来拟合非常复杂,甚至非线性的函数。

(1)没有进行特征工程的线性回归模型

x数据集使用的0~20之间的整数,y数据集对每个x计算:y=1+x^{2}

# create target data
x = np.arange(0, 20, 1)
y = 1 + x**2
X = x.reshape(-1, 1)model_w,model_b = run_gradient_descent_feng(X,y,iterations=1000, alpha = 1e-2)plt.scatter(x, y, marker='x', c='r', label="Actual Value"); plt.title("no feature engineering")
plt.plot(x,X@model_w + model_b, label="Predicted Value");  plt.xlabel("X"); plt.ylabel("y"); plt.legend(); plt.show()

用训练模型去对训练数据集预测,可以看到线性的模型并不能描述真实数据

(2)使用梯度下降的方式去训练多项式回归模型

设置模型为y=wx^{2}+b

# create target data
x = np.arange(0, 20, 1)
y = 1 + x**2# Engineer features 
X = x**2      #<-- added engineered featureX = X.reshape(-1, 1)  #X should be a 2-D Matrix
model_w,model_b = run_gradient_descent_feng(X, y, iterations=10000, alpha = 1e-5)plt.scatter(x, y, marker='x', c='r', label="Actual Value"); plt.title("Added x**2 feature")
plt.plot(x, np.dot(X,model_w) + model_b, label="Predicted Value"); plt.xlabel("x"); plt.ylabel("y"); plt.legend(); plt.show()

多项式模型预测效果和训练数据拟合,效果很好

(3)使用三次多项式回归模型训练

        y=w_{1}x+w_{2}x^{2}+w_{3}x^{3}+b

特征值为一次项,二次项,三次项

# create target data
x = np.arange(0, 20, 1)
y = x**2# engineer features .
X = np.c_[x, x**2, x**3]   #<-- added engineered feature

还是使用梯度下降法训练:

model_w,model_b = run_gradient_descent_feng(X, y, iterations=10000, alpha=1e-7)plt.scatter(x, y, marker='x', c='r', label="Actual Value"); plt.title("x, x**2, x**3 features")
plt.plot(x, X@model_w + model_b, label="Predicted Value"); plt.xlabel("x"); plt.ylabel("y"); plt.legend(); plt.show()

拟合的三次多项式:效果并不如二次多项式好

(4)从另一个角度来考虑选择什么样的模型更好的拟合训练数据

对x轴进行标度变换为X(大写),如果变换后的y和X(大写)满足线性关系,那么说明对x轴进行标度变换的函数就是比较好的回归模型

下面就是选择使用X=x,X=x^2,X=x^3作为标度变换模型来看y与标度变化后的X之间的关系:

# create target data
x = np.arange(0, 20, 1)
y = x**2# engineer features .
X = np.c_[x, x**2, x**3]   #<-- added engineered feature
X_features = ['x','x^2','x^3']
fig,ax=plt.subplots(1, 3, figsize=(12, 3), sharey=True)
for i in range(len(ax)):ax[i].scatter(X[:,i],y)ax[i].set_xlabel(X_features[i])
ax[0].set_ylabel("y")
plt.show()

很明显,经过x^2的标度变化后,y与X满足线性关系

(5)使用特征缩放对x,x^2,x^3进行处理以后的效果

使用z-score算法对特征进行缩放

# create target data
x = np.arange(0,20,1)
X = np.c_[x, x**2, x**3]
print(f"Peak to Peak range by column in Raw        X:{np.ptp(X,axis=0)}")# add mean_normalization 
X = zscore_normalize_features(X)     
print(f"Peak to Peak range by column in Normalized X:{np.ptp(X,axis=0)}")

使用缩放后的值进行模型训练:(注意预测的输入值也要进行缩放处理

x = np.arange(0,20,1)
y = x**2X = np.c_[x, x**2, x**3]
X = zscore_normalize_features(X) model_w, model_b = run_gradient_descent_feng(X, y, iterations=100000, alpha=1e-1)plt.scatter(x, y, marker='x', c='r', label="Actual Value"); plt.title("Normalized x x**2, x**3 feature")
plt.plot(x,X@model_w + model_b, label="Predicted Value"); plt.xlabel("x"); plt.ylabel("y"); plt.legend(); plt.show()

(6)使用特征工程还可以对复杂场景进行函数建模

对于完全拟合的函数y=cos(x)产生的数据集,我们使用复杂的多项式对这个数据集进行拟合

x = np.arange(0,20,1)
y = np.cos(x/2)X = np.c_[x, x**2, x**3,x**4, x**5, x**6, x**7, x**8, x**9, x**10, x**11, x**12, x**13]
X = zscore_normalize_features(X) model_w,model_b = run_gradient_descent_feng(X, y, iterations=1000000, alpha = 1e-1)plt.scatter(x, y, marker='x', c='r', label="Actual Value"); plt.title("Normalized x x**2, x**3 feature")
plt.plot(x,X@model_w + model_b, label="Predicted Value"); plt.xlabel("x"); plt.ylabel("y"); plt.legend(); plt.show()

拟合效果图示:

4.总结

        本小节通过基础知识讲解和实验学习了线性回归如何使用特征工程为复杂的、甚至高度非线性的函数建模;认识到在进行特征工程时应用特征缩放的重要性。


六、本章小结

        本章通过理论和实验的学习帮助我们用科学的方式为梯度下降选择一个好的学习率,了解不同的学习率选择对模型训练带来的效果,在直觉上也有助于我们更好的理解如何选择一个好的学习率。

        又通过基础知识讲解和实验学习了线性回归如何使用特征工程为复杂的、甚至高度非线性的函数建模,认识到在进行特征工程时应用特征缩放的重要性。


欢迎大家交流学习,如有错误请批评指正!

下一章将学习:分类相关内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1451797.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

填表统计预约打卡表单系统(FastAdmin+ThinkPHP+UniApp)

填表统计预约打卡表单系统&#xff1a;一键搞定你的预约与打卡需求​ 填表统计预约打卡表单系统是一款基于FastAdminThinkPHPUniApp开发的一款集信息填表、预约报名&#xff0c;签到打卡、活动通知、报名投票、班级统计等功能的自定义表单统计小程序。 &#x1f4dd; 一、引言…

SpringBoot集成mqtt上下线提醒功能设计

目录 1.首先安装emqx&#xff0c;去官网下载emqx压缩包&#xff0c;并且解压。 2.使用emqx start 命令启动emqx后台管理 3.下载mqttx调试工具&#xff0c;使用mqttx调试mqtt连接。下载地址:MQTTX下载-MQTTX官方版下载,下载完成直接打开&#xff0c;便可进行mqtt连接调试 4.…

Commons-Collections篇-CC4链分析

前言 因为 CommonsCollections4 除 4.0 的其他版本去掉了 InvokerTransformer 继承 Serializable&#xff0c;导致该方法无法序列化。 同时 CommonsCollections 4的版本 TransformingComparator 继承了 Serializable接口&#xff0c;而CommonsCollections 3里是没有的&#xf…

仿element-ui 实现自己组件库 <3>

目录 input 组件封装 v-model用在组件上 显示和隐藏密码 封装switch组件 实现转换的功能 设置checkbox input 组件封装 首先input组件的基本框架和样式&#xff1a; <div class"miao-input"><input class"miao-input_inner" > </div…

秋招突击——6/14——复习{(树形DP)树的最长路径}——新作{非递归求二叉树的深度、重复区间合并}

文章目录 引言复习树形DP——树的最长路径 新作使用dfs非递归计算二叉树的深度多个区间合并删除问题实现思路实现代码参考思路 总结 引言 这两天可能有点波动&#xff0c;但是算法题还是尽量保证复习和新作一块弄&#xff0c;数量上可能有所差别。 复习 树形DP——树的最长路…

Visual Studio Code 的安装教程和配置C语言环境插件推荐

目录 1.vscode简介2.下载安装vs code3.VSCode基础配置VSCode界面简介VSCode设置中文界面VSCode个性化设置VSCode常用设置基本编辑快捷键VSCode常用快捷键 4.下载安装MinGW5.设置vscode里的环境6.插件推荐7.vscode官方文档 1.vscode简介 VSCode是微软出的一款轻量级编辑器&…

WordPress实时搜索插件Ajax Search Lite,轻松替代默认搜索功能

WordPress自带的默认搜索功能是跳转到搜索结果页&#xff0c;如果你想要实时搜索功能&#xff0c;特别是在问答中心显示搜索功能&#xff0c;那么建议使用这个WordPress实时搜索插件Ajax Search Lite&#xff0c;它可以在文章、页面、自定义类型文章中搜索标题、内容、摘要、自…

八爪鱼现金流-022-mybatis插件加密和国密SM4算法

背景&#xff1a; 用户的金额数据&#xff0c;不希望被别人看到。 业务场景分析&#xff1a; 用户在页面上添加金额数据 -----> 服务器内存&#xff08;加密、解密&#xff09; -----> 存储数据库 调研及结果&#xff1a; 使用mybatis的拦截器插件&#xff0c;进行数…

LeetCode | 168.Excel表列名称

这道题一开始以为是简单的进制转换问题&#xff0c;用的以往的思路&#xff0c;对于一般性的进制转换题目&#xff0c;只需要不断地对 columnNumber 进行 % 运算取得最后一位&#xff0c;然后对 columnNumber 进行 / 运算&#xff0c;将已经取得的位数去掉&#xff0c;直到 col…

vue 渲染函数 h jsx

h 是什么 vue 提供的创建虚拟 DOM 节点 (vnode)的函数。 https://cn.vuejs.org/api/render-function.html#h jsx 是什么 JSX是 JavaScript XML&#xff08;HTML&#xff09;的缩写&#xff0c;表示在 JS 代码中书写 HTML 结构。简单理解就是&#xff1a; JSXjavascript xml&am…

机器学习:数据分布的漂移问题及应对方案

首先&#xff0c;让我们从一位高管告诉我的一个故事开始&#xff0c;很多读者可能对此感同身受。 大约两年前&#xff0c;他的公司聘请了一家咨询公司开发一个机器学习模型&#xff0c;帮助他们预测下周每种食品杂货需要多少&#xff0c;以便他们可以相应地补货。这家咨询公司…

PostgreSQL基础(十四):PostgreSQL的数据迁移

文章目录 PostgreSQL的数据迁移 PostgreSQL的数据迁移 PostgreSQL做数据迁移的插件非常多&#xff0c;可以从MySQL迁移到PostgreSQL也可以基于其他数据源迁移到PostgreSQL。 这种迁移的插件很多&#xff0c;这里只说一个&#xff0c;pgloader&#xff08;非常方便&#xff0…

Vulnhub-DC-9

靶机IP:192.168.20.144 kaliIP:192.168.20.128 网络有问题的可以看下搭建Vulnhub靶机网络问题(获取不到IP) 信息收集 nmap扫描一下端口及版本号 dirsearch扫目录 最后去前端界面观察发现也没什么隐藏路径。 观察功能&#xff0c;search引起注意&#xff0c;SQL注入测试 当输…

PPT: Pre-trained Prompt Tuning for Few-shot Learning

文章汇总 当前的问题 当前的学者(a)、(b)、©都是通过微调模型(encoder/decoder)来适应下游任务。尽管效果很好&#xff0c;但是一方面代价很大&#xff0c;一方面在小样本设置下&#xff0c;微调模型这种做法性能差得多。本文的想法&#xff1a;通过一些预训练任务仅冻结…

SringBoot 如何使用HTTPS请求及Nginx配置Https

SringBoot 如何使用HTTPS请求及Nginx配置Https SringBoot 如何使用HTTPS请求生成证书导入证书及配制创建配置类将pfx转成.key和.pem Nginx 安装SSL依赖./configure 安装依赖编译安装完openssl后报了新错 Nginx配置 SringBoot 如何使用HTTPS请求 生成证书 由于业务数据在传输过…

十分钟学会微调大语言模型

有同学给我留言说想知道怎么训练自己的大语言模型&#xff0c;让它更贴合自己的业务场景。完整的大语言模型训练成本比较高昂&#xff0c;不是我们业余玩家能搞的&#xff0c;如果我们只是想在某个业务场景或者垂直的方面加强大模型的能力&#xff0c;可以进行微调训练。 本文…

51交通灯

一、基本原理 利用51单片机控制各个路口红绿灯及时间显示。 设计的重点&#xff1a; 1、各个路口红绿灯亮灭的规则&#xff0c;暂不考虑左转方向&#xff1b; 2、倒计时的实现&#xff0c;利用单片机的定时器进行计数得到秒信号&#xff1b; 3、时间显示&#xff1a;东西南…

【LLM之RAG】Adaptive-RAG论文阅读笔记

研究背景 文章介绍了大型语言模型&#xff08;LLMs&#xff09;在处理各种复杂查询时的挑战&#xff0c;特别是在不同复杂性的查询处理上可能导致不必要的计算开销或处理不足的问题。为了解决这一问题&#xff0c;文章提出了一种自适应的查询处理框架&#xff0c;动态选择最合…

LeetCode | 434.字符串中的单词数

这道题直接使用语言内置的 split 函数可直接分离出字符串中的每个单词&#xff0c;但是要注意区分两种情况&#xff1a;1、空串&#xff1b;2、多个空格连续&#xff0c;分割后会出现空字符的情况&#xff0c;应该舍弃 class Solution(object):def countSegments(self, s):&qu…

通过MATLAB实现PID控制器,积分分离控制器以及滑模控制器

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 通过MATLAB实现PID控制器,积分分离控制器以及滑模控制器。通过对比三个算法可知&#xff0c;采用滑模控制算法&#xff0c;其具有最快的收敛性能&#xff0c;较强的鲁棒性&…