質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

0回答

2220閲覧

MATLABを用いた自己組織化マップのクラスタリングがうまくできません。

RSAM

総合スコア7

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2018/01/25 11:29

編集2018/01/26 11:39

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問