1

次の例を見てください。

boltzmann <- function(x, t=0.1) { exp(x/t) / sum(exp(x/t)) }
z=rnorm(10,mean=1,sd=0.5)
exp(z[1]/t)/sum(exp(z/t))
[1] 0.0006599707
boltzmann(z)[1]
[1] 0.0006599707

関数ではexpboltzmann要素とベクトルを操作し、正しいことをいつ実行するかを知っているようです。sum入力ベクトルを「展開」し、値に式を適用していますか?誰かがこれがRでどのように機能するかを説明できますか?

編集:R n00bに関するコメント、説明、および忍耐のすべてに感謝します。要約すると、これが機能する理由は、他の言語から来た私にはすぐにはわかりませんでした。Pythonを例にとってみましょう。最初に合計を計算してから、ベクトル内の各要素の値を計算します。

denom = sum([exp(v / t) for v in x])
vals = [exp(v / t) / denom for v in x]

Rはsum(exp(x/t))インラインで計算できますが、

4

3 に答える 3

4

これは、Rの概要セクション2.2:ベクトル演算で説明されています。

ベクトルは算術式で使用できます。その場合、演算は要素ごとに実行されます。同じ式で発生するベクトルは、すべて同じ長さである必要はありません。そうでない場合、式の値は、式で発生する最長のベクトルと同じ長さのベクトルになります。式内の短いベクトルは、最も長いベクトルの長さと一致するまで、必要に応じて(おそらく部分的に)再利用されます。特に、定数は単純に繰り返されます。したがって、上記の割り当てでは、コマンド

x <- c(10.4, 5.6, 3.1, 6.4, 21.7)
y <- c(x, 0, x)
v <- 2*x + y + 1

要素ごとに2*xを2.2回繰り返し、yを1回だけ繰り返し、1を11回繰り返して、合計して構築された長さ11の新しいベクトルvを生成します。

于 2013-03-04T15:57:32.570 に答える
3

分子と分母を別々に評価した場合、これはより明確になる可能性があります。

x = rnorm(10,mean=1,sd=0.5)
t = .1
exp(x/t)
# [1] 1.845179e+05 6.679273e+03 4.379369e+06 1.852623e+06 9.960374e+02
# [6] 1.359676e+09 6.154045e+03 1.777027e+01 1.070003e+04 6.217397e+04
sum(exp(x/t))
# [1] 2984044296

分子は長さ10のベクトルであり、分母は長さ1のベクトルであるため、除算は長さ10のベクトルを返します。

これをPythonと比較することに興味があるので、次の2つのルールがPythonに追加されたと想像してください(ちなみに、これらはの配列の使用法に似ていますnumpy)。

  1. リストを数値で割ると、リスト内のすべてのアイテムが数値で除算されます。

    [2, 4, 6, 8] / 2
    # [1, 2, 3, 4]
    
  2. Pythonの関数expは「ベクトル化」されています。つまり、リストに適用すると、リスト内の各アイテムに適用されます。ただし、sumは期待どおりに機能します。

    exp([1, 2, 3]) => [exp(1), exp(2), exp(3)]
    

その場合、このコードがPythonでどのように評価されるか想像してみてください。

t = .1
x = [1, 2, 3, 4]
exp(x/t) / sum(exp(x/t))

これらの2つの単純なルールを使用して、次の簡略化に従います。

exp([v / t for v in x]) / sum(exp([v / t for v in x]))
[exp(v / t) for v in x] / sum([exp(v / t) for v in x])

今、あなたはそれが違いをどのように知っているかわかりますか?

于 2013-03-04T15:58:50.960 に答える
1

ベクトル化は、Rではいくつかのわずかに異なる意味を持っています。

これは、ベクトル入力を受け入れ、各要素を変換し、ベクトルを返すことを意味します(expそうするように)。

また、ベクトル入力を受け入れて要約統計量を計算し、スカラー値を返すことも意味します(meanそうするように)。

sum2番目の動作に準拠しますが、3番目のベクトル化動作もあり、入力全体で要約統計量を作成します。sum(1, 2:3, 4:6)たとえば、試してみてください。

于 2013-03-04T15:58:10.600 に答える