机器学习中的分类与回归:从线性到非线性的探索
立即解锁
发布时间: 2025-08-23 02:00:42 阅读量: 6 订阅数: 12 


从曲线拟合到机器学习:智能系统参考
### 机器学习中的分类与回归:从线性到非线性的探索
#### 1. 评估分类效果
在机器学习里,评估分类结果的优劣是一项基础工作。可以直接统计正确和错误分类的输入/输出(I/O)对,还能在三维空间中可视化决策面。
以下是一个完美分类的示例代码:
```mathematica
Clear["Global`*"];
<<CIP`CalculatedData`
<<CIP`Utility`
<<CIP`Graphics`
<<CIP`MLR`
<<CIP`DataTransformation`
centroid1={0.2,0.2};
numberOfCloudVectors1=50;
standardDeviation1=0.1;
singleCloudDefinition1={centroid1,numberOfCloudVectors1,standardDeviation1};
centroid2={0.8,0.8};
numberOfCloudVectors2=50;
standardDeviation2=0.1;
singleCloudDefinition2={centroid2,numberOfCloudVectors2,standardDeviation2};
cloudDefinitions={singleCloudDefinition1,singleCloudDefinition2};
classificationDataSet=CIP`CalculatedData`GetGaussianCloudsDataSet[cloudDefinitions];
labels={"x","y","Inputs"};
CIP`Graphics`Plot2dPoints[CIP`Utility`GetInputsOfDataSet[classificationDataSet],labels]
```
这个示例中有两个明显分离的二维输入云。每个I/O对通过输出向量的编码来确定所属类别,例如:
```mathematica
ioPair1=classificationDataSet[[1]]
{{0.248568,0.240914},{1.,0.}}
```
此I/O对属于类别1,因为输出向量的第一个位置值为1.0,第二个位置值为0.0。
使用线性多元线性回归(MLR)拟合可生成决策面,实现100%的正确分类:
```mathematica
mlrInfo=CIP`MLR`FitMlr[classificationDataSet];
CIP`MLR`ShowMlrSingleClassification[
{"CorrectClassification","CorrectClassificationPerClass"},
classificationDataSet,mlrInfo]
```
由于每个I/O对的输出是二维的,所以有两个平面用于决策。可以分别可视化这两个平面:
```mathematica
classificationDataSet3DList=CIP`DataTransformation`TransformDataSetToMultipleDataSet[classificationDataSet];
indexOfInput1=1;
indexOfInput2=2;
indexOfOutput=1;
input={0.0,0.0};
pureMlr3dFunction=Function[{x,y},
CIP`MLR`CalculateMlr3dValue[x,y,indexOfInput1,
indexOfInput2,indexOfOutput,input,mlrInfo]];
labels={"In 1","In 2","Out 1"};
CIP`Graphics`Plot3dDataSetWithFunction[classificationDataSet3DList[[1]],pureMlr3dFunction,labels]
indexOfInput1=1;indexOfInput2=2;indexOfOutput=2;input={0.0,0.0};
pureMlr3dFunction=Function[{x,y},
CIP`MLR`CalculateMlr3dValue[x,y,indexOfInput1,
indexOfInput2,indexOfOutput,input,mlrInfo]];
labels={"In 1","In 2","Out 2"};
CIP`Graphics`Plot3dDataSetWithFunction[classificationDataSet3DList[[2]],pureMlr3dFunction,labels]
```
不过,线性决策面通常不够强大,因为它要求数据能被简单的平面清晰分离。非线性机器学习方法,如感知器和支持向量机(SVM),则能构建任意弯曲的决策面。
#### 2. 回归:引入非线性
对于一个实验性的粘合剂动力学数据集,我们尝试用不同方法来近似模型函数,并探讨常见的陷阱。
数据集的I/O对是四维的(三个输入分量,一个输出分量),无法用二维或三维图形展示完整数据集,但可获取适合三维可视化的子集数据。数据的实验误差约为10% - 20%,且有一些异常值,这对评估回归效果很关键。
首先使用多元线性回归(MLR):
```mathematica
Clear["Global`*"];
<<CIP`ExperimentalData`
<<CIP`MLR`
<<CIP`Graphics`
<<CIP`SVM`
<<CIP`Perceptron`
dataSet=CIP`ExperimentalData`GetAdhesiveKineticsDataSet[];
mlrInfo=CIP`MLR`FitMlr[dataSet];
CIP`MLR`ShowMlrSingleRegression[
{"ModelVsDataPlot"},dataSet,mlrInfo];
CIP`MLR`ShowMlrSingleRegression[
{"RelativeResidualsStatistics","CorrelationCoefficient"},dataSet,
mlrInfo];
```
结果显示,数据和模型之间存在明显的系统偏差,相对残差统计表明偏差幅度超过30%,远高于实验误差,相关系数也较差。这说明线性技术不能很好地对粘合剂动力学数据进行建模。
可以通过对特定聚合物质量比的子集数据进行三维展示来进一步说明:
```mathematica
polymerMassRatio="80";
dataSet3D=CIP`ExperimentalData`GetAdhesiveKinetics3dDataSet[polymerMassRatio];
indexOfInput1=2;
indexOfInput2=3;
indexOfOutput=1;
input={80.0,0.0,0.0};
pureMlr3dFunction=Function[{x,y},
CIP`MLR`CalculateMlr3dValue[x,y,indexOfInput1,indexOfInput2,
indexOfOutput,input,mlrInfo]];
labels={"In 2","In 3","Out 1"};
CIP`Graphics`Plot3dDataSetWithFunction[dataSet3D,pureMlr3dFunction,labels]
```
线性平面只能对数据进行粗略近似。不过,粘合剂动力学数据并非高度非线性,可通过先验/后验的数据变换(如根/平方或对数/指数函数)将线性MLR方法扩展到非线性区域。以对数/指数变换为例:
```mathematica
dataTransformationMode="Log";
mlrInfo=CIP`MLR`FitMlr[dataSet,
MlrOptionDataTransformationMode -> dataTransformationMode];
CIP`MLR`ShowMlrSingleRegression[
{"ModelVsDataPlot","RelativeResidualsStatistics",
"CorrelationCoefficient"},dataSet,mlrInfo];
```
变换后,数据和模型之间的系统偏差主要集中在较大输出值区域,残差统计更可接受,相关系数也有所提高。
为了进一步改善建模结果,需要转向真正的非线性机器学习方法,如SVM和感知器。使用SVM时,先选择之前成功的小波核函数,宽度参数为0.1:
```mathematica
kernel={"Wavelet",0.1};
svmInfo=CIP`SVM`FitSvm[dataSet,kernel];
CIP`SVM`ShowSvmSingleRegression[
{"ModelVsDataPlot","RelativeResidualsStatistics",
"CorrelationCoefficient"},dataSet,svmInfo];
```
结果显示数据几乎被完美建模,但这很可能是过拟合,因为相对偏差远低于实验误差。过拟合的模型对预测插值任务毫无用处。
使用感知器时,先任意选择15个隐藏神经元:
```mathematica
numberOfHiddenNeurons=15;
perceptronInfo=CIP`Perceptron`FitPerceptron[dataSet,
numberOfHiddenNeurons];
CIP`Perceptron`ShowPerceptronSingleRegression[
{"ModelVsDataPlot","RelativeResidualsStatistics",
"CorrelationCoefficient"},dataSet,perceptronInfo];
```
同样出现了过拟合现象。
这表明结构参数的选择至关重要。对于SVM方法,可将小波核的宽度参数从0.1增加到1.0:
```mathematica
kernelFunction={"Wavelet",1.0};
svmInfo=CIP`SVM`FitSvm[dataS
```
0
0
复制全文
相关推荐










