技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

ゾンビウイルスが蔓延したと仮定して何日で全滅するか

ゾンビウイルスが蔓延したと仮定して、どれくらいの期間で死滅するか考えてみる。
これは要するに生存者は何日立てこもれば生存できるのかという事である。

大前提として 「生物としての肉体的変質を伴わない前提」 としたい。
例えばバイオハザードの G ウイルスみたいに、「生物を遺伝子レベルで書き換えてデタラメに進化させてしまう」みたいな話になってくると、体の構造なんて予測もつかないので想定すらできない。

もう一つの前提は 生物としての代謝は変わらない という前提だ。
良くバイオの映画だと、感染したら速攻腐ったような肌色になって、なんなら腐った体で襲い掛かってくる。
そもそも代謝が停止していて栄養分が筋肉に渡ってないなら、筋肉を動かすエネルギーなんて全身に届くハズもない。
つまり体が動くハズがないので、あくまで感染したら食う以外の思考が全部ぶっ飛ぶ前提とする。

「食う事しか考えない」最もアホな型

実写映画バイオハザードの一番最初の作品で、AI が「食う事よ」と言っていた。
まさかと思うが「飲まない」とした場合、どうなるか?

結論: 1 週間以内にゾンビは全滅する(ゾンビの死因は脱水症状)

人は発汗だけで1日 1.5~2リットル ( 1日に必要な水分量は? | BRITA® )ここにトイレ等も含めると、普通に 2.8~3 リットルは最低限欲しい。
が、人肉でこれを補給する場合、人体の水分の割合は 7 割で、ここから 3 リットルの水を得ようとすると 4.29kg もの肉を食うことに…

見れば分かるが、こんな質量の肉1日に食えません…当然消化だってしなきゃいけないし排泄だって必要ですもん…
ということで、「水を飲む」ことを止めたゾンビは早晩行動不能に陥る。

続きを読む

確率周りの定義

確率周りの定義

  • 確率変数: 確率が割り当てられる変数。サイコロなら $\frac{1}{6}$ の確率が確率変数(1-6 で変動)に割り当てられてると言える。
  • 現実値: 確率変数の取りえる値。サイコロなら 1-6
  • 離散確率変数、連続確率変数: 確率変数の値の範囲が有限数の場合を 離散確率変数 、そうでないときに 連続確率変数 という。

確率分布関数

確率変数 X が実数 x いかになる確率の事。離散確率変数は $F(X)$ で記述し、定義は


F(X) = P(X \leq x) = \sum_{x_i \leq x} p(x_i)

確率密度関数

連続確率変数の場合は、分布関数の導関数を密度関数(確率密度関数)という。


f(x) = \frac{dF(x)}{dx}

平均の確率での表し方

確率変数を X とし、平均(期待値)を $E(X)$ で表すとこんな感じで表す。


E(X) = \sum_x xf(x)

Σ 事象 x × 発生確率 f(x)

と読み替えると分かりやすいか

各種分布

  • 一様分布 : サイコロなどはすべての確率変数が一様に $\frac{1}{6}$ の確率で、このように一様なさまを一様分布という
  • ベルヌーイ分布 : 結果が2択の分布をベルヌーイ分布という。コインとか。尚、二択の結果が出る試行を ベルヌーイ試行 というそうな
  • 二項分布 : ベルヌーイ試行を独立に n 回繰り返したときの成功回数を確率変数とする分布。
    全住民の 5% がある感染症に罹患していて、その住民の中から無作為に 500 人抽出した。この抽出した 500 人のうち、罹患者が紛れ込む人数の分布等。

二項分布の例

# 500 人抽出, 5% の罹患率, 100 回抽出
x = np.random.binomial(500, 0.05, 100)
x.shape  # (100,)
続きを読む

ベイズ定理を使ってみる

A を結果事象、 B をその原因事象としたとき、「 A の原因が B に起因したものである確率 」を以下の式で示す


P(B|A) = P_A(B) = \frac{P_B(A) P(B)}{ P_B(A) P(B) + P_{B^c}(A) P(B^c) }

