% 作者: dongyang
% 说明:本示例用以说明matlab的回归分析。matlab中的回归分析都在统计和机器学习工具箱里,和模式分类一样:
% 回归有单因变量回归分析(univariate)和多因变量回归分析(multivariate)。这里只讨论univariate回归分析
% Matlab中的回归分析可以分为线性,广义线性,非线性等三大类。每一类的结果评估都会有所不同。
% 线性回归分析的评价:1,判定系数;2,预测结果与实际值的相关系数;3,用Anova做系数的显著性分析
% 广义线性回归分析的评价:1,判定系数;2,预测结果与实际值的相关系数。
% 非线性回归分析的评价:1,损失函数;2,预测结果与实际值的相关系数
% 高维度数据的特殊操作:一般对中低维度的特征数据,不管是回归还是分类,在matlab中都可以用SVM、线性回归或者逻辑回归模型来操作。
% 但是对于高维度数据,如果不做特征选择的话,matlab中最好用高维线性回归(分类)模型来进行,适用函数是fitrlinear或者fitclinear
% 本示例里面介绍了线性回归,广义线性回归,SVM回归,高维度数据的线性回归,高斯过程回归,树回归等六种回归分析方法及其相应的结果评估
% 时间:10/2018
%数据读取和训练集/测试集拆分
m = csvread('E:/Data/music-a.csv',1,0); %参数中的1和0表示从第1行第0列开始读取,默认csv文件的第0行是label行
r = size(m);
column = r(2);
data = m(:,2:column);
label = m(:,1);
lc = length(unique(label));
Method = 6; % 选择回归分析方法
if Method == 1
% 线性回归
disp('线性回归:');
mdl = fitlm(data,label);
pred = predict(mdl,data);
corr = corrcoef(pred, label);
% 结果的统计分析
s = struct('R2',[],'aR2',[],'Corr',[],'Anova',[]);
s.R2 = mdl.Rsquared.Ordinary;
s.aR2 = mdl.Rsquared.Adjusted;
s.Corr = corr(1,2);
s.Anova = anova(mdl);
elseif Method == 2
% 广义线性回归:它与线性回归的区别在于GLM的预测值分布并不仅仅是LM的正态分布,还可以是泊松、伽马、高斯等分布函数
% 但是相比LM,GLM的属性里面没有了Anova分析,因为该分析是假设数据总体服从正态分布的
% GLM的分布可以在参数中设置,默认值是正态分布
disp('广义线性回归:');
mdl = fitglm(data, label, 'linear', 'Distribution', 'gamma');
pred = predict(mdl,data);
corr = corrcoef(pred, label);
% 结果的统计分析
s = struct('R2',[],'aR2',[],'Corr',[],'NumCoef',[]);
s.R2 = mdl.Rsquared.Ordinary;
s.aR2 = mdl.Rsquared.Adjusted;
s.Corr = corr(1,2);
s.NumCoef = mdl.NumEstimatedCoefficients;
elseif Method == 3
% 高维线性回归分析:适用高维度特征数据的回归分析模型,损失评估可以选择支持向量机或者最小均方误差函数准则
% 它的结果评估不支持判定系数和Anova分析
disp('高维线性回归:');
mdl = fitrlinear(data,label);
pred = predict(mdl,data);
corr = corrcoef(pred, label);
% 结果的统计分析
s = struct('mse_Loss',[],'eps_Loss',[],'Corr',[]);
s.mse_Loss = loss(mdl, data, label);
s.eps_Loss = loss(mdl, data, label, 'LossFun','epsiloninsensitive');
s.Corr = corr(1,2);
elseif Method == 4
% SVM回归分析:非线性分析,所以不能做判定系数,一般用损失函数来检验结果
disp('SVM回归:');
mdl = fitrsvm(data, label,'KernelFunction','gaussian');
pred = resubPredict(mdl);
corr = corrcoef(pred, label);
s = struct('mse_Loss',[],'eps_Loss',[],'Corr',[]);
s.mse_Loss = resubLoss(mdl);
s.eps_Loss = resubLoss(mdl,'LossFun','epsiloninsensitive');
s.Corr = corr(1,2);
elseif Method == 5
% 高斯过程回归
disp('高斯过程回归:');
mdl = fitrgp(data, label,'KernelFunction','squaredexponential');
pred = resubPredict(mdl);
corr = corrcoef(pred, label);
s = struct('mse_Loss',[],'Corr',[]);
s.mse_Loss = resubLoss(mdl);
s.Corr = corr(1,2);
elseif Method == 6
% 树回归
disp('树回归:');
mdl = fitrtree(data, label);
pred = resubPredict(mdl);
corr = corrcoef(pred, label);
s = struct('mse_Loss',[],'Corr',[]);
s.mse_Loss = resubLoss(mdl);
s.Corr = corr(1,2);
else
end
%回归预测与实际值的对比图
disp(s);
diff = pred - label;
plot(diff);