[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[dennou-ruby:004022] Re: GAnalysis::covariance のバグ
- To: dennou-ruby@xxxxxxxxxxx
- Subject: [dennou-ruby:004022] Re: GAnalysis::covariance のバグ
- From: Takeshi Horinouchi <horinout@xxxxxxxxxxxxxxxxx>
- Date: Mon, 17 Apr 2017 18:23:19 +0900
松葉さま
随分遅くなってすみませんが,内容的にとりこみました。
次のリリースで反映されます。
堀之内
> 堀之内さま,電脳 Ruby のみなさま: 京大M2 の松葉です.
>
> GAnalysis::corelation を使っていて気付いたのですが,GAnalysis::covarinace にバグを見つけました.
> パッチを作成してみましたので,添付いたします (本文中に入れてあります).GPhys のバージョンは
> 1.5.0-1 です.
>
> 内部で nary.div!(ndiv-1) という処理がなされていますが,NArrayMiss#div! がどうやら破壊的でないようです.
> irb で試した結果が以下です.ここで nary は NArrayMiss,ndiv は NArray::LINT が想定されていますので,
> それにあわせています.一応付しておくと,ruby-narray-miss (debian パッケージ) のバージョンは 1.2.8-3
> みたいです.
>
> ---------- irb 実行例 ここから ----------
> irb(main):001:0> require 'numru/gphys'; include NumRu
> => Object
> irb(main):002:0> a = NArrayMiss[10.0, 20.0, 30.0]
> => NArrayMiss.float(3):
> [ 10.0, 20.0, 30.0 ]
> irb(main):003:0> b = NArray[20, 40, 60]
> => NArray.int(3):
> [ 20, 40, 60 ]
> irb(main):004:0> a.div!(b) <---- 破壊的メソッドのつもり
> => NArrayMiss.float(3):
> [ 0.5, 0.5, 0.5 ]
> irb(main):005:0> a
> => NArrayMiss.float(3):
> [ 10.0, 20.0, 30.0 ] <---- 実際には反映されていない
> ---------- irb 実行例 ここまで ----------
>
> また,引数として,次元の整数値を指定すると動作しますが,次元名を与えるとエラーになります.
> GAnalysis::covariance では処理が実装されているのに対して,GAnalysis::corelation では実装されていない
> ので,NArray#sum(*dims) 実行時にエラーが出ます.なので,それにも対応できるようにしてみました
> (といってもコピーしただけですけど).
>
> 以下,作成してみましたパッチです.特に問題なければ,取り込んでいただけると幸いです.
>
> ---------- パッチここから ----------
> --- covariance.rb.org 2016-08-30 15:39:35.806303482 +0900
> +++ covariance.rb 2016-08-30 15:37:37.692734362 +0900
> @@ -48,7 +48,8 @@
> nary /= (ndiv-1)
> return UNumeric.new(nary, units), ndiv
> else
> - nary.div!(ndiv-1)
> + ndiv = ndiv.sum(*dims)
> + nary = nary.div!(ndiv-1)
> vary = VArray.new(nary,
> {"long_name"=>"covariance","units"=>units.to_s},
> "covariance")
> @@ -79,6 +80,12 @@
> gphys0 = gphys0.copy.replace_val(val0)
> gphys1 = gphys1.copy.replace_val(val1)
>
> + if dims.length == 0
> + dims = Array.new
> + gphys0.rank.times{|i| dims.push i }
> + else
> + dims = dims.map{|dim| gphys0.dim_index(dim) }
> + end
> covariance, ndiv = gphys0.covariance(gphys1,*dims)
> return covariance/(gphys0.stddev(*dims)*gphys1.stddev(*dims)),
> mask.to_type(NArray::LINT).sum(*dims)
> end
> ---------- パッチここまで ----------
>
> --
> 松葉 史剛 (Fumitaka MATSUBA)
> 京都大学大学院 理学研究科 地球惑星科学専攻
> 地球物理学教室 気象学研究室 M2
> E-mail: matsuba@xxxxxxxxxxxxxxxxxx
>
>