P_A(B) は事象  A が起きた後の B の発生確率(事後確率)。
この時 P(B) は事象 A が発生する前の事象 B の確率(事前確率)。
P_B(A)A が発生した際に、 B が原因である確率(尤度)。

これは原因が一つであることを前提とした式で、原因が複数 ( B_1, B_2, B_3, ... 等)ある場合の一般式は


P(B_i|A) = P_A(B_i) = \frac{P(A|B_i) P(B_i)}{ \sum^k_{j=1} P(A|B_j) P(B_j) }

実計算

  • ある病気 X に感染している可能性は 0.1 % である。
  • ある PCR 検査したとき、感染している患者は 99% の確率で陽性反応が出る。
  • 健康な人に PCR 検査を行った時、3% の確率で陽性反応が誤検知される。
  • あなたは陽性反応が出ている。実際に感染している可能性は?

事象から定義してみる。

  • A : X に感染している
  • B : PCR が陽性を示す

P_A(B) ... 感染している人が陽性反応を示す = 0.99 \\
P(A) ... 感染している可能性 = 0.001 \\
P_{A^c}(B) ... 感染していないが陽性反応が出てしまった 0.03 \\
P(A^c) ... 非感染者の割合 = 0.999

とすると、ベイズ定理に当てはめると


P_A(B) = \frac{P_B(A) P(B)}{ P_B(A) P(B) + P_{B^c}(A) P(B^c) }

因果的には PCR (B) → 感染? (A) なので、AB読み替えで


P_B(A) = \frac{P_A(B) P(A)}{ P_A(B) P(A) + P_{A^c}(B) P(A^c) } \\
= \frac{ 0.99 \cdot 0.001 }{ 0.99 \cdot 0.001 + 0.03 \cdot 0.999 } \\
= \frac{ 0.00099 }{ 0.00099 + 0.02997 }
= 0.03197674418604651

結論: 約 3.2% の確率で感染しています。
と、いうように扱うことができた。

確率の勉強

確率のキーワード周りを勉強してみる。
一般的な概念として分かりやすい例なので、サイコロを例に考えてみる。

試行と事象

とりえる値をランダムに1回抽出することを 試行 という

import numpy as np

dice = np.array([1, 2, 3, 4, 5, 6])  # サイコロの取りえる値 = 標本空間
print(np.random.choice(dice))    # 試行

そして結果としてランダムに一つ出現する。

3

こうした個々の結果を 事象 という。
具体的には個々の結果を 基本事象 といい、発生し得るすべての基本自称を集めた集合(上記だと dice 変数)を 標本空間 という。
この標本空間の一部(1個の場合≒基本事象も含む)を指して言う場合に 事象 という。

事象の計算周り

空集合も事象としてみなすことができ、これを 空事象 という。サイコロでいうと、 7 が出る確率なんて存在しないので、空事象とみなせる。
ある事象を  K (仮に、2, 4, 6 の事象と仮定)したとき、これ以外の取りえる値 (1, 3, 5) を 余事象 といい、  c を使って表す


K = \{ 2, 4, 6 \} \\
K^c = \{ 1, 3, 5 \}

また、二つの事象を


A = \{ 2, 4, 6 \} \\
B = \{ 1, 2, 5, 6 \}

としたとき、 積事象 (両方の事象に含まれる事象)を  A \cap B 和事象 (両方の事象の集合) を  A \cup B と記述する。


A \cap B = \{ 2, 6 \} \\
A \cup B = \{ 1, 2, 4, 5, 6 \}

またそれぞれ発生する確率を次の様に書く(  P は確率で用いる一般的な名称 )


P(X) = \frac{1}{6} 基本事象の発生確率 \\
P( \phi ) = 0  空事象の発生確率 \\
P(A \cap B) = \frac{1}{3} 積事象の発生確率 \\
P(A \cup B) = \frac{5}{6} 和事象の発生確率
続きを読む

RNN に計算問題を解かせる

white-azalea.hatenablog.jp

