霞と側杖を食らう

ほしいものです。なにかいただけるとしあわせです。[https://www.amazon.jp/hz/wishlist/ls/2EIEFTV4IKSIJ?ref_=wl_share]

壊れるほど愛しても1/3も伝わらない純情な感情との衝動遊戯

 

【ABSTRACT】

一度壊れるほど愛したとき、1/3の感情が伝わるとして、壊れるほど愛する回数を増やしていくときの、すべての感情が伝わっている確率を計算した。感情が複雑になればなるほど、全てを伝えきるのは難しくなるという結論が得られた。

【OBJECTIVE】

SIAM SHADEの曲に『1/3の純情な感情』というものがある。この曲は、こう始まる。

壊れるほど愛しても1/3も伝わらない 純情な愛情は空回り I love you さえ言えないでいるMy heart

では、いったいぜんたい、どのくらい愛せば良いのだろうか。このような疑問が自然と湧いてくる。感情を伝えるのはとても難しいことだというのは周知の通りであるが、感情を全て伝えたいという欲求は否定されるべきではない。ただ、壊れるほど愛した結果、壊してしまってはいけない。そんなわけで、壊れるほど愛する回数を増やしていくとき、感情がどの程度伝わっているのかを考えていく。

【METHODS】

実際に、壊れるほど誰かを愛して、その人にどれくらい感情が伝わったかチェックするという手法が第一に思い浮かぶ。しかし、この手法には問題がいくつかある。壊れるほど愛した結果、その人を壊してしまってはいけないし、どれくらい感情が伝わったかをチェックするのはとても難しい(一番問題なのは壊れるほど愛する誰かの存在なのだが、これはここでは触れずに話を進めることにする。)。

こういう場面で役立つのがモデルだ。現象を近似・抽象化したモデルを作って考える。感情を要素に分解して、壊れるほど愛すると、要素のどれかが確率的に伝わっていくとするモデルをセッティングする。つまり、感情の要素を玉に見立てて、玉を箱に入れて、復元抽出することを想定すると分かりやすい。そのようなモデルで、感情の伝わっている割合、玉で言えば伝わっている玉の種類数の割合を確認していく。

【RESULTS】

感情には3つの要素があってどれか1つが伝わる場合

最も簡単なモデルを作る。伝えたい感情には3つの要素があるとする。1度壊れるほ愛すると、3つの要素のうち1つだけ伝わるとする。その1つの選ばれ方は一様で、それぞれ1/3ずつとする。つまり、ここでは壊れるほど愛すると感情の1/3が伝わるというわけだ。歌詞では1/3も伝わらないとあるが、簡単化のため、1/3とする。非復元抽出としてしまうと、3回愛せば終わってしまうので、復元抽出を考える。
たとえば、A,B,Cの要素があるとして、それぞれ1/3の確率で伝わるとする。5回壊れるほど愛したとして、A,B,A,A,Bと伝わる要素が実現したならば、伝わっているのはAとBで、Cは伝わっていないということになる。
初期値ベクトルと推移行列を用意して積をとれば、n回愛したあとの伝わっている確率は確認できるだろう。行列の積は面倒くさいので、以下、Rを用いて計算していく。

まず、必要なパッケージを読み込む。

library(expm) #行列のべき乗をするためのパッケージ

次に、初期値ベクトルと推移行列を用意する。A,B,Cが伝わっているか否かが問題なので、状態の数は2^3個の8個。伝わっていない状態を0,伝わっている状態を1としたら、(0,0,0),(1,0,0),(0,1,0),(0,0,1),(1,1,0),(1,0,1),(0,1,1),(1,1,1)の8個の状態があり、1回壊れるほど愛すると状態が確率的に推移するので、それを推移行列で表して、計算する。初期値ベクトルは(1,0,0,0,0,0,0,0)の転置したものである。

#初期値ベクトルの作成
vini <- numeric(2^3)
vini[1] <- 1
#推移行列
mtran <- matrix(c(0,1/3,1/3,1/3,0,0,0,0,
                    0,1/3,0,0,1/3,1/3,0,0,
                    0,0,1/3,0,1/3,0,1/3,0,
                    0,0,0,1/3,0,1/3,1/3,0,
                    0,0,0,0,2/3,0,0,1/3,
                    0,0,0,0,0,2/3,0,1/3,
                    0,0,0,0,0,0,2/3,1/3,
                    0,0,0,0,0,0,0,1),
                  nrow = 2^3,byrow = TRUE)

#5回壊れるほど愛したとする
k<-5
pmtran <- mtran%^%k
print(vini%*%pmtran)
##      [,1]        [,2]        [,3]        [,4]      [,5]      [,6]
## [1,]    0 0.004115226 0.004115226 0.004115226 0.1234568 0.1234568
##           [,7]     [,8]
## [1,] 0.1234568 0.617284

これは5回愛した後の(0,0,0),(1,0,0),(0,1,0),(0,0,1),(1,1,0),(1,0,1),(0,1,1),(1,1,1)の状態の確率である。5回壊れるほど愛することができれば、約6割の確率で全ての感情を伝えることができるということが分かる。また3割6分ほどの確率で感情の2/3は伝わっているということになる。

これを関数にする。k回愛した後の状態の確率分布を出力する関数を以下のように作る。

afterk <- function(k){
  vini <- numeric(2^3)
  vini[1] <- 1  #初期値ベクトル
  mtran <- matrix(c(0,1/3,1/3,1/3,0,0,0,0,
                    0,1/3,0,0,1/3,1/3,0,0,
                    0,0,1/3,0,1/3,0,1/3,0,
                    0,0,0,1/3,0,1/3,1/3,0,
                    0,0,0,0,2/3,0,0,1/3,
                    0,0,0,0,0,2/3,0,1/3,
                    0,0,0,0,0,0,2/3,1/3,
                    0,0,0,0,0,0,0,1),
                  nrow = 2^3,byrow = TRUE)    #推移行列
  pmtran <- mtran%^%k
  vini%*%pmtran
}

愛して伝える回数が、1回から15回のケースを計算して、感情が全部伝わっている確率をプロットする。

noftran <- 15
mresult<- apply(matrix(1:noftran, nrow = 1, byrow = TRUE), MARGIN = 2,afterk)
plot(mresult[2^3,], xlab = "伝える回数", ylab = "全部伝わっている確率",type="b")
abline(h=0.95)

y=0.95のところに直線を引いた。11回壊れるほど愛したら、95%以上の確率で全ての感情が伝わっていることが期待できるということだ。こりゃめでたい。

ちなみに、状態を0,1を全ての感情の種類に割り当てたものより、何種類の感情が伝わっているかを表したものの方が、楽に記述できる。結果は変わらない。後の比較のために、y=0.5にも直線を引いた。

afterk <- function(k){
  vini <- numeric(3*1+1)
  vini[1] <- 1  #初期値ベクトル
  mtran <- matrix(c(0,1,0,0,
                    0,1/3,2/3,0,
                    0,0,2/3,1/3,
                    0,0,0,1),
                  nrow = 3+1,byrow = TRUE)    #推移行列
  pmtran <- mtran%^%k
  vini%*%pmtran
}
noftran <- 15
mresult<- apply(matrix(1:noftran, nrow = 1, byrow = TRUE), MARGIN = 2,afterk)
plot(mresult[3+1,], xlab = "伝える回数", ylab = "全部伝わっている確率",type="b")
abline(h=0.95)
abline(h=0.5)

感情には6つの要素があってどれか2つが伝わる場合

感情の要素が3つの場合を考えてきたが、人間の感情はそんなに単純ではない。感情の要素を増やして、感情を複雑にしてみよう。具体的には同じセッティングで感情の要素を6つにして、どれか2つが伝わるとする。同様に関数を作成して、全ての感情が伝わっている確率をプロットする。

afterk <- function(k){
  vini <- numeric(3*2+1)
  vini[1] <- 1  #初期値ベクトル
  mtran <- matrix(c(0,0,choose(6,2),0,0,0,0,
                    0,0,choose(5,1),choose(5,2),0,0,0,
                    0,0,choose(2,2),choose(2,1)*choose(4,1),choose(4,2),0,0,
                    0,0,0,choose(3,2),choose(3,1)*choose(3,1),choose(3,2),0,
                    0,0,0,0,choose(4,2),choose(4,1)*choose(2,1),choose(2,2),
                    0,0,0,0,0,choose(5,2),choose(5,1),
                    0,0,0,0,0,0,choose(6,2)),
                  nrow = 3*2+1,byrow = TRUE)    #推移行列
  mtran <- mtran/choose(6,2)
  pmtran <- mtran%^%k
  vini%*%pmtran
}
noftran <- 15
mresult<- apply(matrix(1:noftran, nrow = 1, byrow = TRUE), MARGIN = 2,afterk)
plot(mresult[3*2+1,], xlab = "伝える回数", ylab = "全部伝わっている確率",type="b")
abline(h=0.95)
abline(h=0.5)

12回壊れるほど愛したら、95%以上の確率で全ての感情が伝わっていることが期待できるということだ。感情が3つのときは11回であったのに比べて必要な回数が増えている。伝える回数の増加に伴う確率の上昇も緩やかになっていることが分かる。これは同じ要素が伝わてしまう確率、つまりダブって伝わる確率が増えているためである。感情の要素をさらに増やしていくと同様のことが確認できる(昔pythonで推移行列を簡単に作成できるコードを書いたのだが、どこかに消えてしまったし、そのアイデアが思い出せないし、すぐに思いつかない。書ける人は書いて確認してほしい。)。このことは、感情が複雑になればなるほど、感情を伝えるのには時間がかかると解釈することができる。

【CONCLUSIONS】

一度壊れるほど愛したとき、1/3の感情が伝わるとして、壊れるほど愛する回数を増やしていくときの、感情の全部が伝わっている確率を計算した結果、感情が複雑になればなるほど、全てを伝えきるのは難しくなるという結論が得られた。

別の応用先としては、ガチャのコンプ問題が考えられる。ガチャの出てくるものが一様の確率で選ばれる復元抽出だった場合、今回のモデルと同様の問題に帰着する。また、以下のような拡張系も予想できる。

伝わる確率が一様だと想定しているが、そうでないケースも考えられる。分布を変えるとどうなるかは今回は試していない。伝わりにくい感情だってあるだろう。また、伝わる確率がそれぞれ独立だということを仮定していたが、あることが伝わっている状態ならば、別のあることは伝わりやすいということや、その逆もありうる。伝えたと思った感情の要素は次は少し弱めにして他の要素が伝わるように工夫することだって考えられる。そういった相関関係や連鎖関係を仮定したモデリングも今回は作っていない。壊れるほど愛することができる関係ならば、相手からのシグナルを受け取ったり、反応を見てみたりしながら、どれが伝わっているかを確認したり、推測したりすることもできるだろう。そんなモデルも考えられる。

今回モデル化したのは、n回伝えた時点での伝わり具合であったが、視点を変えた問題として、全部伝わるまでに何回かかるのかを確率的に考えることができるだろう。おそらく、負の二項分布の拡張になるのだろうと予想しているが、実際にどのような分布になるかは考えていない。

一度壊れるほど愛した場合、壊れるリスクについての検討もしていない。今回は何度壊れるほど愛しても壊れない仮定を置いていた。壊れるリスクを付与したモデルを作っても面白いのかもしれない。

以上挙げたような、拡張可能性を有したモデルであるので、好きに拡張して、壊れるほど愛する際の参考にしてください。

【REFERENCES】

SIAM SHADE1/3の純情な感情
今回の発想の源泉となった曲。聞いたことのない方はぜひ一度聞いてみてください。