suzuzusu日記

(´・ω・`)

混合ガウス過程で多峰な関数を回帰する

忘備録として

混合ガウス過程と多峰な関数

以下のような多峰な関数を回帰する場合は,通常の単峰にフィッティングする回帰では困難なので混合ガウス過程を用いる.

f:id:suzuzusu:20190927182219p:plain
f1,f2関数

f:id:suzuzusu:20190927194603p:plain
多峰な関数

GPclust

GPclust という混合ガウス過程のライブラリが良さそうなので今回はこれを使用する.

以下コード

gist.github.com

結果

f:id:suzuzusu:20190927194641p:plain

結果の図から多峰な関数を回帰できていることが分かる.

参考

SSH in Elixir

ElixirでSSHをする方法を忘備録として書いておく.

iexして以下を実行する

iex(1)> ip = '1.2.3.4'
'1.2.3.4'
iex(2)> port = 22
22
iex(3)> ssh_config = [
...(3)>   user: 'user',
...(3)>   password: 'password1234',
...(3)>   silently_accept_hosts: true
...(3)> ]
[user: 'user', password: 'password1234', silently_accept_hosts: true]
iex(4)> :ssh.start
:ok
iex(5)> :ssh.shell(ip, port, ssh_config)
remote > # login

command実行の場合

iex(1)> ip = '1.2.3.4'
'1.2.3.4'
iex(2)> port = 22
22
iex(3)> ssh_config = [
...(3)>   user: 'user',
...(3)>   password: 'password1234',
...(3)>   silently_accept_hosts: true
...(3)> ]
[user: 'user', password: 'password1234', silently_accept_hosts: true]
iex(4)> :ssh.start
:ok
iex(5)> {:ok, con_ref} = :ssh.connect(ip, port, ssh_config)
{:ok, #PID<0.128.0>}
iex(6)> {ok, ch_id} =  :ssh_connection.session_channel(con_ref, :infinity)
{:ok, 0}
iex(7)> :ssh_connection.exec(con_ref, ch_id, "date", :infinity)
:success
iex(8)> flush
{:ssh_cm, #PID<0.128.0>,
 {:data, 0, 0, "2019年  9月  6日 金曜日 12:36:26 JST\n"}}
{:ssh_cm, #PID<0.128.0>, {:eof, 0}}
{:ssh_cm, #PID<0.128.0>, {:exit_status, 0, 0}}
{:ssh_cm, #PID<0.128.0>, {:closed, 0}}
:ok

参考

www1.erlang.org

Distributed Elixir

Elixirで分散ノードで処理をする方法を忘備録として書いておく.

環境

  • node01
    • 192.168.0.2
  • node02
    • 192.168.0.3

方法

node01で以下のプロセスを立ち上げる

iex --name node01@192.168.0.2 --cookie hoge

node02で以下のプロセスを立ち上げる

iex --name node02@192.168.0.3 --cookie hoge

node01のプロセスから以下を実行して接続する

iex(node02@192.168.0.2)1> Node.connect :"node02@192.168.0.3"
true
iex(node02@192.168.0.2)2> Node.list
[:"node02@192.168.0.3"]

別ノードで実行する方法

iex(node02@192.168.0.2)3> Node.spawn :"node02@192.168.0.3", fn -> IO.inspect Node.self end
:"node02@192.168.0.3"
#PID<11251.119.0>

参考

Windowsでmultiprocessingにおける「if __name__ == "__main__":」制限を回避してPandasで複数ファイルを並列で読み込む

忘備録として書く

題名長すぎる...

以下のようにWindowsの場合main guardを書かないとmultiprocessingが動かない stackoverflow.com

何とか回避してPandasを使って複数プロセスでファイルを読み込んでみる.具体的には以下のように別のpythonのプロセスを動かして,pickle経由でデータを受け取る

# -*- coding: utf-8 -*-
import pickle
import subprocess
import pandas as pd
from sklearn import datasets

mp = \
'''# -*- coding: utf-8 -*-
from multiprocessing import Pool
import pandas as pd
import sys
import pickle

def read_(f, header):
    return pd.read_csv(f, header=header)

def read(x):
    return read_(x[0], x[1])

def read_csv(fs):
    with Pool() as p:
        return p.map(read, fs)

if __name__ == "__main__":
    f = sys.argv[1]
    n1 = int(sys.argv[2])
    n2 = int(sys.argv[3])
    header = int(sys.argv[4])
    fs = []
    for i in range(n1, n2):
        fs.append((f.replace('{}', str(i)), header))
    dfs = read_csv(fs)
    binary = pickle.dumps(dfs)
    sys.stdout.buffer.write(binary)
'''

with open('mp.py', mode='w') as f:
    f.write(mp)

def read_csv(f_name, start=0, end=30, header=0):
    s_str = str(start)
    e_str = str(end)
    h_str = str(header)
    result = subprocess.run(['python', 'mp.py', f_name, s_str, e_str, h_str], stdout=subprocess.PIPE)
    return pickle.loads(result.stdout)


iris = datasets.load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
for i in range(30):
    df.to_csv('data'+str(i)+'.csv')

dfs = read_csv('data{}.csv', 0, 30)
print('len:', len(dfs))
print('===============================================')
print('head:')
print(dfs[0].head())
print('===============================================')
print('info:')
dfs[0].info()

出力

len: 30
===============================================
head:
   Unnamed: 0  sepal length (cm)  sepal width (cm)  petal length (cm)  \
0           0                5.1               3.5                1.4   
1           1                4.9               3.0                1.4   
2           2                4.7               3.2                1.3   
3           3                4.6               3.1                1.5   
4           4                5.0               3.6                1.4   

   petal width (cm)  
0               0.2  
1               0.2  
2               0.2  
3               0.2  
4               0.2  
===============================================
info:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
Unnamed: 0           150 non-null int64
sepal length (cm)    150 non-null float64
sepal width (cm)     150 non-null float64
petal length (cm)    150 non-null float64
petal width (cm)     150 non-null float64
dtypes: float64(4), int64(1)
memory usage: 5.9 KB

これをモジュール化してやれば良さそう

でもこんな事するくらいなら素直にmain guard書いた方がいい説...

ffmpeg filterの作り方

そろそろブログまとめようと思ったので移転記事です.

移転元 https://wiki.mma.club.uec.ac.jp/su_zu/ffmpeg%20filter%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9

MMA Advent Calendar 2016/12/21

これはMMA Advent Calendar 2016の21日目の記事です

ffmpeg filterとは

https://trac.ffmpeg.org/wiki/FancyFilteringExamples

標準でffmpegにはマンデルブロ集合とかライフゲームなどの面白いfilter機能がついています。今回はそのfilterの作り方を説明します。Libavfilterから直接作ることもできるのですが今回はFrei0rで作る方法を記述します。実際の動画編集はノンリニア編集するほうが便利ですが生配信などにはもしかして自作フィルターが使えるかもしれません(?)

Frei0r

Frei0rというのはクロスプラットフォームのvideo effect pluginです。最近の新しいffmpegはfrei0rに対応しています。ffmpeg -versionして--enable-frei0rと表示されていれば対応しています。

#include "frei0r.hpp"
#include "frei0r_math.h"
#include <stdlib.h>

// frei0r::filterを継承して作っていきます
class Mat33 : public frei0r::filter
{
public:
  Mat33(unsigned int width, unsigned int height)
  {
    // register_paramで引数を登録することができます
    register_param(m11, "m11", "matrix element m11");
    register_param(m12, "m12", "matrix element m12");
    register_param(m13, "m13", "matrix element m13");
    register_param(m21, "m21", "matrix element m21");
    register_param(m22, "m22", "matrix element m22");
    register_param(m23, "m23", "matrix element m23");
    register_param(m31, "m31", "matrix element m31");
    register_param(m32, "m32", "matrix element m32");
    register_param(m33, "m33", "matrix element m33");
  }

  // updateで一フレームごとの処理を書いていきます
  // inに編集前ピクセルデータがあり、outに編集後のピクセルデータを入れます
  virtual void update(double time,
                      uint32_t* out,
                      const uint32_t* in)
  {
    std::copy(in, in + width*height, out);
    for (unsigned int y=1; y<height-1; y++){
      for (unsigned int x=1; x<width-1; x++){
        unsigned char *p1 = (unsigned char *)&in[(y-1)*width+(x-1)];
        unsigned char *p2 = (unsigned char *)&in[(y-1)*width+x];
        unsigned char *p3 = (unsigned char *)&in[(y-1)*width+(x+1)];
        unsigned char *p4 = (unsigned char *)&in[y*width+(x-1)];
        unsigned char *p5 = (unsigned char *)&in[y*width+x];
        unsigned char *p6 = (unsigned char *)&in[y*width+(x+1)];
        unsigned char *p7 = (unsigned char *)&in[(y+1)*width+(x-1)];
        unsigned char *p8 = (unsigned char *)&in[(y+1)*width+x];
        unsigned char *p9 = (unsigned char *)&in[(y+1)*width+(x+1)];

        unsigned char *o = (unsigned char *)&out[y*width+x];
        for (int i=0; i<3; ++i){
          o[i] = CLAMP0255(abs(p1[i]*m11 + p2[i]*m12 + p3[i]*m13 + p4[i]*m21 + p5[i]*m22 + p6[i]*m23 + p7[i]*m31 + p8[i]*m32 + p9[i]*m33));
        }
        o[3] = ((unsigned char*)&in[y*width+x])[3];
      }
    }
  }
private:
  f0r_param_double m11;
  f0r_param_double m12;
  f0r_param_double m13;
  f0r_param_double m21;
  f0r_param_double m22;
  f0r_param_double m23;
  f0r_param_double m31;
  f0r_param_double m32;
  f0r_param_double m33;
};

// filterの登録処理です
frei0r::construct<Mat33> plugin("Mat33",
                                "3*3 Matrix filter",
                                "su_zu",
                                0,1,
                                F0R_COLOR_MODEL_RGBA8888);

上の例は3×3行列のフィルター処理を行えるフィルターを書いてみました。なんかフィルターフィルター言っててわかりづらい。。。

How to Use

# buildしたfilter DLLのmat33.dllをC:\Program Files (x86)\frei0r\lib\frei0r-1に置いたとしましょう

#FREI0R_PATH環境変数を設定
$ export FREI0R_PATH="C:\Program Files (x86)\frei0r\lib\frei0r-1"
$ ffmpeg -i INPUT.mp4 -vf "frei0r=hogefugafilter" OUTPUT.mp4

ちなみにdllは https://dl.dropbox.com/s/10izo6dycp8as7b/mat33.dll に置いておきました。信用できない人はソースはgithubに上げたので自分でビルドしてみてください。 https://github.com/suzusuzu/frei0r/blob/mat33/src/filter/mat33/mat33.cpp

sobel filter

sobel filterとは空間1次微分を計算してedgeを抽出するfilterです。

上から下へのsobel filter 上から下へのsobel filter

左から右へのsobel filter 左から右へのsobel filter

ちなみにfilterは","で処理を繋げることができる。今回はsobelフィルターをかけるまえにグレースケールを行う

元動画 http://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_surround-fix.avi

$ ffmpeg -t 30 -i http://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_surround-fix.avi -vf "format=gray,frei0r=mat33:1|2|1|0|0|0|-1|-2|-1" -pix_fmt yuv420p sobel.mp4

}}}

平滑化 filter

平均化 filterとも言います。

名前の通り平らに滑らかにするfilterです。

$ ffmpeg -t 30 -i http://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_surround-fix.avi -vf "frei0r=mat33:0.111|0.111|0.111|0.111|0.111|0.111|0.111|0.111|0.111" -pix_fmt yuv420p ave.mp4

}}}

MMA Advent Calendar 2016/12/13

そろそろブログまとめようと思ったので移転記事です.

移転元 https://wiki.mma.club.uec.ac.jp/su_zu/MMA%20AdventCalendar%202016

MMA Advent Calendar 2016/12/13

これはMMA Advent Calendar 2016の13日目の記事です

電気通信大学RSS「新着情報」

https://www.uec.ac.jp/index.rss

電気通信大学が学会での受賞や電気通信大学内で行うイベントなどその他もろもろの情報を発信しているRSSです。

私達電気通信大学生はもちろんこのRSSをチェックしたいですよね?でもブラウザの環境がない!!GUI環境が手元にない!!そんな時でも簡易的でもいいから電気通信大学RSSがみたいよおおおという需要に応える形でさくっと適当にそれなりに使えそうなものをOne-Linerで作ってみました。

ちなみにこのRSSのlinkタグの中身が "http://www.uec.ac.jp/news/announcement/hogefuga" だったり "/news/announcement/hogefuga" だったり統一されていないのに途中で気づいてOne-Linerを修正しました。

One-Liner

依存しているもの peco, xmllint, curl

pecoはRSS一覧から見たい記事を選択するインターフェイスとして使用します。xmllintはその名の通りxmlパーサーです。この2つをインストールしてください。

上の依存を見てなんだPOSIX互換じゃないのかよとかいう疑問を持ったと思いますが聞こえないふりをします。 ちなみにOne-Linerの定義とシェル芸の定義というものを以下のようであるとするならば間違いなく下記に記述するものはOne-Linerでありシェル芸です!!POSIX互換は関係ないのです!!そもそも通信系はcurlwgetかのPOSIX外コマンドに頼るしかない状況だからPOSIX原理主義者に何言われても動じない心を持っています。たまにcurlsendmailは例外だからという言葉を見るとなるほどなと思い、それなら「例外」という必殺技を僕も使いたいと思います。

仕様としてはRSS記事一覧から見たい記事を選択するとその記事のpタグを抜き出しているだけです。pタグだけ?ちゃんと整形して出力しろよという声が聞こえてくると思いますが聞こえないふりをします。少し言い訳をすると記事のフォーマットが一定ではないのでめんどくさいのと大体pタグさえ見れば記事の内容わかるだろうと雑に考えたからです。

curl  $(xmllint --xpath "//rss/channel/item[$(echo 'cat rss/channel/item/title' | xmllint --shell http://www.uec.ac.jp/index.rss | sed -n '/title/p' | sed -e 's/<title>\(.*\)<\/title>/\1/' | awk '{print NR, $0}' | peco | sed 's/^\([0-9]*\).*/\1/')]/link"  http://www.uec.ac.jp/index.rss | sed 's/<link>\(.*\)<\/link>/\1/' | awk '{if($1 ~ /http/) print; else print "http://www.uec.ac.jp" $1}') 2>/dev/null | xmllint --html --xpath '//p' 2>/dev/null - | sed 's/\(.*\)/\1\n/'

例:【報告】第4回電気通信大学Unique & Exciting Research Symposium ~研究力強化に向けた組織的な連携の在り方~

出力されたものは以下のようになります

<p><a id="pageTop"></a>このページの先頭です</p><p><a href="#contentTop">メニューを飛ばして本文を読む</a></p><p id="siteTtl"><a href="/"><img src="/common_rwd/images/pct_site-logo_pc.png" width="233" height="40" alt="国立大学法人 電気通信大学" class="switch"></a></p><p><a id="contentTop"></a>ここから本文です</p><p class="print">印刷機能を使用する場合はJavaScriptを有効にしてください。</p><p class="taRight">2016年12月07日</p><p>2016年12月2日(金)に本学B棟202教室にて、「第4回電気通信大学Unique &amp; Exciting Research Symposium」が開催されました。本シンポジウムは、文部科学省研究大学強化促進事業の一環として毎年開催されており、今年は、「研究力強化に向けた組織的な連携の在り方」とのテーマに関し、全国の大学、研究機関、民間企業等から約180名の参加がありました。</p><p>当日は、文部科学省大臣官房審議官(研究振興局担当)の板倉康洋氏のご来賓挨拶の後、パナソニック株式会社フェローの上野山 雄氏の講演「パナソニックにおける組織的な産学連携の取り組みと大学への期待」が行われました。その後、名古屋大学 学術研究・産学官連携推進本部副本部長の藤巻朗氏から「名古屋大学における研究力強化と組織的な連携の在り方」、また本学研究企画室副室長の森倉晋URAから「電通大における組織的な連携活動を加速するURAの取り組み」と題して、それぞれの大学における取り組みの紹介がありました。</p><p>「研究力強化に向けた組織的な連携の在り方」をテーマとするパネルディスカッションでは、講演者3名に加えて、福井大学 産学官連携研究開発機構URAオフィス副所長の山口光男氏にも参加して頂き、本学産学官連携センター長の中嶋信生特任教授の司会で、組織的な連携を進めるための繋ぐ機能やURAの役割に関して、会場の参加者との質疑討論を含めて活発な議論が行われました。</p><p>今後も引き続き学内外のネットワークの構築と活用を通じて、組織的な連携と協働の体制を構築することにより本学の研究力強化に向けて取り組んで参ります。</p><p class="toPageTop"><a href="#pageTop">TOP</a></p><p class="copyright"><span>Copyright © UEC Tokyo. All rights reserved.</span></p>

う〜ん見づらい。。。