starwish’s diary

おじさんの自由研究

平均値を図形で理解しよう

おじさんの趣味は日曜工作である。先日来自宅の居間の隅にある隙間が気になっており、そこにちょうど収まる棚の作成を思い立った。まずは設計だと思い、メジャーを持って隙間の幅を測ってみたのだが、歳のせいか手の震えも手伝って、測るたびに数字がぶれてしまう。一度目は78.1cm、二度目は78.5cm、その次は77.8cmとなった。ううむ、おじさんはこの隙間の本当の幅が知りたい。
測定値は何らかの原因により本当の値の近辺にばらつくものだろうから、すべての測定値との差がなるべく小さくなるような値を見つければ、本当の値とは言えないまでも、それに近い値が得られるはずだ。そのような値をmとすると、この値をいろいろと変えてみて測定値xとの誤差(x_n-m)の合計がなるべく小さくなるような値を探せば良いのではないか。だが誤差をそのまま合計をとるとmが負の無限大となって工作が不可能になる。これを避けるために誤差の二乗和\sum_n^N{(x_n-m)^2}を最小にするmとするのが良さそうだ。そのようなmを見つけるにはどうすればいいだろう。
誤差の二乗和は2次関数なので、高校の数学で習った極値問題とみなし、微分して0になる値として求めるのが定石だろうが、図形的に求めることはできないだろうか。\sum_n^N{(x_n-m)^2}はN次元空間における点\textbf{x}=(x_1,...,x_N)と点\textbf{m}=(m,...,m)の距離と捉えることもできる。この距離を図で表現するため、1つ目の測定をX_1軸、2つ目の測定をX_2軸とする、X_1X_2の2次元空間で考えてみよう。

上の図で測定値は点x(x_1,x_2)で表されている。mの値は本当の値であり、測定するたびに変化することはないのだから、この図における点mX_1軸とX_2軸の値が同じになる点、つまりX_1=X_2の線上のどこかにあるはずだ。その何処かにある点mと点xの距離が最小になるためには、mxを結ぶ線が線X_1=X_2と直角に交わることが必要だ。ということは原点とxmを結んだ線が直角三角形になるということだ。一般に原点と点(x,y)の距離はx^2+y^2なので次の式がなりたち、
{x_1}^2+{x_2}^2=m^2+m^2+(m-x_1)^2+(m-x_2)^2
これを整理すると
m=\displaystyle\frac{x_1+x_2}{2}
測定値がN個あったとすると、N次元空間で同様な議論がなりたち、
\sum_n^N{{x_n}^2}=m^2+m^2+\sum_n^N{(m-x_n)^2}
これを整理すると

m=\displaystyle\frac{\sum_n^N{x_n}}{N}

となって、mの値が求まった。これは学校で習った平均値を求める式と同じだ。つまりおじさんが探していたmとはいわゆる平均値のことであった。

国債について

最近国の財政に興味があって国債について調べているが、国債発行残高を国の借金と勘違いして、「子や孫の世代が膨大な国債残高をみて絶望する」、「国債費が数百兆円という膨大な金額になって国が亡ぶ」とか言ってるひとがいて驚愕する。
国民が持っているお金はそもそも国債として発行されたものなので、国債残高が膨大だと言って嘆くのは、自分が頑張って働いた結果こんなに貯金してしまってごめんなさい、というのと同値だということになぜ気が付かないのか。また国債費が100兆円とかになって国が破綻するとかいう人って、明治時代に「国債費が1000万円にも膨れ上がり到底支払えなくなって国が破綻する!」と怒っている人の愚かさを想像してみるといい。
国債は借金ではなくただの通貨発行記録だ。そして経済を発展させるためには、定期的に通貨を発行する必要がある。ということは国債の残高が一方的に増えていくのは当たり前だ。これのどこがいけないのか。仮にあなたがタクシー運転手だとして、走行キロが増えていくのを嘆くか?

Python辞書リストの結合

Pythonでデータベース処理をしていると、必ず直面するのがテーブルの結合だ。次のようなテーブルを結合して

品名 炭水化物
001 11g
002 12g
003 13g
品名 塩分
002 1g
003 2g
005 3g

次のようにしたい

品名 炭水化物 塩分
002 12g 1g
003 13g 2g

pandasライブラリを使うとすぐにできることは知っているが、これだけのことにライブラリは使いたくない。そして面倒なループは使わず、一行でスッキリ書きたい。

a = [{"product":"001","carbon":"11g"},{"product":"002","carbon":"12g"},{"product":"003","carbon":"13g"}]
b = [{"product":"002","sodium":"1g"},{"product":"003","sodium":"2g"},{"product":"005","sodium":"3g"}]
result = [dict(ae,**be) for ae in a for be in b if ae["product"] == be["product"]]

いわゆるinner joinである。少し工夫すればouter joinもできそうだ。

新快速の思い出

f:id:starwish:20201018095911j:plain
1978年頃、大阪駅

阪神間に住む鉄分の多い小学生にとって新快速は特別の存在であった。「特急」をしのぐスピード、デッキ付き「急行型」車両という快適さ、という高パフォーマンスにも関わらず、料金的には「普通」扱い。乗ってみたいという気持ちを起こさせるに十分な魅力を備えているものの、京都、大阪、三ノ宮にしか停車しないというその魅力がかえって仇となり、特別な用事で遠出をしない限り乗れなかった。そういう意味でも、憧れの乗り物だった。

javascriptの_

javascriptのソース眺めてたら、変数名が_になっている

var [_,y,__] = [1,2,3]
console.log(_,y,__)

なんだこれはと思ったら、普通に変数名らしい。使われない変数だということを明示的に示すとき、慣例として_になっているようだ。
難しく考えて損したー。

pythonのreturn文

仕事や趣味でプログラムを書くことが多い。いつからか気が付かないうちにpythonで関数からreturnするとき、

def func():
  return (1)
print(func())

という感じで戻り値を()に入れる癖がついていて、先日returnは関数ではないので()に入れる必要はないと指摘され気が付いた。
ドキュメントを見直すと6.2.3. Parenthesized form
A parenthesized expression list yields whatever that expression list yields: if the list contains at least one comma, it yields a tuple; otherwise, it yields the single expression that makes up the expression list.
との記述があった。(x)はx、(x,)はtuple([x])ということ。pythonを始めたときになぜtupleだけ要素が一つでも','がいるのか謎だったが、そういうことか。

阪急920系の思い出

昔とった写真を整理していたらこんなものが出てきた。阪急920系のお別れ会に参加したときのもの、おそらく1982年頃と思われる。

f:id:starwish:20200307173804j:plain
惜別920系
Wikiによると1948年5月製造となっているので、当時の車齢は38年、まだまだいけるんじゃないのか、という気もする。
f:id:starwish:20200307175335j:plain
920系室内
昭和レトロ感漂う、気品のある室内。
f:id:starwish:20200307174602j:plain
920系正面
改めて眺めると堂々とした風格のある車両だったなあ。