本帖最后由 Adel 于 2021-1-26 09:46 编辑 做一个心电多分类算法,用SVM,也是查很多论文用的方法。我按照自己的思路写了一个程序,训练出来再测试,第一类正确率是1,其他类都是0,肯定是出了问题。我现在没有解决思路。来请教下,恳请指点哈,谢谢了。程序如下:(开头网址是多分类的参考文章地址,不能发链接,网址加空格了)
clear,clc class = {'A_a','F', 'J', 'L', 'N', 'R', 'V'}; % 总共分为7大类 class_num = length(class); % 7类 SVMModels = cell(class_num,1); % 一对多,需要7个SVMModel data_path = 'D:\Program Files\MATLAB\R2015b\bin\main_codes\ECG process\classification\SVM_zhh\character_array_files\'; % 数据总目录 training_dataset = 'training_set1_charac_array'; % 训练集特征向量文件夹名称(7个文件夹中都相同) testing_dataset = 'testing_set1_charac_array'; % 测试集特征向量文件夹名称(7个文件夹中都相同) file_suffix = '*.txt'; % 数据文件后缀指定为.txt %% 训练 for class_index=1:class_num % 训练7次,要读完7个类的数据 class_name = char( class(class_index) ); file_read_path = strcat(data_path, class_name,'\',training_dataset,'\'); % 拼接成完整路径下的文件过滤器 file_filter = strcat(file_read_path, file_suffix); % 拼接成完整路径下的文件过滤器 file_struct = dir(file_filter); % 获取所有文件信息 file_struct_len = length(file_struct); % 文件总个数 for i=1:file_struct_len % 读完文件夹下的所有文件 filename_i = file_struct(i).name; file_read = strcat(file_read_path, filename_i); charac_array = textread(file_read, '%.4f', 'headerlines', 1); if( length(charac_array)==67 ) % 特征向量需要满足1*67 for j = 1:class_num % 训练7次,一次读取7次训练,得到7个向量机 indx = strcmp(char( class(j) ),class_name); % Create binary classes for each classifier SVMModels{j} = fitcsvm(charac_array',indx,'ClassNames',[false true],... 'KernelFunction','rbf','BoxConstraint',1); end end end end %% 保存训练模型,元胞类型,保存为mat文件 save SVMModels.mat SVMModels % %% 测试 % load SVMModels.mat accuracy_rate = zeros(class_num,1); for class_index=1:class_num class_name = char( class(class_index) ); file_read_path = strcat(data_path, class_name,'\',testing_dataset,'\'); % 拼接成完整路径下的文件过滤器 file_filter = strcat(file_read_path, file_suffix); % 拼接成完整路径下的文件过滤器 file_struct = dir(file_filter); % 获取所有文件信息 file_struct_len = length(file_struct); % 文件总个数 Scores = zeros(file_struct_len,class_num); maxScore = zeros(file_struct_len,1); empty_file_cnt = 0; for i=1:file_struct_len filename_i = file_struct(i).name; file_read = strcat(file_read_path, filename_i); charac_array = textread(file_read, '%.4f', 'headerlines', 1); if( length(charac_array)==67 ) for j = 1:class_num [~,score] = predict(SVMModels{j},charac_array'); Scores(i,j) = score(:,2); % Second column contains positive-class scores end else Scores(i,j) = 0; % 若样本不对,则分类值为0 empty_file_cnt = empty_file_cnt + 1; end end [~,maxScore] = max(Scores,[],2); maxScore = maxScore - class_index; accuracy_rate(class_index) = sum( (maxScore==0) )./(file_struct_len-empty_file_cnt); end zhh = 1; 主要思路如下: 1、我有七类数据的特征向量,都算好了,都是1*67的向量,存为txt文件。7个类存7个文件夹,每个文件夹下,数据又分为训练数据和测试数据两个文件夹,training_set1_charac_array和testing_set1_charac_array。 2、参考开头网址的多分类程序,是一对多规则,7类需要7个分类器。 3、因为每次都要读取7个文件夹中训练或者测试文件夹下的文件,所以我每读一个文件夹,就一个文件一个文件地去训练,或者测试,比如训练时,对于第一类,我读取training_set1_charac_array文件夹下的第一个文件,提取特征向量,然后作为正类训练svm。然后读取第二个,...,直到第一类读取完,再读取第二类文件夹的training_set1_charac_array文件夹下第一个文件,训练,再读取第二个文件,...。测试也是一样的步骤。 4、训练数据文件和测试数据文件,有些可能不是1*67的向量,则不计。 我自己的一些思考,会不会有这些问题,或者说改进思路: 1、是不是我没有归一化特征向量; 2、是不是我一个一个的训练和测试这种机制不行? 3、是不是我还没有优化模型,或者说现在的参数设置不对? |
最佳答案
11 条回复