この辺の続き。
参考は

実装したあれこれは後述

RNN が時系列データから次の値を予測するものならば、「時系列データ=足し算するべき二つのビット列を指定、予測したい値=足した結果のビット列」で学習させれば、確かに計算器を作成することは可能かもしれない。
この使い方は思いつきませんでした。

これ、次元数増やせばそれだけでかなり複雑な判定とか出せそうな気がします。
例えば入力系統を増やして、オペレータを指定してみるとか…

続きを読む

転売屋は違法なのかどうか?(結論から言えば程度と内容問題)

ホビージャパンの社員が、転売を容認するような Tweet をした結果、担当者が退職処分になった話を受けて色々調べた。

hobby.watch.impress.co.jp

転売そのものが社会悪(購入者も本来の値段で買えない、販売者は潜在顧客を失う、関連商品購買を意図していた場合その分の金額を転売屋に吸われる等)等は色々議論しつくされているので、ここで触れる気はない。

そもそも論転売行為自体は違法なのか?

結論から言えば、 特定条件が揃えば違法になる 可能性があるということ。

違法になりえるケース

継続的、反復的に転売を繰り返しているケース

該当する法律は「古物営業法」で、これは「古物」の取り扱いを営業として行う場合、公安から許可を受けなければならないという法律。

elaws.e-gov.go.jp

ここでいう「古物」は以下の様に書かれている。

一度使用された物品(鑑賞的美術品及び商品券、乗車券、郵便切手その他政令で定めるこれらに類する証票その他の物を含み、大型機械類(船舶、航空機、工作機械その他これらに類する物をいう。)で政令で定めるものを除く。以下同じ。)若しくは使用されない物品で使用のために取引されたもの又はこれらの物品に幾分の手入れをしたものをいう。

「使用されない物品で使用のために取引されたもの」の定義があるため、未使用品だろうが古物は古物。
これが「古物営業」となった場合、公安に届け出してくださいね。という法律な訳だ。

では古物営業というのは

一 古物を売買し、若しくは交換し、又は委託を受けて売買し、若しくは交換する営業であつて、古物を売却すること又は自己が売却した物品を当該売却の相手方から買い受けることのみを行うもの以外のもの 二 古物市場(古物商間の古物の売買又は交換のための市場をいう。以下同じ。)を経営する営業 三 古物の売買をしようとする者のあつせんを競りの方法(政令で定める電子情報処理組織を使用する競りの方法その他の政令で定めるものに限る。)により行う営業(前号に掲げるものを除く。以下「古物競りあつせん業」という。)

関連しそうなのが「古物を売買交換する営業」「古物の売買をしようとする者のあつせんを競り(オークション)の方法により行う営業」
結論から言えば、こうした「営業」とみなされるかどうかが違法かどうかのボーダーラインになる。

そのため、継続的だったり反復的だったり、転売で利益を得ようとする行為=営業していると判断できる場合は、古物営業法に基づく届け出をしていない限り違法となる。
あくまで自分に不要となったものを中古で出品するだけなら、反復的/継続的にもなりようがないのでこの場合はしょっ引かれる心配はないだろう。

2020 年 6 月に、衣類での転売屋がこれで書類送検されている。 「ギャルソン」古着転売で書類送検 何が違法だったのか | WWDJAPAN

店が転売禁止として販売しているものを転売したケース

転売禁止を明示している店で購入した商品を転売した場合、正式店舗側としては「転売しないことを条件に売っている」という内容を反故にされたことから、詐欺として成立すると考えられます。
もっとも本当にその店舗で買われたものなのか証明しにくいので、販売店側が訴えざるを得ない所はありますが…。

特定イベント限定商品などは追跡しやすいでしょうね。見つけたら報告(通報して良いかは不明)してあげましょうw

チケット等の転売

チケット等の転売はそもそも違法です(平成30年成立)
https://www.bunka.go.jp/seisaku/bunka_gyosei/ticket_resale_ban/index.html

これは見かけたら通報してあげましょう!

最後に

