読者です 読者をやめる 読者になる 読者になる

家財保険

アパートの更新で、保険も再加入するように言われて、自由に選んで良いというので知らてべみた。現在は損保ジャパンで15000yen/2year。

http://www.fdma.go.jp/neuter/topics/houdou/h27/07/270716_houdou_1.pdf によると住宅火災は年間13000件程度。

統計局ホームページ/日本の住宅・土地−平成20年住宅・土地統計調査の解説−/1-1 総住宅数と総世帯数 によると住宅数は5759万戸。

1年あたりに火事が起こる確率pは0.0002(≒0.02%=1/1万)。 損害額をSとすると期待値S*p≒0.22で2千円ちょい。料金は安い所で4000円くらいだから、 15-50%が還元率か。 集合住宅だったら家賃に上乗せすれば・・・と思うが、我が国の保険信仰は凄まじいので、そんな知性を求めるのは無理。 建物全体でも入ってたりするのでとってもクレイジーな世界。

物件を探す時に保険を強制されない事を条件にするのも良いのかなと思いますね。

「プライム・ペア」問題 

自然数 k に対し、1 から k までの自然数のうち k と互いに素なものの個数を F(k) と定義します。 (F(k) はオイラーのΦ関数とも呼ばれています。参考:オイラーのφ関数(Wikipedia))

オイラーのφ関数 - Wikipedia

例えば F(12)=4 です。1 から 12 のうち 12 と互いに素なのは 1, 5, 7, 11 の 4 つです。

標準入力から、自然数 n(1 ≦ n ≦ 105)が与えられます。 標準出力に F(n!) を 1000003 で割った余りを出力するプログラムを書いてください。

例えば n=10 のとき、F(10!)=F(3628800)=829440 です。 同様に、F(20!) を 1000003 で割った値は 961998 です

求めるものはΦ(n!)でphi関数をバラすと n!Π_i (1-1/prime[i]) を計算すると (nまでの素数以外の積)(nまでの素数の積) とシンプルになるので、エラトステネスの篩でnまでの素数とそれ以外に分けて計算する。

def mark(s, x):
    for i in range(x + x, len(s), x):
        s[i] = False

def sieve(n):
    s = [True] * n
    for x in range(2, int(n**0.5) + 1):
        if s[x]: mark(s, x)
    return [i for i in range(0,n) if s[i] and i > 1]


N=int(input())
primes=sieve(N+1)
not_primes=list(set(range(2,N+1))-set(sieve(N+1)))
mod=1000003

res=1
for i in not_primes: 
    res*=i
    res%=mod

for i in primes:
    res*=i-1
    res%=mod
    
print(res%mod)

ヴァイオリンとピアノのための小ロンド

という曲を作って、録音&編集してUPしました。 www.youtube.com

Violinの音色はまだ使いこなていないけど、何とか弾きました(キーボードで)。 フランス(ジャズ?)、モーツアルトベートーヴェンを混ぜて劣化させたような曲になりました。Vn主題の急に速くなる箇所はモーツアルトの急激にかわる表情みたいなのを真似してみました。

ロンド(rounde)という形式はABACADみたいにグルグル回るようにAが出現するのですが, ソナタやシンフォニーの終楽章に多いです(ソナタ形式と混ざっている事も多いです)。 この曲はABACAという形式ですね 冒頭のソッソーレというのが主要な部分モチーフで全体的に使い回しています。

クラシック曲がわかりにくい理由の一つに、形式がやたら複雑というのもあると思いますね。推移みたいな要素と主題の区別がつきにくい曲も多いし、ABサビみたいな曲が分かりやすいのは、内容もだけど、形式がつかみやすいというのもあると思います。 曲のタイトルに(ソナタ、ロンド、3部)とか書いてあったら聞く助けになるのかなと思います。あと、モチーフの解説も。 この曲は解説の必要がないくらい分かりやすいと思いますけど。

「初めてコンテンツを食べる感動」みたいなのとはガチ度の高い曲ほど無縁なので、その辺の事情をわかってもらうのも聞かれるのが簡単な曲ばかり、みたいな事情を何とかするのに必要だと思いますね。ゲーム内の音楽だと、必然的に繰り返して聞かれる事になるので、複雑な曲でも理解されやすいです。

焼肉屋のメニューからランチ、肉の価格を推定してみる

近所の赤門のランチが安くてよく行くのですが、かなり得なんじゃないかと思って(よく注文するのは1000yen/300gのヤツ)、飲みながらデータ入力、回帰分析してみました。

www.akamon.co.jp

データはこちらのスプレッドシートakamon - Google スプレッドシート

サラダ,ライス等はデータ量が足りない過ぎるので、省いて線形回帰すると。

yaki=read.csv(pipe("pbpaste"),sep="\t")
yaki$lunch[is.na(yaki$lunch)]=0
lm=lm(price~simo_jou+jucy_cal+lunch,yaki)
summary(lm)

Call:
lm(formula = price ~ simo_jou + jucy_cal + lunch, data = yaki)

Residuals:
      1       2       3       4       5       6       7       8       9 
