- ベストアンサー
RUBYのプログラムわかりません。
昨日からRUBYを始めた初心者です。 BOX-COX変換を見て、コードを 動かそうとしましたが、NEW演算子?でエラーが 出たりして動きません。WINDOWS版ですがどのように すれば動くのでしょう。NEW演算子はクラス以外の 生成でどう使うのでしょう?下記NEW演算子の ところを抜き出しました。 どうぞよろしくお願い致します。 ar=[5.5,4.0,6.0,5.0,5.0,4.0,4.3] def Box_Cox1(ar, add) ary=[1.2,2.0] transformed_dn = ary.new() return ar.size end add = "0.01" begin p Box_Cox1(ar, add) end
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ここのソースを使ってるのね。 http://sato.jfast1.net/Tool/Box_Cox1.html arrayは2次元配列を指定するみたいだよ。 include Math ary = [[5.0,5.0,3.3,4.3,4.0,5.5,4.0,6.0,5.0,5.0,4.0, 4.3,5.3,5.0,6.0,6.7,6.5,6.0,6.0,5.3,7.0,5.0, 6.3,5.3,4.5,6.0,7.0], [2.0,2.5,1.5,1.7,1.0,1.0,2.0,1.0,1.7,2.0,2.0, 1.0,1.3,2.5,1.0,2.0,2.0,1.0,3.0,1.3,1.0,2.0, 2.0,1.7,1.0,1.0,1.0]] puts Box_Cox1(ary, 0.01) 最初のinclude Mathはlogメソッド使ってるようなので。
その他の回答 (1)
- Yokoken
- ベストアンサー率32% (27/84)
通常Rubyでの配列のNewによる宣言は、 a = Array.new といったように、Arrayクラスのnewメソッドを使うという感じで使います。 これで、a は空の配列が出来ます。 transformed_dn という空の配列を作るのであれば、 transformed_dn = Array.new という形になると思いますが。 そして、その配列にary をコピーするといった形を取ればいいのではないでしょうか? 配列はクラスとはまた違うと思いますので、 質問者さんのなさっているような宣言は出来ないかと思います。 以上下手な回答ですが、 良かったら参考にしてください。
補足
Yokokenさん、ありがとうございます。 配列について、よくわかりました。 下記のコードでまだ、16行目のSIZE メソッドで エラーが出てしまいます。 なんとか動かしたいのですがどこがおかしいのでしょう? def Box_Cox1(array, add) # 定数、変数の初期設定 length = 1.0 # ポイント間の初期距離 ramda_dn = -10.0 # λ値(下位置) ramda_md = ramda_dn + length # λ値(中位置) ramda_up = ramda_md + length # λ値(上位置) # 配列の準備と全サンプル数の数え上げ、自由度の計算 sample_number = 0 # 全サンプル数 transformed_dn = Array.new() # ramda_upで変換されたデータ値 transformed_md = Array.new() # ramda_mdで変換されたデータ値 transformed_up = Array.new() # ramda_dnで変換されたデータ値 for block in 0..array.size-1 transformed_dn << Array.new(array[block].size,0.0) transformed_md << Array.new(array[block].size,0.0) transformed_up << Array.new(array[block].size,0.0) sample_number += array[block].size end df = sample_number-array.size # 自由度 # データに0が含まれていたら、小さな数を足す for block in 0..array.size-1 for n in 0..array[block].size-1 if array[block][n] == 0 then array[block][n] += add end end end # ■↓■↓■↓■3点法ループの開始■↓■↓■↓■ until length < 0.0001 || ramda_md >= 10 # 変換値とその合計を算出 sum_dn, sum_md, sum_up, sum_ln = 0.0, 0.0, 0.0, 0.0 for block in 0..array.size-1 for n in 0..array[block].size-1 if ramda_dn != 0 then transformed_dn[block][n] = (array[block][n] **ramda_dn - 1) / ramda_dn else transformed_dn[block][n] = log(array[block][n]) end if ramda_md != 0 then transformed_md[block][n] = (array[block][n] **ramda_md - 1) / ramda_md else transformed_md[block][n] = log(array[block][n]) end if ramda_up != 0 then transformed_up[block][n] = (array[block][n] **ramda_up - 1) / ramda_up else transformed_up[block][n] = log(array[block][n]) end sum_dn += transformed_dn[block][n] sum_md += transformed_md[block][n] sum_up += transformed_up[block][n] sum_ln += log(array[block][n]) end end # 変換値の分散を算出 mean_dn = sum_dn / sample_number mean_md = sum_md / sample_number mean_up = sum_up / sample_number varianth_dn, varianth_md, varianth_up = 0.0, 0.0, 0.0 for block in 0..array.size-1 for n in 0..array[block].size-1 varianth_dn += (transformed_dn[block][n] - mean_dn)**2 varianth_md += (transformed_md[block][n] - mean_md)**2 varianth_up += (transformed_up[block][n] - mean_up)**2 end end varianth_up = varianth_up / (sample_number-1) varianth_md = varianth_md / (sample_number-1) varianth_dn = varianth_dn / (sample_number-1) # L値を算出 l_dn = -0.5*df*log(varianth_dn) + (ramda_dn-1)*df*sum_ln / sample_number l_md = -0.5*df*log(varianth_md) + (ramda_md-1)*df*sum_ln / sample_number l_up = -0.5*df*log(varianth_up) + (ramda_up-1)*df*sum_ln / sample_number # L値の評価と次のλ値の設定 if l_dn < l_md and l_md < l_up then ramda_dn += length ramda_md += length ramda_up += length elsif l_dn > l_md then length = length / 4 ramda_md = ramda_dn + length ramda_up = ramda_md + length else length = length / 2 ramda_md = ramda_dn + length ramda_up = ramda_md + length end end # ■↑■↑■↑■ループの終わり■↑■↑■↑■ return ramda_md end ar=[5.5,4.0,6.0,5.0,5.0,4.0,4.3] add = "0.01" begin p Box_Cox1(ar, add) end