Hatena::ブログ(Diary)

My Life as a Mock Quant このページをアンテナに追加 RSSフィード Twitter

2017-02-17

scikit-learnで非負値行列因子分解(NMF)

| 17:33 | scikit-learnで非負値行列因子分解(NMF) を含むブックマーク

- http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.NMF.html

を見たりググった日本語での検索結果でも何がどうなってるのかよくわからんので、ちゃんと試したメモ。

非負値行列因子分解自体は要するに、ある行列MをM≒WHと近似した時に、その近似後の行列W、Hの要素が全部正になるようにしてるってだけ。

これをPythonでやるにはこうする。

分解後の行列を取得するインターフェイスが揃ってないのが謎だ…

import numpy as np
from sklearn.decomposition import NMF
# 適当なサンプル行列
X = np.array([[1,2,3], [4,5,6],[7,8,9], [10,11,12]])
# NMFの実行&W・Hの取得
model = NMF(n_components=2, init='random', random_state=0)
W = model.fit_transform(X);
H = model.components_;

分解後&M再構成後の結果表示(Rodeo)

だいたい元の行列Mを再現できてる。

>>> W
array([[ 0.        ,  0.62704037],
       [ 0.97579534,  0.86418623],
       [ 2.16991747,  0.97041386],
       [ 3.37527535,  1.06990405]])
>>> H
array([[ 2.3891489 ,  2.23274522,  2.07634154],
       [ 1.8294132 ,  3.24200677,  4.65460034]])
>>> np.dot(W, H)
array([[  1.14711593,   2.03286912,   2.91862231],
       [  3.91227405,   4.98039998,   6.04852592],
       [  6.95954385,   7.99096116,   9.02237846],
       [ 10.02133195,  11.00476605,  11.98820016]])

2017-02-01

Jupyter Notebookにloggingの結果を表示させたい

| 11:54 | Jupyter Notebookにloggingの結果を表示させたいを含むブックマーク

色々とStack overflow漁って調べた結果、とりあえずこれで動いた。

import sys
import logging
logger = logging.getLogger()
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.INFO)
logger.addHandler(handler)
logger.setLevel(logging.INFO)

あとは

logger.info("yahoo!!!")

とか書く。

2017-01-15

確率変数を変数変換した場合の確率分布

| 15:57 | 確率変数を変数変換した場合の確率分布を含むブックマーク

昔やった気もするが、すぐ忘れる&頭の体操もかねてもう一度

算数

適当な確率分布に従う確率変数x(面倒なので[0, 1]区間の一様分布想定)とそれを2乗した変数yを考える。

このときyの従う確率分布は

 1 = ¥int_0^1 p(x) dx = ¥int_0^1 1 dx = ¥int_0^1 1/(2*¥sqrt{y}) dy

より

 p(y) = 1/(2¥sqrt{y})

となる。

Rでやる

0, 1区間の一様な乱数x, 及びそれを二乗したyを生成。

x <- runif(10^5, 0, 1)
y <- x^2

yのヒストグラムが↑の計算と合うかチェック

hist(y, probability=TRUE)
t <- seq(0, 1, by=0.01)
lines(t, 1/(2*sqrt(t)),col="red", lwd=3)

f:id:teramonagi:20170115155454p:image

2016-12-21

Jupyterで表示されるpd.DataFrameをテーブルっぽく表示させる

| 16:44 | Jupyterで表示されるpd.DataFrameをテーブルっぽく表示させるを含むブックマーク

Jupyterの最期の評価値(pd.DataFrame)と同じように表を出力させたい時。

適当なpd.DataFrameをdfとして

from IPython.display import display, HTML
display(HTML(df.to_html()))

こう。

(追記)

・・・と思ったら

display(df)

で良いみたい。

drillerdriller 2016/12/21 18:46 df.styleというのもありまが、to_htmlのほうが色々加工できるので汎用性高いかもしれませんね
http://pandas.pydata.org/pandas-docs/stable/style.html

teramonagiteramonagi 2016/12/26 14:50 ARIGATASHI!!!

2016-12-04

文字を整数に(string to int)

| 22:49 | 文字を整数に(string to int)を含むブックマーク

ちょいとめんどいので、関数に。

package main
import (
    "fmt"
    "strconv"
)

func atoi(s string) int{
    val, _ := strconv.Atoi(s)
    return val
}
func main(){
    x := atoi("2131")
    fmt.Println(x)
}

標準入力からの値をとる

| 22:26 | 標準入力からの値をとるを含むブックマーク

区切りとかは必要に応じて変更

package main
import (
    "fmt"
    "strings"
    "bufio"
    "os"
)

func main(){
    s := bufio.NewScanner(os.Stdin)
    for s.Scan() {
        for index, element := range strings.Split(s.Text(), " ") {            
            fmt.Println(index)
            fmt.Println(element)
        }
    }
}

fmt.Scanはスペース区切りでとるっぽい

package main
import (
    "fmt"
)

func main(){
    var a, b int
    fmt.Scan(&a)
    fmt.Scan(&b)
}