Coder Social home page Coder Social logo

htmresearch's People

Contributors

ytakashina avatar

Watchers

 avatar  avatar

htmresearch's Issues

C#のusing周りの調査

staticメソッドを含むプロジェクトをリファレンスに加え、他のプロジェクトからusingしようとしても、うまく行ったり行かなかったりする。しかもその法則に全然規則性が感じられない。

Spatial Poolingをソフト割り当てに

ソフト割り当てという表現が適切か分かりませんが
c1からc5までへの帰属度がバイナリ値ではなく実数値として出るようにする

image

データの素性の分析

#42 でも書いたが、データの素性を調べたほうがよいかもしれない。
とりあえずHTMでの多変量の外れ値検知をやってみてから。

状態が確率的なときに遷移確率をどう計算するか考える

掲示板に投稿した質問を再掲。

分かりづらいかもしれないんですが、以下はHMMのモデルを図示したものです。
この図で、観測がデータ点、隠れ状態がクラスタだと考えてください。
生成確率Gはクラスタの割り当てを示す行列です。

default

ここで、生成確率Gと、すべての時刻を通じての各観測値は既知とします。
このような状況において、隠れ状態の遷移確率Tを求めることを考えたいです。

もしクラスタリングがハードクラスタリングだったら、
観測が与えられればそれに対応するクラスタが必ず一つ決まるので、
それを数え上げれば上位のノードの遷移確率を計算することができました。

しかし、クラスタリングがソフトクラスタリングだった場合、
隠れ状態の遷移確率はそのように単純には求まりません。

このような場合に、正しく隠れ状態の遷移確率を求める方法はあるでしょうか?

一応、Gの疑似逆行列を計算すれば、行列計算で求まるのかなと思ったのですが、行列のランクが見かけより低いときに不安が残ります。

欠損データへの対応

NaNがあるとクラスタリングもできないし離散化もできない。
Sampling時に対応すればよいと思われる。

K-medoids法の実装

いつかは必要だと思ってはいた。
「Level2以上でも離散化は必要か考える #53」で使うことになりそうなので、やる。

やることとやらないことを決める

HTMに関してどこまでやるのかを決める。

現在(3/14)のプログラム

  • ネットワーク構造はハードコーディング
  • Temporal Poolingはハード割り当て
  • Spatial Poolingはハード割り当て
  • メモされた入力にしか対応していない

オリジナルの論文

  • Temporal Poolingはハード割り当て
    • 上位のノードでメモする必要があるため、結局1-hotベクトルにする。
  • Spatial Poolingはソフト割り当て
    • 学習時はメモしているので1-hotだが、推論時にはソフトになる
  • 未知の入力にも対応している

静的・多変量の場合のパラメータ学習

とりあえずハードクラスタリングなら数え上げで行けるはずなのでそれをやる。
ファジークラスタリングでうまくいくかは微妙。
行列演算でうまくいくと思っていたがランクが行列の大きさより小さいときに問題が起こりそう。
要検討。

連続値の相互情報量の算出方法

時間的な予測の評価のために、予測値と実測値の相互情報量を出したりしていますが、今は離散値に丸めて相互情報量を出してしまっているので、連続な場合にも使える手法がないか調べたい。

下のサイトを見ると、連続値を離散化する方法と、何らかの分布を仮定する方法がある様子。
確かに正規分布を仮定したほうが、離散値に丸めるより数値のわずかなブレに柔軟に対応できるかもしれない。

http://d.hatena.ne.jp/m-a-o/touch/20130623/p1

欠損値の扱い

今はNaNという値として使ってしまっているが、「NaNであること」と「情報がないこと(他のどんな値でもありうる)」は違うのでそれを反映した実装にすべき。

IndexOfを使わない書き方にする

@herumi さんよりアドバイスいただいた内容に沿って書き換える。

C#的には
・double.NaN == double.NaNはfalseでdouble.NaN.Equals(double.NaN)はtrue
・listなどのIndexOfはEqualsを使って検索している
ことから、double[]にNaNが含まれているときにそれが見つかるのはOKだと思います。

ただ口頭でいいましたが、浮動小数点数の厳密比較をするのは避けた方がよいため、
if (fabs(a[i] - value) < 1e-6) { return i; }
のようなコードを作った方が安全だと思います。
欠損値もNaNではなく10^300のようなデータに含まれない十分大きな値としたほうがよいでしょう。
後者の理由はCPUによってはNaNを扱うととても遅くなることがあるため。

https://cybozulive.com/1_264054/gwBoard/view?bid=1%3A5080491&fid=28320366&focusOn=follow

閾値法の実装

#62 の一環
それぞれの系列について閾値法を適用し、k個以上の系列で異常があったら全体としても異常として扱う

DetectorForWTPのリファクタリング

現在、メソッドに分離できる処理は可能な限り分離してきたが、DetectorForWTPやHTMDetectorクラスだけは非常に複雑なクラスになってしまっている。
プロトタイピングのため仕方ないと思っていたが、デバッグしづらい。
解決できる手段がないか考える。

モデルベースなライブラリへの書き換え

kerasみたいにネットワークを楽にかけるようにしたい
このリポジトリは調査用と割り切ってad hocな書き方で通して、
使いやすさとかを考えるのはアルゴリズムが固まってから別のリポジトリを作ってやるべきかもしれない。

多変量のいい感じの可視化

より親切な可視化の方法は #32 同様別リポジトリでやるにしても、
結果を分析するのに多変量の可視化は必要。どうやるか。

multily-connectedな場合の確率伝播法の調査

閉路(loopback)がある場合はそもそもベイジアンネットワークではないが、無向化したときに閉路が生じるような場合(multiply-connected)には確率伝播法は厳密には適用できない(つまりpolytreeでないと無理)。と思っていたが、出来る可能性もあるので、きちんとリサーチすべき。
HTMの原論文(Georgeの博論)でやられているやり方を完全には理解できていないのできちんと吟味すべき。
自分なりの閉路の解消方法も考えているのでそれも試したい

Level2以上でも離散化は必要か考える

Level1の入力を32点まで離散化し、Temporal Pooling(遷移確率を類似度と見立てたクラスタリング)によって8つまでグループを減らしたとしても、Level2では6つノードの情報を統合するので、Level2への入力の場合の数は8^6通りとなり、空間が極めて広くなる。結果、遷移確率が以下のように極端にスパースなってしまった。

layer2_probabilities

場合の数を減らすために、Level2以上でも、ハミング距離などを使った離散化をすべき。

グラフィカルlassoの実装

およびWater Treatment Plantデータへの適用。
井手さんの本にも含まれている。
機械学習勉強会で発表したいかもです

系列同士を相互情報量でクラスタリング

#36 に書いただが、系列同士を相互情報量を基準としてAHCでクラスタリングすることで、HTMのネットワーク構造を決めるときのヒントを得られそう。
とくに凝集型階層的クラスタリングを使えばデンドログラムをそのままネットワークに使えそう。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.