-219.06  959.72  -13.64 -366.81 -228.14 -132.06 -470.19  403.52   66.67 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept)  421.499    405.351   1.040  0.34606   
simo_jou       9.227      1.391   6.634  0.00117 **
jucy_cal       6.369      1.290   4.936  0.00434 **
lunch       -861.875    480.290  -1.794  0.13270   
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 558.9 on 5 degrees of freedom
Multiple R-squared:  0.9666, Adjusted R-squared:  0.9465 
F-statistic: 48.18 on 3 and 5 DF,  p-value: 0.0004114

ランチだと850円くらい安くなるってことでしょうか。 霜降りカルビは920yen/100g 我らのジューシーカルビは640yen/100g

そして、2番(楽盛り)の残差が物凄いけど(1000円高い)、肉以外の要素が適当だったからかとおもって、200円ずつ引いて再計算してみましたが、かえって大きくなって、よくメニューを見てみたけど、多分、普通に高いだけです。

量が増えるとグラムあたりの値段は下がるので、それを取り込むには微妙に直線から下がるように非線形変換したりすると良いんでしょうか。

誰か霜降りカルビと牛タン奢って下さい。

kerasでLSTM(RNN)

盛大にハマってしまったので、メモ。

映画の感情分析のサンプルは最初にembedding層があったりしてわかりにくかった。

入力(X_train)はこの場合(データ番号、時間、特徴量の次元)の3階テンソルで、1つのデータとは1つの系列の事かと勘違いしていた。 実際は下のように1つの時系列でも重複させて入力するのが正解らしい。

参考: qiita.com

import keras

def vec_to_df(vec,seqlen=5):
    a=vec
    df=[]

    for i in range(len(a)-seqlen):
        tmp=a[i:i+seqlen]
        df.append(tmp)

    return np.array(df)


import pandas as pd
import numpy as np
import math

# 乱数の係数
random_factor = 0.05
# サイクルあたりのステップ数
steps_per_cycle = 80
# 生成するサイクル数
number_of_cycles = 50

df = pd.DataFrame(np.arange(steps_per_cycle * number_of_cycles + 1), columns=["t"])
df["sin_t"] = df.t.apply(lambda x: math.sin(x * (2 * math.pi / steps_per_cycle)+ random.uniform(-1.0, +1.0) * random_factor))

length_of_sequences = 10
a=np.array(df.t)[:200]
xx=vec_to_df(a,length_of_sequences )
xx=np.reshape(xx,[xx.shape[0],10,1])
X_train=xx

y_train=np.array(df.sin_t)[:X_train.shape[0]]
y_train=np.reshape(y_train,[len(y_train),1])

from keras.models import Sequential  
from keras.layers.core import Dense, Activation  
from keras.layers.recurrent import LSTM


in_out_neurons = 1
hidden_neurons = 300

model = Sequential()  
model.add(LSTM(hidden_neurons, batch_input_shape=(None, 10,1),return_sequences=False))
model.add(Dense(in_out_neurons))  
model.add(Activation("linear"))  

model.compile(loss="mean_squared_error", optimizer="rmsprop")
model.fit(X_train, y_train, batch_size=1, nb_epoch=10, validation_split=0.05) 

ちなみに手を付けたキッカケは前にも書いたけど、和音の評価で、X_tとして和音の適当な表現の入力を与えて、オートエンコーダーの特徴量と比較することで評価できないかとおもうけど、手持ちのサンプルを連結を考えず縦のみ(280和音程度)で、ただのNN+AEで低次元にしてみてもあまり良くない様子。ちなみにtsneで2次元に射影すると良く似た和音がまとまっている。 今のところ一番マトモな音を生成しているのが、randomforestの旋律予測と、内声予測(和音の評価)(全てcategorical変数)を手動で重み付けしたもので、前に台形型の特徴量を作ってたのが何って感じですよorz ちなみに、和声の回答集は買ったけど入力する気力が。。。。

作曲家総選挙2016

というものをtwitterでやっていて

twitter.com

言語処理のお勉強のために、作曲家名の情報を知らないとして抽出できないか試してみた。

word2vecとクラスタリングとかもやってみたけどあまりうまく行かず、良かったのはtf-idfで重み付けして、ソートした最上位の単語を抽出。 前処理は ・Mecab分かち書きストップワード除去 ・1文字の単語除去 ・記号,URLを除去

くらい。 変な文字が多いからか、python文字コード関係でちょっと虐められました。 あと、最後の結果からひらがな・漢字を含む単語は除去。作曲家名はカタカナなので卑怯だが、なくてもまずまずの結果だった。

選挙なので、抽出した単語集計した結果(n>=3) f:id:biones:20160819192225p:plain

敬愛するモーリス・ラヴェル先生が一位!(主催者らしいが!) クヴァンツとか私も知らない作曲家も抽出できてるし、まずまずなのかなと。 フォロワ作曲弦楽四重奏 D-mollとか・・・無いですね。

スライドパズル

を解くpythonスクリプト

焼きなまし法で、状態遷移はルール通り、評価関数は正しい位置とのマンハッタン距離。