从曲线拟合到机器学习:计算性能与方法探讨
立即解锁
发布时间: 2025-08-23 02:00:42 阅读量: 1 订阅数: 4 

# 从曲线拟合到机器学习:计算性能与方法探讨
在从曲线拟合过渡到机器学习的过程中,我们常常会遇到两类问题。一类是因追求可读性和可理解性而被省略的大量细节和旁支内容;另一类则是更抽象、更具普遍性的问题,比如机器学习的基本能力。下面我们将深入探讨一些之前被忽视的话题。
## 1. 计算速度至关重要
在实际应用中,计算速度是一个关键因素。如果对完成一项计算任务所需的资源和时间没有大致的估算,那么研究工作很可能会中途放弃。
### 1.1 性能问题分析
我们讨论的所有方法在数学上都可归结为优化问题,可通过逐步迭代的过程来解决。对于特定问题的性能评估,可分为两个方面:
- 单次优化步骤所需的时间。
- 达到成功结果所需的步骤数。
对于第一个问题,大多数实际应用都能得到近似答案;但第二个问题,对于非线性优化问题,通常无法提前得知所需的迭代次数(线性优化问题通常能在短时间内成功解决)。综合来看,我们往往无法确切知晓性能表现。不过,凭借一些实用的经验法则、过往类似问题的处理经验以及初步估算方法,在许多实际相关的情况下,我们能得到较为乐观的结果。
### 1.2 不同任务的时间消耗
如今,曲线拟合通常能快速完成,而聚类和机器学习则属于典型的批处理任务,所需时间从几分钟(针对小问题)到数小时、数天甚至更久不等,这些任务一般在后台运行,无需持续监控或等待。
### 1.3 算法的缩放行为
一种方法的计算时间消耗特性与其问题规模的变化有关。例如,对 K 条数据记录进行逐次精确搜索,所需的最长时间为“检测单条记录所需时间”乘以 K。若数据记录数量翻倍至 2K,所需的最长时间也会翻倍。这种顺序搜索的缩放行为为 O(K),即数据规模与搜索速度呈线性关系。
而更高效的算法,如二叉树搜索的缩放行为为 O(log₂K),哈希表搜索为 O(1)。O(log₂K) 表示搜索时间随数据规模呈对数增长;O(1) 则意味着搜索速度与数据规模无关。虽然缩放行为不能说明使用不同方法搜索 12 条数据记录所需的绝对时间,但它表明哈希表搜索在处理大数据量时最终会超越其他方法。
### 1.4 计算时间估算示例
为了演示计算时间的估算,我们再次利用之前讨论过的回归问题:
```mathematica
pureOriginalFunction=Function[{x,y},
1.9*(1.35+Exp[x]*Sin[13.0*(x-0.6)^2]*Exp[-y]* Sin[7.0*y])];
xRange={0.0,1.0};
yRange={0.0,1.0};
numberOfDataPerDimension=10;
standardDeviationRange={0.1,0.1};
dataSet3D=CIP‘CalculatedData‘Get3dFunctionBasedDataSet[
pureOriginalFunction,xRange,yRange,numberOfDataPerDimension,
standardDeviationRange];
labels={"x","y","z"};
CIP‘Graphics‘Plot3dDataSetWithFunction[dataSet3D,
pureOriginalFunction,labels]
```
通过改变网格点的数量(即数据集的输入/输出对数量),我们可以分析不同机器学习方法随数据集规模增大的缩放行为。使用 CIP 包提供的机器学习方法实现,通过 Mathematica 的 `AbsoluteTiming` 命令测量特定 `Fit` 过程所消耗的时间,并将其显示在输入/输出对数量与训练周期的图表中。
#### 1.4.1 多元线性回归(MLR)
```mathematica
xyErrorData={};
rmsePoints2D={};
Do[
dataSet3D=CIP‘CalculatedData‘Get3dFunctionBasedDataSet[
pureOriginalFunction,xRange,yRange,numberOfDataPerDimension,
standardDeviationRange];
result=AbsoluteTiming[CIP‘MLR‘FitMlr[dataSet3D]];
trainingPeriod=result[[1]];
mlrInfo=result[[2]];
numberOfIoPairs=numberOfDataPerDimension*numberOfDataPerDimension;
AppendTo[xyErrorData,{numberOfIoPairs,trainingPeriod,1.0}];
AppendTo[rmsePoints2D,{numberOfIoPairs,
CIP‘MLR‘CalculateMlrDataSetRmse[dataSet3D,mlrInfo]}],
{numberOfDataPerDimension,5,100,5}
];
minExponent=1.0;
maxExponent=4.0;
exponentStepSize=0.1;
exponentLabels={"Number of I/O pairs (K)","Training period [s]",
"Training period = O(K^exponent)"};
CIP‘CurveFit‘ShowBestExponent[xyErrorData,minExponent,maxExponent,
exponentStepSize,CurveFitOptionLabels -> exponentLabels];
```
在广泛的数据集规模范围内(从 25 到 10000 个输入/输出对),训练周期与输入/输出对数量 K 呈线性关系(O(K),对应“最佳指数”为 1.0)。每次 MLR 拟合都能在数秒内完成,这种线性缩放行为是机器学习方法的理想情况,也证实了线性方法速度快的普遍观点。然而,MLR 方法对于非线性回归任务完全不适用,通过检查回归结果的均方根误差(RMSE)值可以发现这一点。
#### 1.4.2 支持向量机(SVM)
```mathematica
kernelFunction={"Wavelet",0.3};
xyErrorData={};
rmsePoints2D={};
Do[
dataSet3D=CIP‘CalculatedData‘Get3dFunctionBasedDataSet[
pureOriginalFunction,xRange,yRange,numberOfDataPerDimension,
standardDeviationRange];
result=AbsoluteTiming[CIP‘SVM‘FitSvm[dataSet3D,kernelFunction]];
trainingPeriod=result[[1]];
svmInfo=result[[2]];
numberOfIoPairs=numberOfDataPerDimension*numberOfDataPerDimension;
AppendTo[xyErrorData,{numberOfIoPairs,trainingPeriod,1.0}];
AppendTo[rmsePoints2D,{numberOfIoPairs,
CIP‘SVM‘CalculateSvmDataSetRmse[dataSet3D,svmInfo]}],
{numberOfDataPerDimension,5,20}
];
CIP‘CurveFit‘ShowBestExponent[xyErrorData,minExponent,maxExponent,
exponentStepSize,CurveFitOptionLabels -> exponentLabels];
```
对于 25 到 400 个输入/输出对的数据范围,训练周期的缩放行为为 O(K³.⁶)。与快速的 MLR 拟合相比,SVM 拟合速度极慢。按照这种多项式缩放,对 1000 个输入/输出对进行单次 SVM 拟合
0
0
复制全文
相关推荐










