# GS3FS **Repository Path**: ljl745972609/gs3fs ## Basic Information - **Project Name**: GS3FS - **Description**: 论文A robust graph-based semi-supervised sparse feature selection method 的实现代码 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-04-07 - **Last Updated**: 2021-04-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目说明 > 论文代码 ## 代码说明 > 本代码完全按照论文公式推导编写。由于论文中公式推导有错误。故该算法的收敛性得不到保证。这并不是代码问题,而是论文$\color{red}{e.q.(16)}$ 推导错误。正确的公式推导是: > $$ > b^T = \frac{(1_n^TD_vF-1_n^TD_vX^TW)}{1^T_nD_v1_n} > $$ > 将$b^T$ 带入论文其他公式,然后向后推导,这样得到的结果才会正确收敛。 > $ps:$ > > 1. 由于每次求解都带入原方程,这样会导致计算过于复杂 > 2. 可以利用固定其他求解一个的思路来求解,求解过程和论文大致相同,但是公式需要自己再次推导,公式推导不难。 ## 代码使用示例 ```matlab % 载入数据 load iris.mat % 使用5折交叉数据集和测试集 cv = 5 indicate = crossvalind("kfold",Y,cv); for i = 1:cv test = (indicate == i); train = ~test; % 获取半监督的标签数据,其中无标签率为60% semiy = getSemiData(Y(train,:),0.6); % 将 n*1的标签数据转换成 n*c的标签数据。 fsy = changeLabel(semiy); % 进行特征选择 % 第一个参数为X; 第二个参数为Y 第三个参数为p范数 第四个参数为lambda % 需要自己调参,另外GS3FS算法中使用了部分工具函数,工具函数在util项目中。 I = GS3FS(X(train,:)',Y(trainx,:),1,0.01); cp = classperf(Y); for f = 1:d % 选择1 ~ d个特征进行训练 x_select_train = X(train,I(1:f)); x_select_test = X(test,I(1:f)); % 使用knn 分类器进行划分 knnmdl = fitcknn(x_select_train,Y(train,:)); predictor = predict(knnmdl,x_select_test); classperf(cp,predictor,test); fprint("当前第%d轮交叉验证,选择%d个特征,精确度=%f\n",i,f,cp.CorrectRate*100); end end ``` ## 工具函数 > 在测试函数中使用的部分工具类: ### `getSemiData` ```matlab function semiData= getSemiData(trainy,unlabelRate) n = length(trainy); s = round(n*unlabelRate); trainy(n-s+1:n,:) = zeros(s,1); semiData = trainy; end ``` ### `changeLabel` ```matlab function Y = changeLabel(trainy) n = length(trainy); classNum = length(unique(trainy))-1; Y = zeros(n,classNum); for i = 1:n if trainy(i) ~= 0 Y(i,trainy(i)) = 1; else break; end end end ```