前提・実現したいこと
MATLABを使って教師なし学習のクラスタリングを行っています。
入力画像は1024×768なのですが,これだとデータ量が多すぎるので1000画素をランダムサンプリングしています。(正解率が落ちるのは覚悟の上ですが)
k-meansでのクラスタリングは無事に行えたのですが,自己組織化マップが関数が異なっており、エラーが出てうまく実装することができません。
関数の読み込みまでは動いているのであとtest_ratioの部分さえ解決すればうまく回せると思いますが,そこで躓いています。
MATLABやプログラムについて詳しい方いらっしゃいましたらご意見や回答のほどよろしくお願いします。
エラー内容
Unable to perform assignment because the indices on the left side are not compatible with the size of the right side. エラー: som (line 98) test_ratio(ran_i)=sum(oup_cla==cla')/train_num;
また
test_ratio(ran_i)=sum(out_clas==clas')/train_num;
の部分を
test_ratio(ran_i)=sum(classes==clas)/train_num;とすると,データ量1000,学習枚数1000では動きますが,そこを変えると
行列の次元は一致しなければなりません。
エラー: som0126 (line 99)
test_ratio(ran_i)=sum(classes==cla)/train_num
と表示されます。
該当のソースコード
MATLAB
1close all; 2clear all;clc; 3 4addpath('/Users/***/matlab/data'); 5ranN=5; 6 7% データ量 8np=[1000]; 9npN=size(np,2); 10 11% 入力サイズ 12data_x=768; 13data_y=1024; 14 15% リサイズ(今回は行わないのと同様) 16np_x=768; %ランダムに画素選択 17np_y=1024; 18 19cut_start_x=(data_x-np_x)/2+1; 20cut_end_x=cut_start_x+np_x-1; 21cut_start_y=(data_y-np_y)/2+1; 22cut_end_y=cut_start_y+np_y-1; 23 24% %予測子(training set)の標準化 25standardize=1; %1:標準化有り, 0:標準化無し 26 27% 訓練データ 28folder='/Users/***/matlab/data'; 29 %画像データ 30 31% 2000枚の画像を使用 32data_num=1000*2; 33pos_data_num=1000; 34 35%教師ありでは使うが今回は使わない 36test_ns=0; 37test_pos_data_num=0; 38 39dummy_ns=0; 40 41 42total_data_num=data_num+test_ns+dummy_ns; 43 44%乱数固定 45rng(1,'twister'); 46rand_num=randperm(total_data_num); 47 48train_num=data_num/2; 49test_num=test_ns/1; 50 51%いくつかの画素で試す場合はループ 52for pix_i=1:npN; 53 pix_i 54 55 savedirname=['./som_average_clustering_',num2str(pix_i),... 56 'pixs_standardize',num2str(standardize)]; 57 mkdir(savedirname); 58 59for ran_i=1:ranN; 60 ran_i 61 62 rng(ran_i,'twister'); 63 s=rng; 64 65 rand_numnum=randperm(train_num+test_num); 66 rand_samp=randperm(np_x*np_y,np(pix_i)); 67 68for n=1:2000 69 name=sprintf('%s/%04d.tiff',folder,rand_num(n)); 70 data0(:,:)=double(imread(name)); 71 data1(:,:)=data0(cut_start_x:cut_end_x,cut_start_y:cut_end_y); 72 data2=MyVec((data1-min(data1(:)))/(max(data1(:))-min(data1(:)))); 73 data3=data2(:); 74 75 total_data(:,n)=data3(rand_samp); 76 77 if n<=total_data_num/2 78 total_cla(n)=2; 79 else 80 total_cla(n)=1; 81 end; 82end; 83total_data=total_data(:,rand_num); 84total_cla=total_cla(:,rand_num); 85 86 87% 訓練セット 88 89g_train=total_data(:,rand_numnum(1:train_num)); 90g_train=g_train'; 91clas=total_cla(:,rand_numnum(1:train_num)); 92 93%oup_clas=double(kmeans(g_train,2)); #kmeansを使う場合は%を取り以下の6行のコードを無効化 94 95out_clas=g_train; 96net=selforgmap([2]) 97net = train(net,out_clas); 98view(net) 99y=net(out_clas); 100classes = vec2ind(y); 101 102test_ratio(ran_i)=sum(out_clas==clas')/train_num; 103if test_ratio(ran_i)<=0.5; 104 test_ratio(ran_i)=1-test_ratio(ran_i); 105end; 106test_ratio(ran_i)=test_ratio(ran_i) 107 108clear g_train clas out_clas total_clas total_data 109 110end; 111 112csvwrite([savedirname,'/test_ratio.csv'], test_ratio); 113csvwrite([savedirname,'/test_ratio_ave.csv'], mean(test_ratio)); 114averageratio = mean(test_ratio) 115clear test_ratio 116 117end;
試したこと
k-meansを用いたときは以下のように正しく出力されました。
出力結果の一部です。
ran_i =
5
test_ratio =
0.5025 0.505 0.50125 0.51 0.50625
averageratio =
0.505
補足情報(FW/ツールのバージョンなど)
Windows10(64bit)
MATLAB R2017b
あなたの回答
tips
プレビュー