曲线拟合到机器学习的深入探讨
1. 计算速度的重要性
在实际应用中,计算速度是一个至关重要的因素。对于从曲线拟合到机器学习的各种方法,若无法大致估算所需的计算资源和时间,研究工作可能会被迫放弃。所有讨论过的方法在数学上都可归结为优化问题,可通过逐步迭代的程序来解决。对于特定问题的性能评估,可分为两个方面:
1. 单个优化步骤所需的时间。
2. 达到成功结果所需的步骤数。
对于大多数实际应用,第一个问题可以得到近似答案,但第二个问题通常难以回答,尤其是对于非线性优化问题。不过,凭借一些实用的经验法则、过往类似问题的处理经验以及初步估算程序,在许多实际情况下,我们可以得到较为乐观的结果。
一般来说,使用现代计算机进行曲线拟合通常可以快速完成,而聚类和机器学习则是典型的批处理任务,可能需要几分钟到数小时甚至更长时间。
2. 不同搜索算法的性能分析
不同的搜索算法在处理不同规模的数据时,性能表现差异很大。以下是几种常见搜索算法的性能对比:
| 搜索算法 | 时间复杂度 | 说明 |
| ---- | ---- | ---- |
| 顺序搜索 | O(K) | 数据规模与搜索时间呈线性关系,是精确数据搜索的最坏情况 |
| 二叉树搜索 | O(log₂K) | 搜索时间随数据规模呈对数增长 |
| 哈希表搜索 | O(1) | 搜索速度与数据规模无关,是搜索算法的理想状态 |
下面通过一个示例来演示如何估算不同机器学习方法在处理不同规模数据集时的计算时间。
2.1 生成数据集
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]
2.2 多元线性回归(MLR)分析
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];
通过上述代码,我们可以得到MLR方法在不同数据集规模下的训练时间,并分析其时间复杂度。结果显示,在从K = 25到K = 10000的数据集规模范围内,训练时间与I/O对数量呈线性关系(O(K)),每个MLR拟合可以在几分之一秒内完成。然而,MLR方法对于非线性回归任务并不适用,通过检查回归结果的RMSE值可以发现,其值远高于预期。
2.3 支持向量机(SVM)分析
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];
对于SVM方法,在从K = 25到K = 400的数据集规模范围内,训练时间的时间复杂度为O(K³.⁶)。与MLR方法相比,SVM拟合速度非常慢,对于较大的数据集,CIP默认实现的SVM方法可能变得不可行。不过,SVM方法在拟合质量上表现较好,RMSE值分布在预期值附近。
2.4 感知机分析
numberOfHiddenNeurons = 12;
xyErrorData = {};
rmsePoints2D = {};
Do[
dataSet3D = CIP‘CalculatedData‘Get3dFunctionBasedDataSet[
pureOriginalFunction, xRange, yRange, numberOfDataPerDimension,
standardDeviationRange];
result = AbsoluteTiming[CIP‘Perceptron‘FitPerceptron[dataSet3D,
numberOfHiddenNeurons]];
trainingPeriod = result[[1]];
perceptronInfo = result[[2]];
numberOfIoPairs = numberOfDataPerDimension*numberOfDataPerDimension;
AppendTo[xyErrorData, {numberOfIoPairs, trainingPeriod, 1.0}];
AppendTo[rmsePoints2D, {numberOfIoPairs,
CIP‘Perceptron‘CalculatePerceptronDataSetRmse[dataSet3D,
perceptronInfo]}],
{numberOfDataPerDimension, 5, 20}
];
CIP‘CurveFit‘ShowBestExponent[xyErrorData, minExponent, maxExponent,
exponentStepSize, CurveFitOptionLabels -> exponentLabels];
感知机方法的训练时间复杂度接近线性(O(K¹.¹)),且单个训练比默认CIP实现的SVM方法快约一个数量级。然而,检查回归结果发现,感知机拟合的RMSE值在大多数数据集规模下未达到预期。
通过增加最大迭代次数进行进一步分析,结果显示最大迭代次数参数并非导致问题的原因,其他可能的原因需要进一步检查。
综上所述,在实际应用中,对不同方法进行公平比较时,需要考虑所有这些细微差异,如速度、缩放行为、内存消耗等。在应用非线性迭代优化程序处理实际问题之前,建议先进行初步的速度、缩放行为和内存消耗等方面的研究。
3. 机器学习方法的认知差异
从曲线拟合到机器学习的各种方法,在从业者眼中的认知差异很大。有人认为它们只是纯粹的技术工具,而有人则将其视为具有“科学智慧”和“神奇魔力”的方法。这种差异可能与曲线拟合结果可以直观检查,而聚类和机器学习结果更复杂、难以理解有关。在科学教育中,学生对机器学习也表现出期待和好奇。
3.1 机器学习是否只是优化?
当了解到机器学习方法的基本原理是数学优化问题时,很多人会感到失望,认为“这不就是优化吗?”。优化任务听起来简单,但实际上,优化的细节决定了成败,而且优化问题与许多极具挑战性的科学问题密切相关,如蛋白质折叠问题。因此,我们应该对优化这一领域给予足够的尊重。
3.2 机器学习是否只是数据平滑?
另一个常见的观点是,机器学习只是数据平滑,只能对数据进行全面描述和插值,无法提供新的见解。下面通过一个示例来探讨这个问题。
3.2.1 生成数据集
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, 0.5};
yRange = {0.0, 0.5};
numberOfDataPerDimension = 10;
standardDeviationRange = {0.75, 0.75};
dataSet3D = CIP‘CalculatedData‘Get3dFunctionBasedDataSet[
pureOriginalFunction, xRange, yRange, numberOfDataPerDimension,
standardDeviationRange];
labels = {"x", "y", "z"};
viewPoint3D = {1.9, -3.0, 0.9};
CIP‘Graphics‘Plot3dDataSetWithFunction[dataSet3D,
pureOriginalFunction, labels,
GraphicsOptionViewPoint3D -> viewPoint3D]
3.2.2 找到数据集的最大值
FindMaximum[pureOriginalFunction[x, y], {x, 0.2}, {y, 0.2}]
3.2.3 在最大值位置生成数据空洞
reducedDataSet3D = {};
Do[
If[!(dataSet3D[[i, 1, 1]] > 0.1 && dataSet3D[[i, 1, 1]] < 0.4 &&
dataSet3D[[i, 1, 2]] > 0.1 && dataSet3D[[i, 1, 2]] < 0.4),
AppendTo[reducedDataSet3D, dataSet3D[[i]]]
],
{i, Length[dataSet3D]}
];
CIP‘Graphics‘Plot3dDataSetWithFunction[reducedDataSet3D,
pureOriginalFunction, labels,
GraphicsOptionViewPoint3D -> viewPoint3D]
3.2.4 使用感知机进行函数逼近
numberOfHiddenNeurons = 3;
perceptronInfo = CIP‘Perceptron‘FitPerceptron[reducedDataSet3D,
numberOfHiddenNeurons];
purePerceptron3dFunction = Function[{x, y},
CIP‘Perceptron‘CalculatePerceptron3dValue[x, y, perceptronInfo]];
viewPoint3D = {1.9, -3.0, 0.9};
CIP‘Graphics‘Plot3dDataSetWithFunction[reducedDataSet3D,
purePerceptron3dFunction, labels,
GraphicsOptionViewPoint3D -> viewPoint3D]
3.2.5 找到逼近函数的最大值
FindMaximum[purePerceptron3dFunction[x, y], {x, 0.2}, {y, 0.2}]
3.2.6 使用SVM进行回归
kernelFunction = {"Wavelet", 0.5};
svmInfo = CIP‘SVM‘FitSvm[reducedDataSet3D, kernelFunction];
pureSvm3dFunction = Function[{x, y},
CIP‘SVM‘CalculateSvm3dValue[x, y, svmInfo]];
CIP‘Graphics‘Plot3dDataSetWithFunction[reducedDataSet3D,
pureSvm3dFunction, labels, GraphicsOptionViewPoint3D -> viewPoint3D]
3.2.7 找到SVM逼近函数的最大值
FindMaximum[pureSvm3dFunction[x, y], {x, 0.2}, {y, 0.2}]
通过上述示例可以看出,尽管数据存在误差且未覆盖最大值区域,但机器学习方法仍有可能揭示出最大值。然而,如果数据空洞进一步扩大,机器学习方法可能会失败。这解释了为什么机器学习在某些问题上表现出色,而在其他问题上却失败。即使问题和数据集看起来相似,数据中的细微差异也可能导致完全不同的结果。
最后,通过一个二维函数的示例,我们可以更清楚地看到周围数据是如何指示最大值的。当数据块的曲率能够暗示最大值时,机器学习方法可以较好地逼近;而当数据块无法提供足够信息时,逼近结果可能不理想。
综上所述,在实际应用中,我们需要充分考虑机器学习方法的优缺点,结合具体问题进行选择和应用。在进行方法比较时,要全面考虑各种因素,避免简单地进行比较。同时,在应用非线性迭代优化程序之前,进行充分的前期研究是非常必要的。
4. 数据空洞对机器学习结果的影响分析
4.1 扩大数据空洞的实验
前面提到数据空洞大小会影响机器学习方法的效果,接下来我们继续通过实验来深入探讨。
reducedDataSet3D = {};
Do[
If[!(dataSet3D[[i, 1, 1]] > 0.05 && dataSet3D[[i, 1, 1]] < 0.45 &&
dataSet3D[[i, 1, 2]] > 0.05 && dataSet3D[[i, 1, 2]] < 0.45),
AppendTo[reducedDataSet3D, dataSet3D[[i]]]
],
{i, Length[dataSet3D]}
];
viewPoint3D = {1.9, -3.0, 0.9};
CIP‘Graphics‘Plot3dDataSetWithFunction[reducedDataSet3D,
pureOriginalFunction, labels,
GraphicsOptionViewPoint3D -> viewPoint3D]
当数据空洞扩大,使得真实最大值仅被少数点包围时,不同机器学习方法的表现差异明显。
4.2 感知机在扩大空洞后的表现
numberOfHiddenNeurons = 10;
perceptronInfo = CIP‘Perceptron‘FitPerceptron[reducedDataSet3D,
numberOfHiddenNeurons];
purePerceptron3dFunction = Function[{x, y},
CIP‘Perceptron‘CalculatePerceptron3dValue[x, y, perceptronInfo]];
CIP‘Graphics‘Plot3dDataSetWithFunction[reducedDataSet3D,
purePerceptron3dFunction, labels]
使用不恰当数量隐藏神经元的感知机进行拟合,可能会得到一个无法描述空洞区域的近似模型函数,导致最大值搜索失败。
FindMaximum[purePerceptron3dFunction[x, y], {x, 0.2}, {y, 0.2}]
结果显示,遇到了有效梯度为零的情况,返回的结果可能不是最大值,可能是最小值或鞍点。
4.3 SVM在扩大空洞后的表现
kernelFunction = {"Wavelet", 0.5};
svmInfo = CIP‘SVM‘FitSvm[reducedDataSet3D, kernelFunction];
pureSvm3dFunction = Function[{x, y},
CIP‘SVM‘CalculateSvm3dValue[x, y, svmInfo]];
viewPoint3D = {1.9, -3.0, 0.9};
CIP‘Graphics‘Plot3dDataSetWithFunction[reducedDataSet3D,
pureSvm3dFunction, labels, GraphicsOptionViewPoint3D -> viewPoint3D]
此时SVM方法仍有可能预测出一个离真实最大值不太遥远的最大值。
FindMaximum[pureSvm3dFunction[x, y], {x, 0.2}, {y, 0.2}]
不过这很大程度上是运气因素,这也再次说明了数据中的细微差异会导致机器学习结果的巨大不同。
4.4 二维函数示例中的数据空洞影响
下面通过一个二维函数的示例进一步说明。
pureOriginalFunction = Function[x, 0.5*x + 3.0*Exp[-(x - 4.0)^2]];
argumentRange = {1.0, 7.0};
numberOfData = 100;
standardDeviationRange = {0.1, 0.1};
xyErrorData = CIP‘CalculatedData‘GetXyErrorData[pureOriginalFunction,
argumentRange, numberOfData, standardDeviationRange];
labels = {"x", "y", "Data above function"};
functionValueRange = {0.0, 5.5};
CIP‘Graphics‘PlotXyErrorDataAboveFunction[xyErrorData,
pureOriginalFunction, labels,
GraphicsOptionFunctionValueRange2D -> functionValueRange]
找到该二维函数的最大值:
FindMaximum[pureOriginalFunction[x], {x, 3.9}]
移除最大值周围的数据形成空洞:
reducedXyErrorData = {};
Do[
If[!(xyErrorData[[i, 1]] > 3.0 && xyErrorData[[i, 1]] < 5.4),
AppendTo[reducedXyErrorData, xyErrorData[[i]]]
],
{i, Length[xyErrorData]}
];
labels = {"x", "y", "Reduced data above function"};
CIP‘Graphics‘PlotXyErrorDataAboveFunction[reducedXyErrorData,
pureOriginalFunction, labels,
GraphicsOptionFunctionValueRange2D -> functionValueRange]
使用感知机对有洞的数据进行拟合:
reducedDataSet =
CIP‘DataTransformation‘TransformXyErrorDataToDataSet[
reducedXyErrorData];
numberOfHiddenNeurons = 3;
perceptronInfo = CIP‘Perceptron‘FitPerceptron[reducedDataSet,
numberOfHiddenNeurons];
purePerceptron2dFunction = Function[x,
CIP‘Perceptron‘CalculatePerceptron2dValue[x, perceptronInfo]];
labels = {"x", "y", "Reduced data above approximate model"};
CIP‘Graphics‘PlotXyErrorDataAboveFunction[reducedXyErrorData,
purePerceptron2dFunction, labels,
GraphicsOptionFunctionValueRange2D -> functionValueRange]
找到逼近函数的最大值:
FindMaximum[purePerceptron2dFunction[x], {x, 3.9}]
可以看到,当数据块的曲率能够暗示最大值时,感知机拟合的近似模型函数能得到一个接近真实最大值的结果。若进一步减少数据块:
reducedXyErrorData = {};
Do[
If[!(xyErrorData[[i, 1]] > 2.0 && xyErrorData[[i, 1]] < 6.0),
AppendTo[reducedXyErrorData, xyErrorData[[i]]]
],
{i, Length[xyErrorData]}
];
labels = {"x", "y", "Reduced data above function"};
CIP‘Graphics‘PlotXyErrorDataAboveFunction[reducedXyErrorData,
pureOriginalFunction, labels,
GraphicsOptionFunctionValueRange2D -> functionValueRange]
再次进行感知机拟合:
reducedDataSet =
CIP‘DataTransformation‘TransformXyErrorDataToDataSet[
reducedXyErrorData];
numberOfHiddenNeurons = 3;
perceptronInfo = CIP‘Perceptron‘FitPerceptron[reducedDataSet,
numberOfHiddenNeurons];
purePerceptron2dFunction = Function[x,
CIP‘Perceptron‘CalculatePerceptron2dValue[x, perceptronInfo]];
labels = {"x", "y", "Reduced data above approximate model"};
CIP‘Graphics‘PlotXyErrorDataAboveFunction[reducedXyErrorData,
purePerceptron2dFunction, labels,
GraphicsOptionFunctionValueRange2D -> functionValueRange]
此时由于数据块无法提供足够信息,逼近结果可能不理想。
4.5 数据空洞影响总结
通过以上实验可以总结出,数据空洞大小和周围数据的特征对机器学习方法的性能有显著影响。数据空洞较小时,机器学习方法有更大机会揭示数据中的关键信息;而数据空洞过大或周围数据无法提供有效线索时,方法可能会失败。
以下是不同情况下机器学习方法表现的表格总结:
| 情况 | 感知机表现 | SVM表现 |
| ---- | ---- | ---- |
| 数据空洞较小 | 可能较好逼近最大值 | 能较好逼近最大值 |
| 数据空洞较大 | 可能无法描述空洞区域,最大值搜索失败 | 可能预测出离真实值较近的最大值,但有运气成分 |
5. 实际应用建议
在实际应用机器学习方法时,为了取得更好的效果,我们可以参考以下建议:
1.
前期评估
:在应用非线性迭代优化程序处理实际问题之前,一定要进行初步的速度、缩放行为和内存消耗等方面的研究。例如,通过改变数据集规模,观察不同方法的训练时间变化,分析其时间复杂度,像前面提到的MLR、SVM和感知机的实验一样。
2.
方法选择
:要充分考虑不同方法的优缺点和适用场景。对于线性问题,线性方法如MLR可能速度较快;对于非线性问题,SVM或感知机可能更合适,但要注意它们在不同数据集规模下的性能表现。
3.
数据处理
:尽量保证数据的完整性和质量,减少数据空洞的影响。如果无法避免数据空洞,要评估其对模型的影响,并尝试不同的方法和参数来提高模型的鲁棒性。
4.
公平比较
:对不同方法进行比较时,要全面考虑所有的细微差异,如速度、缩放行为、内存消耗、拟合质量等。不能仅仅根据某一个指标就判断方法的优劣。
下面是一个实际应用中选择机器学习方法的mermaid流程图:
graph TD;
A[问题类型] --> B{线性问题};
B -- 是 --> C[考虑线性方法如MLR];
B -- 否 --> D{数据规模大小};
D -- 小 --> E[可尝试SVM或感知机];
D -- 大 --> F[评估方法效率,可能需优化或选择其他方法];
C --> G[评估性能和结果质量];
E --> G;
F --> G;
G --> H{结果是否满意};
H -- 是 --> I[应用模型];
H -- 否 --> J[调整方法或参数];
J --> G;
综上所述,从曲线拟合到机器学习的过程中,我们需要深入理解各种方法的原理、性能和适用场景,结合实际数据情况进行合理选择和应用,同时要注意方法比较的公平性和数据处理的重要性,这样才能在实际问题中取得更好的效果。
超级会员免费看
394

被折叠的 条评论
为什么被折叠?



