2013年10月6日日曜日

上限・下限制限つき最小二乗を実装した



最小二乗といってもy=ax+bに近似するタイプではないです。


ベクトルA1,A2,A3・・・を適当な比率x1,x2,x3,・・・で足し合わせて、入力されたベクトルBを近似しようというものです。



B≒x1*A1 + x2*A2 +x3*A3



このときにx1~x3が取り得る範囲をそれぞれ制限してあげようというのがこのアルゴリズムです。





論文とかあたってると、飛行機だとか自動車の制御等で、ラダーや各タイヤの出力を制限範囲内で最適に配分するってのに使われてるらしいんですが・・・・制御系の人間じゃないので、興味わかず。


純粋に音声などの信号の解析に使えるかな~と思って作りました。


音声はMFCC等の20次元ぐらいのベクトルで表す事ができて、それが時系列で変化していきます。でコレが「あ」とか判断するのが普通なんですが、「あ」と「い」の中間って普通に考えるとあるわけじゃないですか。だから、「あ」20%+「い」80%とかも有り得るのかなと。


これで制限なしの最小二乗で解いちゃうと「あ」1000%+「い」-9900%とかとんちんかんな事言い出したりするんですね。これだけなら非負という制限かければいいんですが、前後の関係から「あ」は20±20%、「い」は80±20%ぐらいだな~ってあたりが付いてることもあるんですね。そんなときに上限・下限制限つきの最小二乗が必要になっちゃうんです。


ちなみにMatlabには搭載されてるらしいです。C++の実装がみつかんなかったので、実装してみました。





このアルゴリズムは以下の論文の内容を実装したものです。


http://www.nt.ntnu.no/users/skoge/prost/proceedings/acc08/data/papers/0854.pdf


ソースはこちら。(行列ライブラリとして「Eigen」使ってます、別途DLしてください。)


https://drive.google.com/folderview?id=0B2MvWvAFndBdNG9YY0tOenRZejQ&usp=sharing





1 件のコメント:

  1. 実装にバグがありました。修正したら治ったんですが、公開は後ほど

    返信削除