第一部分:简述题
- 简述 PCA 的原理、学习模型和算法步骤。
原理:寻找一组方差较大的方向,将原始数据(样本)在该方向进行投影。即将数据在新坐标系下进行表示,保留少数在方差最大方向上的投影,达到数据变换、尽可能地保留原 始数据信息 和降维的目的。
方差较大的方向称为主成分 (Principal Component) 。其中,方差最大的方向称为第一主成分,其次为第二主成分,依次类推。
学习模型:
PCA是无监督学习方法,通过学习数据的协方差矩阵的特征向量,选择前k个特征向量构成变换矩阵,将数据映射到新的低维空间。
算法步骤:
计算数据均值:
计算数据的协方差矩阵:
对协方差矩阵进行特征值分解,得到特征值和对应的特征向量。特征值表示在该方向上的方差,特征向量表示主成分方向。将特征值从大到小排序,选择前k个特征值对应的特征向量构成变换矩阵。这些特征向量即为数据的主成分。
将每一个数据进行投影:
- 简述 LAD 的原理和学习模型。
原理:寻找一组投影方向,使样本在投影之后 (即在新坐标系下)类内样本点尽可能靠近, 类间样本点尽可能相互远离,提升样本表示的分类鉴别能力。 投影方向数小于原始数据的维度,因此投影样本即相当于将样本在子空间内进行表示,从而达到降维的目的。
- 对每个类别计算样本的均值向量。
- 计算类内散度矩阵和类间散度矩阵
类内散度矩阵:
类间散度矩阵:
目标函数重写为(广义Rayleigh熵):
J 的值与向量的长度无关,只与其方向有关,不失 一般性可令w为单位长度的向量。
学习目标:
- 计算特征值和特征向量: 对类内散度矩阵的逆矩阵与类间散度矩阵进行特征值分解,得到特征值和对应的特征向量。
- 选择投影方向: 选择前k个最大特征值对应的特征向量,构成投影矩阵。
5.数据投影: 将原始数据乘以投影矩阵,将数据投影到新的低维空间。
- 作为一类非线性降维方法,简述流形学习的基本思想。
• LLE (Locally linear embedding)
– 基本思想:给定数据集,通过最近邻等方式构造一个数据图(data graph)。然后在每一个局部区域,高维空间中的样本线性重构关系在低维空间中均得以保持。
- 根据特征选择与分类器的结合程度,简述特征选择的主要方法,指出各类方法的特点。
• 过滤式特征选择方法: “选择”与“学习”独立 ,在特征选择和分类器训练之前独立地进行。常见方法有方差选择、互信息等。
• 包裹式特征选择方法: “选择”依赖“学习” ,使用具体的分类器性能来评估特征子集。典型方法有递归特征消除(RFE)等。
• 嵌入式特征选择方法: “选择”与“学习”同时进行,特征选择与分类器训练过程融为一体。典型方法有LASSO回归、决策树等。
- 简述最优特征选择的基本思想。
通过组合不同的特征选择方法、交叉验证等手段,寻找最优的特征子集,以提高模型性能并减少计算成本。
第二部分:编程题
编程实现 1:PCA+KNN:即首先 PCA 进行降维,然后采用最近邻分类器(1 近邻分类器)作为分类器进行分类。
- load ORLData_25;
- X = ORLData;
- X = double(X);
- [n, d] = size(X);
- labels = X(:,end); %获取各样本的类别标签
- labels = floor(double(labels));
- c = max(labels); % c = 40
- X(:,end) = []; % 获取样本数据
- clear ORLData;
- %划分数据集
- rng(42); %设置随机种子
- [trainIdx,testIdx]=crossvalind('HoldOut',labels,0.2); % 0.8的训练集,0.2的测试集
- X_train=X(trainIdx,:);
- y_train=labels(trainIdx);
- X_test=X(testIdx,:);
- y_test=labels(testIdx);
- % 降维至不同维数时的分类性能
- dimensions = [1, 2, 3, 5, 10]; % 可以根据需要扩展维度范围
- for dim = dimensions
- % PCA
- pca_accuracy=1-pca_knn(X_train, X_test, y_train, y_test, dim);
- fprintf('PCA (Dimension %d): Accuracy = %.2f\n', dim, pca_accuracy);
- end
- % 实现PCA + KNN
- function accuracy = pca_knn(X_train, X_test, y_train, y_test, n_components)
- % PCA降维
- coeff = pca(X_train, 'NumComponents', n_components);
- X_train_pca = X_train * coeff;
- X_test_pca = X_test * coeff;
- % KNN分类
- mdl = fitcknn(X_train_pca, y_train, 'NumNeighbors', 1);
- % 预测并评估性能
- y_pred = predict(mdl, X_test_pca);
- accuracy = sum(y_pred == y_test) / numel(y_test);
- end
预测并评估性能:
编程实现 2:LDA +KNN,即首先 LDA 进行降维,然后采用最近邻分类器(1 近邻分类器)作为分类器进行分类。
任务:采用 80%作样本作训练集,20%样本做测试集,报告降至不同维数时的分类性能。
- % 加载数据集
- load vehicle;
- out = UCI_entropy_data.train_data;
- X = out';
- X = double(X);
- [n, d] = size(X);
- labels = X(:, end);
- labels = floor(double(labels)); % 获取各样本的类别标签
- c = max(labels); % c = 4
- X(:, end) = []; % 获取样本数据
- clear UCI_entropy_data;
- clear out;
- % 划分数据集
- rng(42); % 设置随机种子
- [trainIdx, testIdx] = crossvalind('HoldOut', labels, 0.2); % 80%训练集,20%测试集
- X_train = X(trainIdx, :);
- y_train = labels(trainIdx);
- X_test = X(testIdx, :);
- y_test = labels(testIdx);
- % 降维至不同维数时的分类性能
- dimensions = [1, 2, 3, 5, 10]; % 可以根据需要扩展维度范围
- for dim = dimensions
- % LDA
- lda_accuracy = lda_knn(X_train, X_test, y_train, y_test, dim);
- fprintf('LDA (Dimension %d): Accuracy = %.2f\n', dim, lda_accuracy);
- end
- % 实现LDA + KNN
- function accuracy = lda_knn(X_train, X_test, y_train, y_test, ~)
- % LDA降维
- lda = fitcdiscr(X_train, y_train, 'DiscrimType', 'pseudolinear', 'ScoreTransform', 'logit');
- X_train_lda = predict(lda, X_train);
- X_test_lda = predict(lda, X_test);
- % KNN分类
- mdl = fitcknn(X_train_lda, y_train, 'NumNeighbors', 1);
- % 预测并评估性能
- y_pred = predict(mdl, X_test_lda);
- accuracy = sum(y_pred == y_test) / numel(y_test);
- end
预测并评估性能: