INFINITY -数学とかプログラミングとか-

統計とプログラムを使って役に立たせたい

TeX用コマンド入力を支援するための辞書をご利用ください。
sanctuary's blogは,適当なことが書いてあります。

Gabor function

###########################
#Gabor function real part
gabor_r = function(x){
    exp(-alpha^2*(x-x0)^2)*(cos(2*Pi*beta*(x-x0)+gamma))
}
#Gabor function imaginary part
gabor_i = function(x){
    exp(-alpha^2*(x-x0)^2)*(sin(2*Pi*beta*(x-x0)+gamma))
}
###########################

alpha=1; #分散(波の幅)
beta=1; #空間周波数(波の数)
gamma=0.5; #振動の位相
x0=0
x <- seq(-3,3,length=500)
ylim_un=-1
ylim_up=1


plot(x,gabor_r(x),type="l",ylim=c(ylim_un,ylim_up))
par(new=T)
plot(x,gabor_i(x),type="l",lty = 2,ylim=c(ylim_un,ylim_up))

axis(2, pos = 0, at = -3:3, adj = 1, col = 2) # 赤で X 軸を描く

f:id:infinity_th4:20130611184155p:plain

###########################
alpha=1;
beta=2;
gamma=2.5;
x0=0
x <- seq(-3,3,length=500)
ylim_un=-1
ylim_up=1

plot(x,gabor_r(x),type="l",ylim=c(ylim_un,ylim_up))
par(new=T)
plot(x,gabor_i(x),type="l",lty = 2,ylim=c(ylim_un,ylim_up))

axis(2, pos = 0, at = -3:3, adj = 1, col = 2) # 赤で X 軸を描く

f:id:infinity_th4:20130611184152p:plain

高速で時間を表示するスクリプト

Auto.pl

#!/usr/bin/perl
use strict;
use warnings;

my @command = ('perl', 'testprint.pl');

while(1){
    my $ret = system @command;
    if ($ret != 0) {
        print "code[$ret]\n";
    }
    sleep(0.1);
}

testprint.pl

#!/usr/bin/perl

use strict;
use warnings;
use POSIX 'strftime';


my $time = strftime( "%Y-%m-%d %H:%M:%S" , localtime );
print "$time\n";

はてなブックマークよりタグを取得

#Userdata.pm
package Userdata;

use strict;
use warnings;
use XML::FeedPP;
use XML::Simple;
use Array::Uniq;

#http://b.hatena.ne.jp/'.$userid.'/atomfeed?tag='.$tag.'&of=0'; 特定のタグの数を取得
sub allnum {
    my @arry = @_;
    my $arrynum = @arry;
    my $userid = $arry[0];
    my $source;
    my $num;
    if ($arrynum == 2){
        my $tag = $arry[1];
        $source = 'http://b.hatena.ne.jp/'.$userid.'/atomfeed?tag='.$tag.'&of=0';
        my $feed = XML::FeedPP->new( $source );
        if($feed->title() =~ /\s\([0-9]+\)$/){
            my $str = "$&";
            if($str =~ /[0-9]+/){
                $num = $&;
            }
        }

    }else{
        $source = "http://b.hatena.ne.jp/".$userid."/rss";
        my $feed = XML::FeedPP->new( $source );
        
        $num = $feed->get('opensearch:totalResults');

    }
    return $num;
}

