使用贝叶斯优化选择最优的机器学习超参数
BayesianOptimization
对象使用bayesopt
这个例子展示了如何创建一个BayesianOptimization
通过使用bayesopt
尽量减少交叉验证的损失。
优化了KNN分类器的超参数电离层
,即寻找最小化交叉验证损失的KNN超参数。有bayesopt
最小化以下超参数:
最近的邻居大小从1到30
距离函数“chebychev”
,“欧几里得”
,闵可夫斯基的
.
为了重现性,设置随机种子,设置分区,并设置AcquisitionFunctionName
选择“预期改善加成”
.若要抑制迭代显示,请设置“详细”
来0
.通过分区c
和拟合数据X
和Y
到目标函数有趣的
通过创建有趣的
作为包含该数据的匿名函数。看到参数化功能.
负载电离层rng默认的num = optimizableVariable (“不”(1、30),“类型”,“整数”);dst = optimizableVariable (dst的, {“chebychev”,“欧几里得”,闵可夫斯基的},“类型”,“分类”);c = cvpartition (351“Kfold”5);有趣= @ (x) kfoldLoss (fitcknn (x, Y,“CVPartition”c“NumNeighbors”x.n,...“距离”char (x.dst),“NSMethod”,“详尽”));结果= bayesopt(有趣,(num, dst),“详细”0,...“AcquisitionFunctionName”,“预期改善加成”)
results = BayesianOptimization with properties: ObjectiveFcn: [function_handle] VariableDescriptions: [1x2 optimizableVariable] Options: [1x1 struct] MinObjective: 0.1197 XAtMinObjective: [1x2 table] minestimatedobjobjective: 0.1213 xatminestimatedobjobjective: [1x2 table] numobjectiveevalues:30 TotalElapsedTime: 91.4349 NextPoint:[1 x2表]XTrace: [30 x2表]ObjectiveTrace: [30 x1双]ConstraintsTrace: [] UserDataTrace: {30 x1细胞}ObjectiveEvaluationTimeTrace: [30 x1双]IterationTimeTrace: [30 x1双]ErrorTrace: [30 x1双]FeasibilityTrace: [30 x1逻辑]FeasibilityProbabilityTrace: [30 x1双]IndexOfMinimumTrace: [30 x1双]ObjectiveMinimumTrace:[30x1 double] EstimatedObjectiveMinimumTrace: [30x1 double]
耦合约束是只能通过对目标函数求值来求值的约束。在这种情况下,目标函数是支持向量机模型的交叉验证损失。耦合约束是支持向量的个数不超过100。金宝app模型细节已经在里面了使用贝叶斯算法优化交叉验证的SVM分类器.
创建用于分类的数据。
rng默认的grnpop = mvnrnd((1,0)、眼睛(2),10);redpop = mvnrnd([0, 1],眼(2),10);redpts = 0 (100 2);grnpts = redpts;为i = 1:10 0 grnpts(我:)= mvnrnd (grnpop(兰迪(10):)、眼睛(2)* 0.02);redpts(我)= mvnrnd (redpop(兰迪(10):)、眼睛(2)* 0.02);结束cdata = [grnpts; redpts];grp = 1 (200 1);grp (101:200) = 1;c = cvpartition (200“KFold”10);σ= optimizableVariable (“σ”(1 e-5, 1 e5),“转换”,“日志”);盒= optimizableVariable (“盒子”(1 e-5, 1 e5),“转换”,“日志”);
目标函数是用于划分的SVM模型的交叉验证损失c
.这个coupled constraint is the number of support vectors minus 100.5. This ensures that 100 support vectors give a negative constraint value, but 101 support vectors give a positive value. The model has 200 data points, so the coupled constraint values range from -99.5 (there is always at least one support vector) to 99.5. Positive values mean the constraint is not satisfied.
函数[目标,约束]=mysvmfun(x,cdata,grp,c)SVMModel=fitcsvm(cdata,grp,“KernelFunction”,“rbf”,...“BoxConstraint”x.box,...“KernelScale”,x.sigma);cvModel=crossval(SVMModel,“CVPartition”c);目标= kfoldLoss (cvModel);约束=总和(SVMModel.IsSupportVect金宝appor) -100.5;
通过分区c
和拟合数据cdata
和grp
到目标函数有趣的
通过创建有趣的
作为包含该数据的匿名函数。看到参数化功能.
有趣= @ (x) mysvmfun (x, cdata, grp, c);
设置NumCoupledConstraints
来1
优化器知道存在耦合约束。设置绘制约束模型的选项。
结果= bayesopt(有趣,σ,盒子,“IsObjectiveDeterministic”,真的,...“NumCoupledConstraints”,1,“PlotFcn”,...{@plotMinObjective, @plotConstraintModels},...“AcquisitionFunctionName”,“预期改善加成”,“详细”, 0);
大多数点导致支持向量的数目不可行。金宝app
利用并行目标函数评价提高贝叶斯优化的速度。
为贝叶斯优化准备变量和目标函数。
目标函数是电离层数据的交叉验证错误率,这是一个二元分类问题。使用fitcsvm
作为分类器,用BoxConstraint
和核尺度
作为优化的参数。
负载电离层盒= optimizableVariable (“盒子”(1的军医,1 e3),“转换”,“日志”);kern = optimizableVariable (“仁”(1的军医,1 e3),“转换”,“日志”);var =(盒子,kern);有趣= @ (var) kfoldLoss (fitcsvm (X, Y,“BoxConstraint”vars.box,“KernelScale”vars.kern,...“Kfold”5));
使用并行贝叶斯优化来搜索给出最低交叉验证误差的参数。
结果= bayesopt (var,有趣“UseParallel”,真正的);
复制目标函数给工人…完成向工人复制目标函数。
|===============================================================================================================| | Iter | |活跃Eval客观客观| | | BestSoFar | BestSoFar盒| | kern | | |工人结果| | |运行时|(观察)| (estim) | | ||===============================================================================================================| | 1 | 2 |接受| 0.2735 | 0.56171 | 0.13105 | 0.13108 | 0.0002608 | 0.2227 | | 2 | 2 |接受| 0.35897 | 0.4062 | 0.13105 | 0.13108 | 3.6999 | 344.01 | | 3 | 2 |接受| 0.13675 | 0.42727 | 0.13105 | 0.13108 | 0.33594 | 0.39276 | |4 | 2 |接受| 0.35897 | 0.4453 | 0.13105 | 0.13108 | 0.014127 | 449.58 | | 5 | 2 |最佳| 0.13105 | 0.45503 | 0.13105 | 0.13108 | 0.29713 | 1.0859 |
| 6 | 6 |接受| 0.35897 | 0.16605 | 0.13105 | 0.13108 | 8.1878 | 256.9 |
| 7 | 5 |最佳| 0.11396 | 0.51146 | 0.11396 | 0.11395 | 8.7331 | 0.7521 | | 8 | 5 b|接受| 0.14245 | 0.24943 | 0.11396 | 0.11395 | 0.0020774 | 0.022712 |
| 9 | 6 |最佳| 0.10826 | 4.0711 | 0.10826 | 0.10827 | 0.0015925 | 0.0050225 |
| 10 | 6 |接受| 0.25641 | 16.265 | 0.10826 | 0.10829 | 0.00057357 | 0.00025895 |
|11 | 6 |接受| 0.1339 | 15.581 | 0.10826 | 0.10829 | 1.4553 | 0.011186|
| 12 | 6 |接受| 0.16809 | 19.585 | 0.10826 | 0.10828 | 0.26919 | 0.00037649 |
| 13 | 6 |接受| 0.20513 | 18.637 | 0.10826 | 0.10828 | 369.59 | 0.099122 |
| 14 | 6 |接受| 0.12536 | 0.11382 | 0.10826 | 0.10829 | 5.7059 | 2.5642 |
| 15 | 6 |接受| 0.13675 | 2.63 | 0.10826 | 0.10828 | 984.19 | 2.2214 |
|16 | 6 |接受| 0.12821 | 2.0743 | 0.10826 | 0.11144 | 0.0063411 | 0.0090242|
| 17 | 6 |接受| 0.1339 | 0.1939 | 0.10826 | 0.11302 | 0.00010225 | 0.0076795 |
|18 | 6 |接受| 0.12821 | 0.20933 | 0.10826 | 0.11376 | 7.7447 | 1.2868|
| | 4 | 19日接受| 0.55556 | 17.564 | 0.10826 | 0.10828 | 0.0087593 | 0.00014486 | | 20 | 4 |接受| 0.1396 | 16.473 | 0.10826 | 0.10828 | 0.054844 | 0.004479 | |===============================================================================================================| | Iter | |活跃Eval客观客观| | | BestSoFar | BestSoFar |box | kern | | | workers | result | | runtime | (observed) | (estim.) | | | |===============================================================================================================| | 21 | 4 | Accept | 0.1339 | 0.17127 | 0.10826 | 0.10828 | 9.2668 | 1.2171 |
| 22 | 4 |接受| 0.12821 | 0.089065 | 0.10826 | 0.10828 | 12.265 | 8.5455 |
| 23 | 4 |接受| 0.12536 | 0.073586 | 0.10826 | 0.10828 | 1.3355 | 2.8392 |
| 24 | 4 |接受| 0.12821 | 0.08038 | 0.10826 | 0.10828 | 131.51 | 16.878 |
| 25 | 3 |接受| 0.11111 | 10.687 | 0.10826 | 0.10867 | 1.4795 | 0.041452 | | 26 | 3 |接受| 0.13675 | 0.18626 | 0.10826 | 0.10867 | 2.0513 | 0.70421 |
| 27 | 6 |接受| 0.12821 | 0.078559 | 0.10826 | 0.10868 | 980.04 | 44.19 |
| 28 | 5 |接受| 0.33048 | 0.089844 | 0.10826 | 0.10843 | 0.41821 | 10.208 | | 29 | 5 |接受| 0.16239 | 0.12688 | 0.10826 | 0.10843 | 172.39 | 141.43 |
| 30 | 5 |接受| 0.11966 | 0.14597 | 0.10826 | 0.10846 | 639.15 | 14.75 |
__________________________________________________________优化完成。MaxObjectiveEvaluations达到30。总功能评估:30总运行时间:48.2085秒。总目标功能评估时间:128.3472最佳观察可行点:box kern____________;0.0015925 0.0050225观察到的目标功能v值=0.10826估计目标函数值=0.10846函数评估时间=4.0711最佳估计可行点(根据模型):box-kernuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
返回贝叶斯模型中的最佳可行点结果
通过使用bestPoint
函数。使用默认条件min-visited-upper-confidence-interval
,确定最佳可行点为使目标函数值上置信区间最小的访问点。
zb = bestPoint(结果)
zb =1×2表框kern _________ _________ 0.0015925 0.0050225
表兹贝斯特
的最佳估计值“BoxConstraint”
和“KernelScale”
名称-值对参数。使用这些值来训练一个新的优化分类器。
Mdl = fitcsvm (X, Y,“BoxConstraint”zbest.box,“KernelScale”, zbest.kern);
观察最优参数在Mdl
.
Mdl.BoxConstraints (1)
ans = 0.0016
Mdl.KernelParameters.Scale
ans = 0.0050
有趣的
- - - - - -目标函数并行池常数
谁的价值
是函数句柄。目标函数,指定为函数句柄或UseParallel
名称-值对是真正的
,一个并行池常数
(并行计算工具箱)谁的价值
是函数句柄。通常情况下,有趣的
为具有可调超参数来控制其训练的机器学习模型返回损失(如误分类错误)的度量。有趣的
这些签名:
目标=乐趣(x)%或(目标、约束)(x) =乐趣%或[目标、约束、用户数据]=fun(x)
有趣的
接受x
, 1 -D
变量值表,并返回客观的
,表示目标函数值的实标量有趣的(x)
.
可选地,有趣的
返回:
有关使用的细节并行池常数
与bayesopt
,请参阅把目标函数放在工人身上.
例子:@objfun
数据类型:function_handle
var
- - - - - -变量描述optimizableVariable
对象定义要调优的超参数变量描述,指定为的向量optimizableVariable
对象定义要调优的超参数。
例子:(X1, X2)
,在那里X1
和X2
是optimizableVariable
对象
指定可选的逗号分隔的对名称,值
参数。的名字
参数名和价值
为对应值。的名字
必须出现在引号内。可以以任意顺序指定多个名称和值对参数名称1,值1,…,名称,值
.
结果= bayesopt(乐趣、var AcquisitionFunctionName, expected-improvement-plus)
“AcquisitionFunctionName”
- - - - - -函数来选择下一个计算点“每秒的预期改进数加上”
(默认)|“expected-improvement”
|“预期改善加成”
|“expected-improvement-per-second”
|“lower-confidence-bound”
|“probability-of-improvement”
函数选择下一个计算点,指定为列出的选项之一。
获取函数的名称包括每秒
不会产生可重复的结果,因为优化依赖于目标函数的运行时间。获取函数的名称包括+
当他们过度开发一个区域时,调整他们的行为。有关详细信息,请参见获取函数类型.
例子:“AcquisitionFunctionName”、“expected-improvement-per-second”
“IsObjectiveDeterministic”
- - - - - -指定确定性目标函数假
(默认)|真正的
指定确定性目标函数,指定为假
或真正的
.如果有趣的
是随机的(也就是说,有趣的(x)
可以返回相同的不同值吗x
),然后设置IsObjectiveDeterministic
来假
.在这种情况下,bayesopt
估计优化期间的噪音水平。
例子:“IsObjectiveDeterministic”,真的
数据类型:逻辑
“ExplorationRatio”
- - - - - -探索倾向0.5
(默认)|积极的现实“GPActiveSetSize”
- - - - - -拟合高斯过程模型GPActiveSetSize
或更少点300
(默认)|正整数拟合高斯过程模型GPActiveSetSize
或更少的点,指定为正整数。当bayesopt
参观过的GPActiveSetSize
点,使用适合模型的GP模型的后续迭代GPActiveSetSize
要点。bayesopt
均匀随机选取点,访问点之间不进行替换。使用更少的点会导致更快的GP模型拟合,但可能会牺牲更不精确的拟合。
例子:“GPActiveSetSize”,80年
数据类型:双
“UseParallel”
- - - - - -并行计算假
(默认)|真正的
并行计算,指定为假
(不并行计算)或真正的
(并行计算)。并行计算需要并行计算工具箱™。
bayesopt
对并行工作进程同时执行并行目标函数计算。有关算法详细信息,请参阅平行的贝叶斯优化.
例子:“UseParallel”,真的
数据类型:逻辑
“ParallelMethod”
- - - - - -并行工作者目标函数值的归算方法“clipped-model-prediction”
(默认)|模型预测的
|“max-observed”
|“min-observed”
并行工作者目标函数值的归算方法,具体为“clipped-model-prediction”
,模型预测的
,“max-observed”
,或“min-observed”
.为了生成一个新的点来评估,bayesopt
适用于所有点的高斯过程,包括对工人进行评估的点。为了适应这个过程,bayesopt
为当前在工人身上的点输入目标函数值。ParallelMethod
指定用于插补的方法。
“clipped-model-prediction”
-计算这些数量的最大值:
点处的平均高斯过程预测x
访问的可行点中观测到的最小目标函数
所有可行点中的最小模型预测
模型预测的
-输入点的平均高斯过程预测x
.
“max-observed”
-在可行点之间输入观测到的目标函数的最大值。
“min-observed”
-在可行点之间输入观测目标函数的最小值。
例子:“ParallelMethod”、“max-observed”
“MinWorkerUtilization”
- - - - - -对活动并行工作器数量的容忍地板(0.8 * Nworkers)
(默认)|正整数活动并行工作器数量的公差,指定为正整数。后bayesopt
指定要计算的点,并且在计算要分配的新点之前,检查是否小于MinWorkerUtilization
工人是活跃的。如果是这样,bayesopt
在限定范围内给所有可用的工作人员分配随机点。否则,bayesopt
计算一个工人的最佳点。bayesopt
创建随机点的速度比拟合点快得多,因此这种行为导致更高的工人利用率,以可能较差的点为代价。有关详细信息,请参见平行的贝叶斯优化.
例子:“MinWorkerUtilization”,3
数据类型:双
“MaxObjectiveEvaluations”
- - - - - -目标函数评价极限30.
(默认)|正整数目标函数的评价极限,指定为正整数。
例子:“MaxObjectiveEvaluations”,60
数据类型:双
“NumSeedPoints”
- - - - - -初始评估点数4
(默认)|正整数“XConstraintFcn”
- - - - - -变量的确定性约束[]
(默认)|函数处理变量的确定性约束,指定为函数句柄。
有关详细信息,请参见确定性约束- XConstraintFcn.
例子:XConstraintFcn, @xconstraint
数据类型:function_handle
“ConditionalVariableFcn”
- - - - - -条件变量约束[]
(默认)|函数处理“NumCoupledConstraints”
- - - - - -耦合约束数0
(默认)|正整数耦合约束的数量,指定为正整数。有关详细信息,请参见耦合约束.
请注意
NumCoupledConstraints
当具有耦合约束时,需要。
例子:“NumCoupledConstraints”,3
数据类型:双
“AreCoupledConstraintsDeterministic”
- - - - - -指示耦合约束是否确定真正的
对于所有耦合约束(默认)|逻辑向量指示耦合约束是否确定,指定为长度逻辑向量NumCoupledConstraints
.有关详细信息,请参见耦合约束.
例子:“AreCoupledConstraintsDeterministic”(真的,假,真的)
数据类型:逻辑
“详细”
- - - - - -命令行显示水平1
(默认)|0
|2
命令行显示级别,指定为0
,1
,或2
.
0
—没有命令行显示。
1
-在每次迭代时,显示迭代次数、结果报告(见下一段)、目标函数模型、目标函数评估时间、最佳(最低)观测目标函数值、最佳(最低)估计目标函数值、观测约束值(如果有)。当并行优化时,显示还包括一个列,显示活动工作者的数量,在将一个作业分配给下一个工作者后计算。
每个迭代的结果报告如下:
接受
-目标函数返回一个有限值,且满足所有约束条件。
最好的
-满足约束条件,目标函数返回可行点中最小值。
错误
-目标函数返回一个非有限实标量的值。
Infeas
—至少违反了一个约束。
2
-同1
,添加诊断信息,如选择下一个点的时间、模型拟合时间、“加”获取函数声明过度利用的指示,以及由于并行利用率低而将并行工作者分配到随机点。
例子:“详细”,2
数据类型:双
“OutputFcn”
- - - - - -每次迭代后调用的函数{}
(默认)|函数处理|函数句柄的单元格数组每次迭代后调用的函数,指定为函数句柄或函数句柄的单元数组。输出函数可以停止求解器,并可以执行任意计算,包括创建变量或绘图。使用函数句柄的单元格数组指定几个输出函数。
有两个内置的输出函数:
@assignInBase
构造一个BayesianOptimization
实例,并将其赋值给基本工作区中的一个变量。属性选择一个变量名SaveVariableName
名称-值对。
@saveToFile
构造一个BayesianOptimization
实例,并将其保存到当前文件夹中的文件中。属性选择一个文件名SaveFileName
名称-值对。
您可以编写自己的输出函数。有关详细信息,请参见贝叶斯优化输出函数.
例子:OutputFcn, {@saveToFile @myOutputFunction}
数据类型:细胞
|function_handle
“SaveFileName”
- - - - - -的文件名@saveToFile
输出函数“BayesoptResults.mat”
(默认)|特征向量|字符串标量的文件名@saveToFile
输出函数,指定为字符向量或字符串标量。文件名可以包含路径,例如“. . /优化/ September2.mat”
.
例子:“SaveFileName”、“September2.mat”
数据类型:字符
|字符串
“SaveVariableName”
- - - - - -的变量名@assignInBase
输出函数“BayesoptResults”
(默认)|特征向量|字符串标量的变量名@assignInBase
输出函数,指定为字符向量或字符串标量。
例子:“SaveVariableName”、“September2Results”
数据类型:字符
|字符串
“PlotFcn”
- - - - - -每次迭代后调用的Plot函数{@plotObjectiveModel, @plotMinObjective}
(默认)|“所有”
|函数处理|函数句柄的单元格数组每次迭代后调用的绘图函数,指定为“所有”
、函数句柄或函数句柄的单元格数组。plot函数可以停止求解器,并可以执行任意计算,包括创建变量和绘图。
指定没有绘图功能为[]
.
“所有”
调用所有内置的绘图函数。使用函数句柄的单元格数组指定几个绘图函数。
内置的plot函数如下表所示。
模型图-当D≤2时应用 | 描述 |
---|---|
@plotAcquisitionFunction |
绘制采集函数曲面。 |
@plotConstraintModels |
绘制每个约束模型曲面。负值表示可行点。 也画一个P(可行的)表面。 还绘制误差模型,如果它存在,它的范围是 绘制误差= 2*概率(误差)- 1。 |
@plotObjectiveEvaluationTimeModel |
绘制目标函数评价时间模型曲面。 |
@plotObjectiveModel |
画出 |
轨迹图-适用于所有D | 描述 |
---|---|
@情节目标 |
绘制每个观察到的函数值与函数求值次数的关系图。 |
@plotObjectiveEvaluationTime |
绘制每个观察到的函数求值运行时与函数求值次数的关系图。 |
@plotMinObjective |
将观察到的和估计的最小函数值与函数计算的次数绘制出来。 |
@plotElapsedTime |
绘制三条曲线:优化的总运行时间、总功能评估时间、总建模和点选择时间,所有曲线都与功能评估的数量相对应。 |
您可以编写自己的绘图函数。有关详细信息,请参阅贝叶斯优化图函数.
请注意
当存在耦合约束时,迭代显示和绘图函数可能会给出反直觉的结果,如:
一个最低目标情节可以增加。
优化可以宣布一个问题不可行,即使它显示了一个较早的可行点。
这种行为的原因是,关于某一点是否可行的决定可以随着优化的进行而改变。bayesopt
根据其约束模型确定可行性,该模型变化为bayesopt
评估点。因此,当最小目标点后来被认为不可行时,“最小目标”图就会增加,而迭代显示可以显示一个后来被认为不可行的可行点。
例子:“PlotFcn”、“所有”
数据类型:字符
|字符串
|细胞
|function_handle
“InitialX”
- - - - - -最初的评估点NumSeedPoints
——- - - - - -D
在边界内的随机初始点(默认)|N
——- - - - - -D
表格初始评估点,指定为N
——- - - - - -D
表,N
是多少评价点,和D
是变量的数量。
请注意
如果只有InitialX
时,将其解释为要计算的初始点。目标函数的取值为InitialX
.
如果还提供了任何其他初始化参数,InitialX
被解释为先验函数求值数据。不计算目标函数。任何缺失的值都被设置为南
.
数据类型:表格
“InitialObjective”
- - - - - -对应的客观值InitialX
[]
(默认)|长度,N
向量对应的客观值InitialX
,指定为长度-N
向量,N
为评价点数。
例子:“InitialObjective”,(17;3;-12.5)
数据类型:双
“初始约束冲突”
- - - - - -耦合约束的约束冲突[]
(默认)|N
——- - - - - -K
矩阵耦合约束的约束违反,指定为N
——- - - - - -K
矩阵,在哪里N
是多少评价点和K
为耦合约束的个数。有关详细信息,请参见耦合约束.
数据类型:双
“InitialErrorValues”
- - - - - -错误InitialX
[]
(默认)|长度,N
向量和条目-1
或1
错误InitialX
,指定为长度-N
向量和条目-1
或1
,在那里N
为评价点数。指定-1
没有错误,而且1
为一个错误。
例子:'InitialErrorValues',[-1,-1,-1,1]
数据类型:双
“InitialUserData”
- - - - - -对应于InitialX
[]
(默认)|长度,N
细胞向量“InitialObjectiveEvaluationTimes”
- - - - - -目标函数的求值次数为InitialX
[]
(默认)|长度,N
向量目标函数的求值次数为InitialX
,指定为长度-N
向量,N
是评估点数。时间以秒为单位。
数据类型:双
“InitialIterationTimes”
- - - - - -第一次时间N
迭代{}
(默认)|长度,N
向量第一次时间N
迭代,指定为长度-N
向量,N
是评估点数。时间以秒为单位。
数据类型:双
结果
-贝叶斯优化结果BayesianOptimization
对象贝叶斯优化结果,返回为BayesianOptimization
对象。
要并行运行,请设置“UseParallel”
将值参数命名为真正的
在对该函数的调用中。
有关并行计算的更多通用信息,请参见运行MATLAB函数与自动并行支持金宝app(并行计算工具箱).
你点击一个链接对应于这个MATLAB命令:
通过在MATLAB命令窗口中输入命令来运行命令。Web浏览器不支持MATLAB命令。金宝app
你也可以从以下列表中选择一个网站:
选择中国网站(中文或英文)以获得最佳网站性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。