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

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

ただいまの
回答率

91.02%

  • 機械学習

    483questions

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

  • MATLAB

    118questions

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

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 175

RSAM

score 1

 前提・実現したいこと

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

と表示されます。

 該当のソースコード

close all;
clear all;clc;

addpath('/Users/***/matlab/data');
ranN=5;

% データ量
np=[1000];  
npN=size(np,2);

% 入力サイズ
data_x=768;
data_y=1024;

% リサイズ(今回は行わないのと同様)
np_x=768;  %ランダムに画素選択
np_y=1024;

cut_start_x=(data_x-np_x)/2+1;
cut_end_x=cut_start_x+np_x-1;
cut_start_y=(data_y-np_y)/2+1;
cut_end_y=cut_start_y+np_y-1;

% %予測子(training set)の標準化
standardize=1;  %1:標準化有り, 0:標準化無し

% 訓練データ
folder='/Users/***/matlab/data';
    %画像データ

% 2000枚の画像を使用
data_num=1000*2;
pos_data_num=1000;

%教師ありでは使うが今回は使わない
test_ns=0;
test_pos_data_num=0;

dummy_ns=0;


total_data_num=data_num+test_ns+dummy_ns;

%乱数固定
rng(1,'twister');
rand_num=randperm(total_data_num);

train_num=data_num/2;
test_num=test_ns/1;

%いくつかの画素で試す場合はループ
for pix_i=1:npN;
    pix_i

    savedirname=['./som_average_clustering_',num2str(pix_i),...
    'pixs_standardize',num2str(standardize)];
    mkdir(savedirname);

for ran_i=1:ranN;
    ran_i

    rng(ran_i,'twister');
    s=rng;

    rand_numnum=randperm(train_num+test_num);
    rand_samp=randperm(np_x*np_y,np(pix_i));

for n=1:2000
    name=sprintf('%s/%04d.tiff',folder,rand_num(n));
    data0(:,:)=double(imread(name));
    data1(:,:)=data0(cut_start_x:cut_end_x,cut_start_y:cut_end_y);
    data2=MyVec((data1-min(data1(:)))/(max(data1(:))-min(data1(:))));
    data3=data2(:);

    total_data(:,n)=data3(rand_samp);

    if n<=total_data_num/2
        total_cla(n)=2;
    else
        total_cla(n)=1;
    end;
end;
total_data=total_data(:,rand_num);
total_cla=total_cla(:,rand_num);


% 訓練セット

g_train=total_data(:,rand_numnum(1:train_num));
g_train=g_train';
clas=total_cla(:,rand_numnum(1:train_num));

%oup_clas=double(kmeans(g_train,2)); #kmeansを使う場合は%を取り以下の6行のコードを無効化

out_clas=g_train;
net=selforgmap([2])
net = train(net,out_clas);
view(net)
y=net(out_clas);
classes = vec2ind(y);

test_ratio(ran_i)=sum(out_clas==clas')/train_num;
if test_ratio(ran_i)<=0.5;
    test_ratio(ran_i)=1-test_ratio(ran_i);
end;
test_ratio(ran_i)=test_ratio(ran_i)

clear g_train clas out_clas total_clas total_data

end;

csvwrite([savedirname,'/test_ratio.csv'], test_ratio);
csvwrite([savedirname,'/test_ratio_ave.csv'], mean(test_ratio));
averageratio = mean(test_ratio)
clear test_ratio

end;

 試したこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    matlabでの計算について

    matlabで計算をしたいのですが、使い方がいまいちわかっておりません 計算というのは例えば 13 1 15 7 ≈ 58 576 のように1行614400列の行

  • 解決済

    matlabでの作業効率化2

    5つのデータがあるとして、それぞれ違う名前をつけたい(a b c d eのように)ときにどのような手順を踏めばいいのでしょうか。 for N=1:5%ファイルの数だけ繰り返す

  • 解決済

    matlabでのfor文を使った行列の結合

    題名にもある通りfor文を使って行列の結合をしたいと考えています。 k1=(1,2,3);k2=(4,5,6);k3=(7,8,9);k4=(10,11,12);このようにkが9

  • 解決済

    MATLABで読み込んだwavファイルの一部を切り取り、もう一度wavファイルで書き出す方法

    matlabに複数のwavファイルを読み込み 読み込んだwavファイルの初めの1秒間のみを切り出して 「長さが1秒間のwav」を作成、再度wavファイルの形で書き出すプログラム

  • 解決済

    MATLAB 関数 'mtimes' (タイプ'cell' の入力引数) が未定義です。 のエラーで...

    MATLAB初心者の者です。 MATLABである計算を行っているのですが、エラーの原因が分かりません。 代入する値と式は何度も見直しているので合っていると思うのですが、 下記

  • 解決済

    MATLAB ファイル読み込み

    観測したzipファイルを手で解凍し、MATLABで読み込む方法についてです。 観測で得られたzipファイルを手動で解凍し、開くと ーーーーーーーーーー e16A0319.

  • 解決済

    Matlabでのtxtファイル出力について

    前提・実現したいこと iが1から21までループさせ、その結果を1つのテキストファイル(ファイル.txt)に縦に出力させたいです。 ↓fa↓ SizeX0 = 0; Si

  • 解決済

    Matlab での画像の領域抽出

    前提・実現したいこと Matlabを用いて画像の特定の領域のトリミング 発生している問題・エラーメッセージ 現在、研究でMatlabを用いて以下の花の画像の中心の黄色の花

同じタグがついた質問を見る

  • 機械学習

    483questions

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

  • MATLAB

    118questions

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