#最新のブックマークについたタグを10個取得
sub getmaintag {
    my (@user) = @_;
    my @tags = ("");
    my $allnum = allnum(@user);
    my $userid = $user[0];
    for (my $i=0;$i < $allnum;$i = $i+20){
        print $i,"\n";
        #tagを取得
        my $source = 'http://b.hatena.ne.jp/'.$userid.'/atomfeed?of='.$i;
        
        my $feed = XML::FeedPP->new( $source );
        foreach my $item ( $feed->get_item() ) {
            my @feedtags = $item->get("dc:subject");
            
            foreach my $tag (@feedtags){
                if(defined($tag)){
                    @tags = uniq sort {"\L$a" cmp "\L$b"} @tags; #重複削除
                    my $tagsnum = @tags;
                    my $cut = 0;
                    for (my $i = 0;$i<$tagsnum;$i++){
                        if(lc($tags[$i]) eq lc($tag)){
                            $i = $tagsnum;
                            $cut = 1;
                        }
                        
                    }
                        if (lc($tag) ne lc($tags[$#tags]) && $cut !=1){
                            push(@tags,$tag);
                        }
                }
                if($#tags >= 10){ #10個タグを取得したら,終わり
                    $i = $allnum;
                }
            }
            
        }
    }
    return @tags;
}

#ブックマークのタグをすべて取得
sub getalltag {
    my (@user) = @_;
    my @tags = ("");
    my $allnum = allnum(@user);
    my $userid = $user[0];
    for (my $i=0;$i < $allnum;$i = $i+20){
        print $i,"\n";
        #tagを取得
        my $source = 'http://b.hatena.ne.jp/'.$userid.'/atomfeed?of='.$i;
        
        my $feed = XML::FeedPP->new( $source );
        foreach my $item ( $feed->get_item() ) {
            my @feedtags = $item->get("dc:subject");
            
            foreach my $tag (@feedtags){
                if(defined($tag)){
                    @tags = uniq sort {"\L$a" cmp "\L$b"} @tags; #重複削除
                    my $tagsnum = @tags;
                    my $cut = 0;
                    for (my $i = 0;$i<$tagsnum;$i++){
                        if(lc($tags[$i]) eq lc($tag)){
                            $i = $tagsnum;
                            $cut = 1;
                        }
                        
                    }
                        if (lc($tag) ne lc($tags[$#tags]) && $cut !=1){
                            push(@tags,$tag);
                        }
                    
                }
            }
            
        }
    }
    return @tags;
}

1;

okok.

はてなブックマークの総ブックマーク数

http://b.hatena.ne.jp/infinity_th4/atomfeedには,総ブックマーク数が,ないようである.

http://b.hatena.ne.jp/infinity_th4/rssにあった.

以下のようにすれば取得できる.

#!/usr/bin/perl

use strict;
use warnings;
use XML::FeedPP;

sub allbookmarknum {
    my ($url) = @_;
    my $feed = XML::FeedPP->new( $url );
    return $feed->get("opensearch:totalResults");

}

my $url = "http://b.hatena.ne.jp/infinity_th4/rss";

allbookmarknum($url); #4680

tex 環境の設定+emacsで野鳥(やてふ)の設定+Mozcでime-tex辞書の導入

1. Tex環境

sudo apt-add-repository ppa:texlive-backports/ppa
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install texlive
sudo apt-get install texlive-lang-cjk

2. emacs で野鳥(やてふ)を使う。

cd .emacs.d
wget http://www.yatex.org/yatex1.77.tar.gz
tar zxvf yatex1.77.tar.gz
emacs init.el

.emacs.d/init.el

;; yatex1.77
(setq load-path (cons "~/.emacs.d/yatex1.77" load-path))
(autoload 'yatex-mode "yatex" "Yet Another LaTeX mode" t)

;; YaTeX-mode
(setq auto-mode-alist
      (cons (cons "\\.tex$" 'yatex-mode) auto-mode-alist))
(setq dvi2-command "xdvi"
      tex-command "platex"
      dviprint-command-format "dvips %s | lpr"
      YaTeX-kanji-code 3)

;; YaHtml-mode
(setq auto-mode-alist
      (cons (cons "\\.html$" 'yahtml-mode) auto-mode-alist))
(autoload 'yahtml-mode "yahtml" "Yet Another HTML mode" t)
(setq yahtml-www-browser "netscape")

;; http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?YaTeX#j78164d5
;;;   nil=YaTeX-kanji-code が nil なら coding-system に感知しない
;;;   0=no-converion -> Emacs内部で使用されている文字コード (Emacs23ではutf-8-emacs)
;;;   1=Shift JIS (Shift_JIS)
;;;   2=JIS (ISO-2022-JP)
;;;   3=EUC (EUC-JP)
;;;   4=UTF-8
(setq YaTeX-kanji-code 4)

を追加。

M-x byte-compile-file でコンパイルする。

emacs sample.texを開いた時に、emacs のモードのところに、以下のように「やてふ」と出れば、適用されています。

注意:
emacs -nw で開くときに,もし,システムが英語なら,

File mode specification error: (args-out-of-range "giveup!" 56639 56643)

と表示されて,yatexが起動しません.ご注意を.これにはまってしまいました.

-UUE:----F1  sample.tex     All L1     (やてふ Fill)
\documentclass{jarticle}
\begin{document}
Hello, World!
こんにちは世界。
$$a^2+b^2=c^2$$
\end{document}

と書いて、C-c C-t dでコンパイルできます。
また、C-c C-t pでプレビューできる。

コンパイルしたとしても、日本語が文字化けしている場合があります。

もし、あなたが、windowsで編集していたファイルが、SJISなどになっていたなら、utf8に変更しておきましょう。なぜなら、.emacs.d/init.elで(setq YaTeX-kanji-code 4)としましたから。

-j	JISコードに変換する
-e	EUCコードに変換する
-s	SJISコードに変換する
-w	UTF8コードに変換する
$ nkf -w  --overwrite  sample.tex #nkf -w sample.tex > sample_utf-8.txtでsample.texを残してsample_utf-8.txtに書き出せる。
$ nkf -g  sample.tex
UTF-8

(nkf がなかったらsudo apt-get install nkf で入れましょう)

emacs でC-c C-c dでコンパイルして確認しましょう。

また、以下の方法でも、コンパイルできます。

platex --kanji=utf8 sample.tex #compile
xdvi sample.dvi #preview
dvips -Ppdf sample.dvi #convert ps
ps2pdf sample.ps #convert pdf 

3. Mozcをインストールする。

sudo apt-get install ibus-mozc

終わったら、コンピュータを再起動し、Dashホームからibusと入力し、「インプット・キーボードメソッド」をクリックし、
インプットメソッド>日本語>Mozcを選択し、追加する。
Mozcを一番上にしましょう。

以下のように。
f:id:infinity_th4:20130511032700p:plain

4. IME-texの辞書の追加。

ime-texの辞書とは、id:infinity_th4texの入力を支援するために作った辞書です。
約450程度の単語が登録されており、Mozcを使っているときに、例えば「しき」と入力すれば、「$ $」が候補に上がります。「あるふぁ」は「\alpha」や「わ」は「\sum_{}^{}」や「\sum_{i=1}^{n}」や「へんびぶん」は「\partial」,「ぃm」は「\lim_{\rightarrow } 」や「\lim_{n\rightarrow \infty} 」などが登録されています。
詳しくは、辞書の中身をご覧ください。
以下が、例。
f:id:infinity_th4:20130511042713p:plain
または、
ime-tex-v1.5.xls
でご確認ください。

それでは、辞書を設定しましょう。

ime-tex-v1.5.txt
が辞書です。ダウンロードしてください。

f:id:infinity_th4:20130511033832p:plain
ユーザー辞書>ユーザ辞書の編集

Mozc辞書ツールが開いたら、管理>新規辞書にインポートから、辞書をダウンロードした辞書を選択し、以下のように、設定しインポートしましょう。

f:id:infinity_th4:20130511034444p:plain

これで、Mozc使用時に、texの支援のための単語が登録されました。

お疲れ様でした。

参考:
Linux - Ubuntu 12.04でLaTeX環境を構築する - Qiita [キータ]YaTeXのインストールの仕方Yet Another LaTeX mode for Emacs.ÌîÄ»¡ÊYaTeX¡Ë [ʪÍý¤Î¤«¤®¤·¤Ã¤Ý]文字コード変換コマンドnkfの使い方まとめ LinuxYaTeX - TeX Wiki

リモートデスクトップ

ubuntu からubuntu

どちらも12.04のとき。

接続される側でDashホームで、「デスクトップの共有」を起動する。
(ウィンドウがMac的な感じだが)
f:id:infinity_th4:20130502174330p:plain

というように設定しておく。

vncserverを入れておく
接続される側のアドレスをifconfigで調べておく。
inetアドレスと書いてあるところ。
(vmnetとかは多分違う)

$ vncviewer

として
f:id:infinity_th4:20130502175220p:plain

のVNCServerの部分にサーバ側のアドレスを入れる。

パスワードは、デスクトップの共有で指定したパスワード。

これで、サーバ側で許可すれば、画面に現れる。


MacからUbuntu

Macのシステム環境設定>共有>画面共有にチェックを入れる。

Finderの左のメニューの共有から、接続したいPCを選択し、画面を共有をクリックし、
Ubuntuのデスクトップの共有で設定したパスワードを入力し、接続すればリモートデスクトップが起動する。

Ubuntu でログイン出来なくなったときの解決法

今日というか昨日の夜、院生室で作業をしようと思って、いつも通りUbuntuを起動しようと思ったが、パスワードを入力したら、一瞬(肉眼では確認できないくらい)、文字列

ナンチャラカンチャラ〜
......
checking battery state ...

が表示されて、ログイン画面に戻ってしまった。何度やっても同じだった。


解決方法として、ログイン画面で、Ctrl+Alt+F1を押して、CUI上で

username login $ 

ユーザ名を入れてログインする。

/home/username/にある.Xauthorityを

$ sudo rm .Xauthority

で削除して、

$ sudo shutdown -r now

で再起動する。

GUIのログイン画面で、パスワードを入れれば、ログインできた。

なんてことはなかったですね。

独立成分分析について

詳解 独立成分分析―信号解析の新しい世界

詳解 独立成分分析―信号解析の新しい世界

入門 独立成分分析

入門 独立成分分析

特にFastICAについて。FastICAは、独立成分分析の中のアルゴリズムでは最も優れている(らしい)。収束性や誤差の意味で。確かに勾配法だと、洒落にならないくらい計算時間がかかるし、かなりの誤差が多々ある。

混合されているデータの分類または復元です。

例えば、音声はだいたい以下のの画像の上部の2つのような分布になります。
今はシュミレーションのため、優ガウス分布ラプラス分布を上部に、下部に一様分布を書きました。(源信号とする)

f:id:infinity_th4:20130419213622p:plain

これら4つの信号を混合したデータから、源信号を復元したいと思います。
つまり、源信号(人の話し声)が、混ざり合った状態からそれぞれの声に分類するということになります。

モデルは、
f:id:infinity_th4:20130419214704j:plain
になります。
(p:次元数,n:標本数)
Xが観測データだと考えることになります。

Xの情報から、未知のAとSを見つける必要があります。

Xは、Sの混合なので、元の非ガウス分布よりもガウス分布に近づいています。(中心極限定理より)

f:id:infinity_th4:20130419220456p:plain

独立成分分析は、ガウス分布をより非ガウス分布に近づけることで、源信号の復元を可能にしています。
その際、非ガウス性の尺度として、尖度やネゲントロピーを用います。ちなみに、尖度は外れ値に関して頑健でないので、ネゲントロピーを使いましょう。

また、前処理として白色化(無相関化)をすることで、より独立な状態に近づけています。
f:id:infinity_th4:20130419220636p:plain

白色化については、以下参照。
白色化 - 機械学習の「朱鷺の杜Wiki」

実際、以下のコードによって復元したデータのヒストグラムを書いてみると、以下のようになります。
f:id:infinity_th4:20130419220814p:plain

すばらしいですね。

実際の音声データでは、時間相関がある場合があり、その点を考慮しなければなりません。


mathematicaで書いていたが、データセットの扱いで問題があったので、新たにRで書きなおしました。

スター下さい。

参考:Cocktail party demo


#複数の独立成分を推定するfastICA

library(splus2R);
library(VGAM);

source("signaldata.R");
source("fastICA_func.R");


n=10000 #標本数
p=4 #独立成分の数
S1<-signaldata("laplace",2,n) #row:2,col:n
S2<-signaldata("unif",2,n) #row:2,col:n
S<-rbind(S1,S2) #row:4,col:n

plot(S[1,],type="l")
hist(S[1,],breaks="Scott",freq = FALSE)
lines(density(S[1,]), col = "orange", lwd = 2)
rug(S[1,])

#混合行列の作成
A<-matrix(runif(p^2,-sqrt(3),sqrt(3)),p)
A<-t(A)
dim(A)

#観測データXの作成
X=A%*%S #p,n
dim(X)
X<-X-apply(t(X),2,mean) #
plot(X[1,],type="l")
hist(X[1,],breaks="Scott",freq = FALSE)
lines(density(X[1,]), col = "orange", lwd = 2)
rug(X[1,])

X<-t(X)



###################

m=4 #独立成分の数

result<-fastICAmult(X,m)
V<-result$V
dim(V)

W<-result$W
W

Z<-result$Z

t(W)%*%V%*%A #順序行列になれば成功


restoredsignal<-result$restoredsignal

par(mfrow=c(2,2))
for(i in 1:4){
    hist(restoredsignal[i,],breaks="Scott",freq = FALSE)
    lines(density(restoredsignal[i,]), col = "orange", lwd = 2)
    rug(restoredsignal[i,])
}

signaldata.R

library(VGAM);
signaldata <-function(func,p,n){
    S<-matrix(0,p,n); #n*p
    i=1;
    while(i<=p){
        if(func == "unif"){
            u<-runif(n,-sqrt(3),sqrt(3));
        }else if(func == "laplace"){
            u<-rlaplace(n, location=0, scale=1);
        }else if(func == "norm"){
            u<-rnorm(n);
        }
        S[i,]<-u;
        i<-i+1;
    }
    return(S);
}


fastICA_func.R

fastICAmult<-function(X,m,W=signaldata("unif",m,m),maxcnt=10000,epsilon=0.0001){
    if(dim(X)[2]>dim(X)[1]){ #行:signal,列:標本
        X<-t(X);
    }
    
    V<-svd(var(X))$u%*%diag(1/sqrt(svd(var(X))$d))%*%t(svd(var(X))$u);
    Z<-V%*%t(X); #whitening
    #Z=V%*%X #ok
    #W <- matrix(scan("W_init01.txt"), nrow=m) #ok
    W<-t(W)
    #ノルム1にする
    for(i in 1:m){
        W[,i]<-W[,i]/vecnorm(W[,i])
    }
    i=1;
    while(i<=m){
        cat("Independent Component:",i,"\n");
        cnt=0;
        while(cnt<maxcnt){
            #cat("cnt:",cnt,"\n")
            #5.
            wbefore<-W[,i]
            W[,i]<-apply(t(t(Z)*tanh(t(W[,i])%*%Z)[1,]),1,mean)-mean(1-(tanh(t(W[,i])%*%Z)[1,])^2)*W[,i];
            #6.グラムシュミットの直交化
            if(2<=i){
                Sum=0;
                for(j in 1:(i-1)){
                    Sum<-Sum+(t(W[,i])%*%W[,j])*W[,j];
                }
                W[,i]<-W[,i]-Sum; #2<=i
            }
            #7.収束したか?
            W[,i]<-W[,i]/vecnorm(W[,i]);
            #cat("W[,i]:",W[,i],"\n\n")            
            if(1-epsilon<=abs(t(wbefore)%*%W[,i]) && abs(t(wbefore)%*%W[,i])<=1+epsilon){
                cat("cnt:",cnt,"\n");
                cat("W[,i]:",W[,i],"\n\n");
                i<-i+1;
                cnt=maxcnt;
            }
            cnt=cnt+1;
        }
    }
    
    return(list(V=V,W=W,Z=Z,restoredsignal=as.matrix(t(W)%*%Z[,1:n])))
}

髪切りたい

おはようございます。

引越しをして以来、ダンボールに何が入っているのか分からないので、バリカンがどこにあるのかわからない。

この前は、冷凍のポテトが食べたくなったのでフライパンを探したのだが、いくら探してもフライパンが見つからなかったので、新たに買った。
しかし、後日、フライパンが見つかったので、無駄になった。

Reminder Beta版を開始しました。

f:id:infinity_th4:20130404145212p:plain
Reminderは、(http://reminder.asia)
ブックマークをしておいても、結局読まないという問題を解決するために作られたサービスです。

はてなブックマークで「あとで読む」タグをつけたブックマークが溜まっていませんか?
そんな、あなたにReminderはブックマークを読む最適なツールとなるでしょう!
あなたの好きな時間に、ブックマークをお知らせします。

今後、メモを保存しておくと、好きな時間にお知らせするサービスを提供する予定です。

バグや改善点がまだありますが、宜しくお願いいたします。

フィードバック等は、reminder.asia@gmail.comへお願いします。
もしくは、このブログのコメント欄にお書きください。

$useridのブックマークのタグを取得。

#!/usr/bin/perl

use strict;
use warnings;
use HatenaBookmark::Number; #my director
use XML::FeedPP;
use Data::Dumper;
use Array::Uniq;

my $userid = "infinity_th4";
my @user = ($userid);

sub gettag {
    my (@user) = @_;
    my @tags = ();
    my $allnum = HatenaBookmark::Number::allnum(@user); #ユーザーのすべてのブックマーク数
    for (my $i=0;$i < $allnum;$i = $i+20){
        #tagを取得 #?
        my $source = 'http://b.hatena.ne.jp/'.$userid.'/atomfeed?of='.$i;
        
        my $feed = XML::FeedPP->new( $source );
        foreach my $item ( $feed->get_item() ) {
            my @feedtags = $item->get("dc:subject");
            
            foreach my $tag (@feedtags){
                if(defined($tag)){
                    push(@tags,$tag);
                    
                }
            }
            @tags = uniq sort {"\L$a" cmp "\L$b"} @tags; #重複削除
        }
    }
    return @tags;
}

#Get tag of $userid.
print Dumper gettag(@user);

これでは、http://b.hatena.ne.jp/infinity_th4/にあるタグの数に一致しない。
なぜなら、atomfeedでは、の部分で、小文字と大文字を区別しているからだ。
例えば、Mysqlmysqlを区別している。
しかし、http://b.hatena.ne.jp/infinity_th4/では、Mysqlmysqlを同一視している。

lc()をつかって同一視をなくす。

それでも僕は、花粉症だと信じていなかった

僕は、1年前、花粉症(杉)だと診断されたが、それを信じていなかった。

なぜなら、ほぼ高校3年から365日鼻水が止まらない。

1日何度か波のようなものがあり、鼻がつーんをすると、それが合図。

鼻炎だと思う。


そして最近になって目がとてもかゆくなった(ここ3日くらい前)。

今まではこんなことはなかったので、やはり花粉症だと思う。

鼻炎と花粉症の合わせ技かな?

screen

screen を使って、sshを切っても処理を実行させたいので、

$ screen
$ script/myapp_server.pl -r

という感じにする。

僕の場合は、script/myapp_server.pl以外に別の.plを走らせる必要があるので、

新しくCtrl+Shift+tとして、ssh接続し、

$ screen
$ sample.pl

などとする。

まだよくわかってないが、

script/myapp_server.plを走らせたくなくなったら、どうするか?

複数走らせていて$screen -r ってすると以下のように出る。

$ screen -r
There are several suitable screens on:
	41412.pts-0.dti-vps-srv81	(2013年02月28日 07時33分57秒)	(Detached)
	42312.pts-3.dti-vps-srv81	(2013年02月28日 07時21分36秒)	(Detached)
	11432.pts-7.dti-vps-srv81	(2013年02月28日 07時20分56秒)	(Attached)
	58233.pts-0.dti-vps-srv81	(2013年02月28日 07時14分54秒)	(Attached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.

てな感じででてくるので、Detachedのやつの例えば、

$ screen -r 41412.pts-0.dti-vps-srv81

ってやるとさっき走らせたやつが開ける。