私は法律のプロではありません!質問されても困ります。
他に「こんなケースあるで」があれば是非。

数学回続き

white-azalea.hatenablog.jp

white-azalea.hatenablog.jp

この辺の続き。

二つのベクトル A, B において、B に対して A 方向から垂直に光が当たったと仮定する。
この時、影となった部分のベクトルを「射影」という。

この射影の長さは、垂直の三角形の関係から計算できるので、内積角が分かっているなら


a = \vec{OA} , b=\vec{OB} とし、その射影 \vec{OH} の長さは、 \\
\| a \| cos \theta

また、内積 を利用して射影をベクトルとして処理する場合


\vec{OH} = \| a \| cos \theta * \frac{b}{\| b \|} \\
= \| a \| \frac {a^Tb}{\|a\|\|b\|} * \frac{b}{\| b \|} \\
= \frac{a^Tb}{\|b\|^2}b

で、これが何の役に立つか…って「影」って言ってるよね(汗
ゲームでおなじみの影の処理で普通に使われております。

行列計算のブロック化

例えば次の様な行列 A, B について、 AB を求めたいとしたとき


A = \begin{pmatrix}
  1 & 1 & 1 & 2 \\
    & 1 & 1 & 1 \\
    &   & 1 & 1 \\
    &   & 1 & 1
\end{pmatrix},
B = \begin{pmatrix}
  2 & 1 & 1 & 1 \\
    & 1 & 1 & 1 \\
    &   & 2 & 1 \\
    &   & 1 & 1
\end{pmatrix}

このような行列のドット積を考えるとき


A_{11} = \begin{pmatrix}
  1 & 1 \\
    & 1
\end{pmatrix},
A_{12} = \begin{pmatrix}
  1 & 2 \\
  1 & 1
\end{pmatrix} \\
A_{21} = \begin{pmatrix}
    &   \\
    &  
\end{pmatrix},
A_{22} = \begin{pmatrix}
  1 & 1 \\
  1 & 1
\end{pmatrix} \\

同様に


B_{11} = \begin{pmatrix}
  2 & 1 \\
    & 1
\end{pmatrix},
B_{12} = \begin{pmatrix}
  1 & 1 \\
  1 & 1
\end{pmatrix} \\
B_{21} = \begin{pmatrix}
    &   \\
    &  
\end{pmatrix},
B_{22} = \begin{pmatrix}
  2 & 1 \\
  1 & 1
\end{pmatrix}

と分割し、  AB を考えると


AB = \begin{pmatrix}
A_{11}B_{11} + A_{12}B{21} & A_{11}B_{12} + A_{12}B{22} \\
A_{21}B_{11} + A_{22}B{21} & A_{21}B_{12} + A_{22}B{22}
\end{pmatrix}

の式に展開できる。
これを順に計算していく。

左上をまず計算すると


A_{11}B_{11} + A_{12}B{21} = \begin{pmatrix}
  1 & 1 \\
    & 1
\end{pmatrix}
\begin{pmatrix}
  2 & 1 \\
    & 1
\end{pmatrix} + \begin{pmatrix}
  1 & 2 \\
  1 & 1
\end{pmatrix}
\begin{pmatrix}
    &   \\
    &  
\end{pmatrix} \\
= \begin{pmatrix}
  2 & 2 \\
  0 & 1
\end{pmatrix}

こんなノリで残りを計算して


AB = \begin{pmatrix}
  2 & 2 & 6 & 5 \\
  0 & 1 & 4 & 3 \\
  0 & 0 & 3 & 2 \\
  0 & 0 & 3 & 2
\end{pmatrix}

検算してみると

import numpy as np

a = np.array([
    [1,1,1,2],
    [0,1,1,1],
    [0,0,1,1],
    [0,0,1,1]
])
b = np.array([
    [2,1,1,1],
    [0,1,1,1],
    [0,0,2,1],
    [0,0,1,1]
])
print(a.dot(b))
[[2 2 6 5]
 [0 1 4 3]
 [0 0 3 2]
 [0 0 3 2]]

と、正しく計算された。