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

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

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

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

2回答

4344閲覧

[perl] Odd number of elements in anonymous hash のエラー

mi-ko41

総合スコア11

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

1クリップ

投稿2015/11/16 19:54

編集2015/11/17 01:03

SVMLight 機械学習パッケージへの Perl インタフェースであるAlgorithm::SVMLightを使用し、SVMを構築しています。
http://www.mahoroba.ne.jp/~felix/Toolbox/Lang/Perl/Package/Algorithm-SVMLight.html
上記のサイトを参考にさせていただいております。

CSVファイルから属性とラベルを読み込み、学習インスタンスを追加していきたいのですが、
Odd number of elements in anonymous hashというエラーが出てしまいます。
<追記>------------
エラーは$s->add_instanceの部分で起きています。
$vectorfileから一行読み込むごとに一つずつOdd numberエラーが発生しています。
----------------

調べてエラーの意味はわかったのですがどうすれば解決するのかがわかりません。
何か良い解決法はあるでしょうか。
ご教授いただけると嬉しいです。よろしくお願い致します。

vector.csvには全行同じ数の数値がカンマ区切りで格納されています。
label.csvにはvector.csvの行数と同じ数の数値がカンマ区切りで格納されています。


#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use open IO => ":utf8";
use Encode qw/decode_utf8 encode_utf8/;
use Algorithm::SVMLight;

my $vectorfile = "vector.csv";
my $labelfile = "label.csv";

my $s = new Algorithm::SVMLight;

open(INLABEL,"<$labelfile"); #ファイル一括読み込み
local $\ = undef;
my $label = <INLABEL>;
close(INLABEL);

my @label = split(/,/,$label); #ラベルをカンマで区切る

my $j = 0;
open(INVECTOR,$vectorfile);
while(<INVECTOR>){
chomp;
my @vector = split(/,/, $_); #ベクトルをカンマで区切る

my $attribute = ""; for(my $i=0;$i<=$#vector;$i++){ $attribute = $attribute . $i . "=>" . $vector[$i] . ","; } chop($attribute); #最後のカンマを消す

$s->add_instance
(attributes => {$attribute},label => $label[$j]);

$j++;

}

$s->train;

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

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

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

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

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

argius

2015/11/17 00:20

$s->add_instanceのところで起きてるっぽいので、それも質問に書いておくと回答が得られやすくなると思います。(エラーにはat xxx.pl line 33のように出ていますよね?)
guest

回答2

0

ベストアンサー

add_instanceメソッドの、attributesに設定する値の形式が誤っています。

ここは、文字列を設定するのではなく、ハッシュの参照を渡さなければなりません。

lang

1my %attrubutes = (); 2for(my $i=0;$i<=$#vector;$i++){ 3 $attributes{$i} = $vector[$i]; 4} 5 6$s->add_instance 7 (attributes => \%attrubutes ,label => $label[$j]);

このように、ハッシュ変数に格納して、渡すときはリファレンスを渡します。

投稿2015/11/17 05:11

argius

総合スコア9390

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

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

mi-ko41

2015/11/17 06:04

解決しました。ありがとうございました!
guest

0

実行環境もなく実際に試していませんし、SVMLight 機械学習パッケージも使用したことが無いので的外れかもしれませんが・・・

perl

1for(my $i=0;$i<=$#vector;$i++) { 2 ・・・ 3}

これだとforループがvectorの要素数+1回回ってしまってlabelの要素数より1つ多くなり、結果として
Odd number of elements in anonymous hash
が発生するのではないでしょうか。

投稿2015/11/16 23:59

pi-chan

総合スコア5936

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

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

mi-ko41

2015/11/17 00:10

ご回答ありがとうございます。 $#vectorは最後の配列の要素番号になるので、間違ってはいないはずです。 試しに for(my $i=0;$i<$#vector;$i++) としてみましたが変わらずエラーが出てしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問