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

という曲を作って、録音&編集して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とか・・・無いですね。

LiNGAMモデル(因果推論)

因果推論周辺について調べた。

構造方程式モデルによる因果推論: 因果構造探索に関する最近の発展 http://www.ar.sanken.osaka-u.ac.jp/~sshimizu/papers/BSJ2012_Tutorial_final_web.pdf

ガウス性を用いた線形非巡回なデータ生成過程部分の発見と同定 https://kaigi.org/jsai/webprogram/2012/pdf/258.pdf

ざっくり書くと、xを確率変数を縦にならべたベクトルとして,非巡回かつ潜在変数なしで、xを並び替えてBを下三角行列、eを非正規分布の確率ノイズとして x=Bx+e  とかけるようなモデル。 結局、correlation-faithfulness の仮定がいるのか、チェックはどうするのか、eが非ガウスならOKなのかよく分からなかった。 とりあえず、Rのpcalgというパッケージの中のLINGAMで試してみた。

#1から2
x1=runif(N)-0.5
x2=x1*0.7+runif(N)-0.5
LINGAM(cbind(x1,x2))

$B
         [,1] [,2]
[1,] 0.000000    0
[2,] 1.582669    0

$Adj
      [,1]  [,2]
[1,] FALSE  TRUE
[2,] FALSE FALSE
#2から1
x2=runif(N)-0.5
x1=2*x2+runif(N)-0.5
LINGAM(cbind(x1,x2))

LINGAM(cbind(x1,x2))
$B
     [,1]     [,2]
[1,]    0 1.738995
[2,]    0 0.000000

$Adj
      [,1]  [,2]
[1,] FALSE FALSE
[2,]  TRUE FALSE
#1から2へガウスノイズ
x1=runif(N)-0.5
x2=x1*1.5+rnorm(N)
LINGAM(cbind(x1,x2))

$B
         [,1] [,2]
[1,] 0.000000    0
[2,] 1.845528    0

$Adj
      [,1]  [,2]
[1,] FALSE  TRUE
[2,] FALSE FALSE

ガウスでも多少は当たる!? (上の例で160/200回くらいの正解率)

モデル妥当性のチェックも機械学習のcross-validationみたいなのが無いので、良く分からない。

• ブートストラップ法によるアプローチ: – サンプルサイズが小さいか非ガウス性が小さいかすれば、ブートスト ラップ標本についてのLiNGAMの結果は大きくばらつくはず

ふーむ。。。。

2声の自動生成

4声は悲惨だが2声の対旋律付けなら酷いレベルではない・・・とおもう。 ドフェミファソファミレの繰り返しのバスに対してソプラノの対旋律を生成した(両方生成する事もできる)。

www.youtube.com

G7でファ→ミの限定進行など和声っぽい音の動きが見られた。

ハ長調ではなくて旋法(ドリアとか)だと面白いのだけど、印刷物含めデータが多くないので、いずれ。

f:id:biones:20160307215903j:plain

上の画像の台形の音の音程について、(前の和音のMIDI距離,ソプラノの増分,テノールの増分)を特徴量としている。 この例だと(17,1,2)というベクトル。 探索方法はとりあえずで、焼きなまし法。 ドレミファソラシドという旋律とドの初期音からこのスケールを導くためにはひとつ前の和音も考慮すればいい(未実装)。

4声にしたときに、縦の響きについては流石に(台形の特徴量で)線形だとダメで(この特徴量だとG7の時は2度がOKみたいな状況からXORパターンがでてくると思われるから)、

(1)台形を一つふやす(4C3通り)
(2)カーネル法を使う

もっそり実験しようと思います。

3/23追記 1classSVM(と各種カーネル)でも4声は微妙。特徴量の次元が台形だけでも510次元,手持ちの課題を全部入力しても500和音程度にしかならないので(6000円の解答集を買えば3000和音くらいにはなる?)、実際の楽譜を使えるような方法に切り替えたほうがいいのだろうか。 転移音(和声外の音)や、4声(+旋律)→5声→3声みたいに特徴量の次元が不定で、そういうデータを上手く扱う方法はないのだろうか(ノンパラメトリックベイズとか、RNN?)。

kernelPCA(500→10〜200次元くらいまで落とす)→kmeans でも微妙。教師なし学習の検討はできないので、相変わらず生成して私の耳で検証(楽で良いのだが)。異常検知の本とか買うと良いのだろーか。。。 いや、多分和声の解答集を買う事ですね。。。。