読者です 読者をやめる 読者になる 読者になる

粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

パワポのお洒落テンプレートを作ろう

PPT テンプレート

ご無沙汰しております。

最近ずっと堅い内容についてばかり記事を書いてきたので
たまには女子力を発揮してお洒落なPPTのテンプレートを作ってみようかなと思います。

自作テンプレートの作り方

PPTのテンプレはネット上にたくさん落ちていますが,一手間かけることで自分だけの書式を作ることが可能です☆

具体的には「表示」タブの中の「スライドマスター」という項目からこれを編集できます。
support.office.com

スライドマスターの中で図や写真を挿入することによって,
f:id:ossyaritoori:20170309224545p:plain

このように全てのスライドに変更を適用できます。
f:id:ossyaritoori:20170309224657p:plain

こうやってテンプレートが出来るってわけ。


デザインセンス0でも出来る ♡ お洒落テンプレートの作り方

ぶっちゃけオシャレなスライドを作るにはセンスが必要です。
でもセンスが皆無な我々にもそれっぽいものを作ることは可能です。

その方法は…「お洒落な画像を使う」ことです。


お洒落は結局イケメン(良い素材)を選ぶところが大きいってことです。
残酷ですね!!!
f:id:ossyaritoori:20170309225330p:plain
それにしても誰だこんな画像作ったやつは。


つまりこういうことです。
f:id:ossyaritoori:20170309225736p:plain

おしゃれな画像探し

おしゃれな検索ワードで画像検索しましょう。
その際「壁紙」とつけることで良い画像にめぐり逢う確率が上がります。

何故なら,壁紙はその時点である程度デザイン性を考えられているものがほとんどだからです。
すでに厳選済みのイケメンをスカウトすることができるというわけです。


ただ,できるだけシンプルな画像をチョイスすることをおすすめします。
最重要キーワードは「シンプル」です。
f:id:ossyaritoori:20170309230009p:plain

スライドへの加工

加工もなるべく簡単にすべきです。
四角いオブジェクトを被せて透過するのが最も素材を活かせて簡単かと思います。

端っこのほうを少しだけ露出することで透過している感を出すテクとかは結構使えます。
f:id:ossyaritoori:20170309231621p:plain


最も難しいのはタイトルだと思っています。
正直全然うまく作れませんでしたが,お洒落画像+透過+影 くらいのシンプルさでそれなりに見れるものには仕上がりました。
f:id:ossyaritoori:20170309231723p:plain

まとめ

イケメンはシンプルに清潔な格好をするだけでお洒落。

中国に来た時の連絡手段をどうするか

現在中国に来ています。

中国に来た時に1番困るのは食べ物でも空気の悪さでもなく
SNSの類が使えないことです。

具体的には,

の類が使えないです。インスタもダメなんでないかな?
これは結構由々しき問題でして,他の方々と全く連絡が取れないなんてザラです。


使うサービス

Yahoo

Google検索も死ぬので,Yahooを使っています。
Yahooメールもきちんと動作する数少ないメールなので,出張などの際は持っておいて損はないでしょう。

Gmailからの自動転送機能を使用することによって緊急の案件をキャッチアップ出来るようにしています。

Wechat

中国語では微信と書きます。
LINEにいろいろ機能がついた用な感じです。

中国における最もPopularなSNSで(多分)実際使い勝手も普通に良いので
滞在中に連絡しあいたい場合は携帯にインストールしておくと良いです。

はてなブログの扱い

はてなブログの記事は更新できるようです。
はてなブログは記事を更新した時にSNSに投稿できます。この機能を使ってSNSへの投稿を試してみることにします。

2017/02/21追記:やはり無理でした~w

TexStudioの使い得 便利機能集

メモ メモ-tex

先日TexStudioを布教したものです。
布教活動の一環として便利機能を幾つか紹介したいと思います。

TexStudio入れてない方は以下のページ等参考にどうぞ。
ossyaritoori.hatenablog.com

ドラッグアンドドロップによる図の貼り付け

TexStudioニキはドラッグアンドドロップD&D)で図を張れます。
実際にエクスプローラーからD&Dすると次のような画面が出ます。

何もいじらないでも図は出せますが,黄色マーカを引いたサイズの指定と
Captionの設定,後は論文の場合はtopに配置するように記述するようにしましょう。
f:id:ossyaritoori:20170211181625p:plain:w300

今気づいたのですが左下で設定を保存できますね。

  • 良いところ:ファイルを全て相対pathの形で貼るため何処からでも貼れる。
  • 注意点:ディレクトリ名が日本語だとghostscriptが場所を読めない時がある。

基本的には使い得な機能です。

簡単行列or表作成

[ウィザード]→[簡単行列作成]で簡単に行列を作れます。
意外とbegin{array}と&書くの面倒ですからね。

f:id:ossyaritoori:20170211185933p:plain:w450
これも重宝している機能の1つです。

英文スペルチェック

英語論文でのスペルミスを査読者に指摘されたことはありませんか?
私はあります(内容を見てくれ)ということでスペルチェックは結構有用な機能です。
専門用語等は教える必要がありますが…

以下のインラインチェックという箇所を「有効」にします。
f:id:ossyaritoori:20170211185310p:plain:w450
なお,日本語文書ではスペルチェックが超うるさくなるので適宜ここを開いてON/OFFしてください。

次に,使用する辞書の言語を設定します。
デフォルトではde_DE(ドイツ語)ですので変えないと悲惨なことになります。
f:id:ossyaritoori:20170211185547p:plain:w450

文法も見てくれるらしいですがどの程度かは不明です。

簡単?数式作成(ネタ)

数式補助のところを押すとこんなのも出ます。
f:id:ossyaritoori:20170211182517p:plain:w300

お絵かきで数式を書けるのは初心者に優しいですね。
ペンタブがある環境などでは比較的活躍の余地があるかもしれません。

ちょっと使い慣れない感じの記号を入れてもきちんと出来るようです。
f:id:ossyaritoori:20170211182839p:plain:w300
案外有能な機能な気がしてきた。
こんな形式でコードを生成してくれるようです。

$\left\{\begin{array}{c}\stackrel{.}{x}=Ax+Bu\\ y=Cx+Du\end{array}\right\$

すごーい!

lとかiとかの識別は苦手っぽい。
ふしぎ!

MatlabでLevenberg-Marquardt法

非線形最小二乗法 matlab Levenberg-Marquardt

過去記事が地味に反応あったので調子乗って続きをば。
ossyaritoori.hatenablog.com

前回のGauss-Newton法に引き続き,
Levenberg-Marquardt法についてです。

フィッティングの手法としてはGauss-Newtonより多用される王道中の王道ですね。

概要

前回のGauss-Newton法を前提にしているのでそっちを先に参照してくださいな。
matlabはstudentバージョンで2015aで動作します。
symbolic math Toolboxを使っております。

アルゴリズムについて私的見解

以下の記述は私の持ってるイメージですのであしからず。
間違ってたらコメントにて教えてください,

Gauss-Newton法は2次収束するNewton法において,ヘッセ行列をヤコビ行列の二乗で近似した手法ですが,
勢いが良すぎてぶっ飛んでしまうことがあります。
そこで,適切なダンピングファクターλを下のように導入します。

\Delta v =  - (J^TJ+\lambda I)^{-1}J^T \  r

適度にダンピングをかけることで吹っ飛ぶのを回避できるってわけ。


なお,ダンピング項のIは最も簡単には単位行列,もう少し賢く行くにはヤコビアンの二乗の対角項を使うようです。
減衰最小二乗法とも言うようですね。

\Delta v =  - (J^TJ+\lambda diag(J^TJ))^{-1}J^T \  r
matlabで書くならダンピング項はこんな感じか,簡単すな。

I = diag(diag(J.'*J))

知恵袋の秀逸な解答

なお,以下の知恵袋の解答も秀逸です。
Levenberg-Marquardt法(LM法)は非線形最小二乗問題を解く有力な... - Yahoo!知恵袋

最急降下法とGaussNewton法の組み合わせ」という言はたしかにしっくり来ます。

以下の式は数学的には超間違い!!ですが,
感覚としてこんな感じってことなのはなんとなくわかります。
\Delta v =  - (J^TJ)^{-1}J^T \  r - \lambda^{-1} J^T \  r

この式は怖い人がなんか言ってきたら消します()

問題設定

前回のと同じ,wikipediaの例題です。
ガウス・ニュートン法 - Wikipedia

関数:
 y = \dfrac{ax}{x+b}

Gauss-Newton法との比較

λをいじった場合どのように収束速度が変わるかを示す図が以下の通り。
f:id:ossyaritoori:20170201221137p:plain

Legendが適当なのはごめんなさい。ダンピングと言う通り,λを大きくすると収束速度は鈍ります。

補足:パラメータ空間でのアルゴリズムの様子

変更するパラメータa,bを0~1の範囲で変えて残差の二乗和の関数の様子を見ました。

残差の二乗和:  S = \sum_{i=1}^n (r_i)^2

f:id:ossyaritoori:20170201224437p:plain
なるほど今回の例では傾きの急な所から1方向にガツンと降りていくだけなのでそれほど差がないのも頷けます。
向かい側にも山があるお椀型の場合,GN法だと行ったり来たりする時がある印象です。

f:id:ossyaritoori:20170201225553p:plain
降りた時の軌跡はこんな感じ。我ながら結構わかりやすくなって満足。


Levenberg-Marquardt法:コード

基本的な解説はGaussNewton法の所を読んで下さい。
ダンピング項を加えただけです。

%%  https://ja.wikipedia.org/wiki/%E3%82%AC%E3%82%A6%E3%82%B9%E3%83%BB%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%88%E3%83%B3%E6%B3%95
% http://org-technology.com/posts/gauss-newton-method.html

%% get data
clear all;
% data for fitting
xhat = [0.038, 0.194, 0.425, 0.626, 1.253, 2.500, 3.740].';
yhat = [0.050, 0.127, 0.094, 0.2122, 0.2729, 0.2665, 0.3317].';

%% making evaluate funciton
syms a b x y

% evaluate fuction
func = a*x/(x+b);
R = y - func;
S = R^2;

% partial derivative
Ra = diff(R,a);
Rb = diff(R,b);

% make jacobian matrix
Ja = subs(Ra,{x,y},{xhat,yhat});
% subs(fa,[x,y],[xhat,yhat]); ではダメ
Jb = subs(Rb,{x,y},{xhat,yhat});

Jacob = [Ja,Jb]; % jacobian


%% initial value
vinit = [0.9;0.2];
v = vinit;
iteration = 10;

% lambda
lambda = 1;
I = eye(size(Jacob,2));
% evaluate function
SumOfError = zeros(iteration,1);
SEF = subs(S,{x,y},{xhat,yhat});


%% iterative optimization
% error function
r = subs(R,{x,y},{xhat,yhat});

for i = 1:iteration
   J = double(subs(Jacob,[a,b],v'));
   df = double(subs(r,[a,b],v'));
   delta = - ( J.' * J  + lambda * I)\J.' *  df;
   v = v + delta;

   SOE = double(subs(SEF,[a,b],v'));
   SumOfError(i) = SOE.' * SOE;
end

%% showing
fit = subs(func,x,xhat);
yfit = double( subs(fit,[a,b],v') );

figure(3);
plot(xhat,yhat,'+',xhat,yfit);
xlabel('x');
ylabel('y');
legend('data','fitted value','Location','Best');
grid on;

figure(4);
plot(SumOfError);
xlabel('iteration');
ylabel('Sum Of Squared Error');
legend('Squared Error value')
grid on;

マッピングのコード

ndgridを初めて有効に使った気がします。
及第点。

%% mapping
Ms = 20;
Map = zeros(Ms);
% evaluate function
SEF = subs(S,{x,y},{xhat,yhat});
A = ndgrid(1:Ms,1:Ms)/Ms;
B = A.';


for i = 1:Ms
    for j = 1:Ms
        v = [i/Ms;j/Ms];
       SOE = double(subs(SEF,[a,b],v'));
       Map(i,j) = SOE.' * SOE;
    end
end

%% showing
figure(5);
mesh(A,B,Map);
xlabel('a');
ylabel('b');
grid on;

MATLABで非線形最小二乗フィッティングする手順メモ

matlab 非線形最小二乗法 ガウスニュートン法 フィッティング

多数のデータ群から関数フィッティングを行う場合に非線形最小二乗法を用います。

MATLABにはOptimization Toolboxなどがあり,それを用いると簡単にフィッティングできます。
以下のブログなんかに解説がありますね。
MATLABで非線形最小二乗問題を解く - Py


このようなToolboxなしでも,
地道にこれを解く手順がありますので勘所をメモしておきます。
なお,数式とアルゴリズムの基礎がわかっている前提で書きます。


アウトライン

matlabのバージョンは生協で買ったStudent version(2015a準拠)です。
本記事ではsymbolic math Toolboxを使って「偏微分」と「変数代入」を行います。
(頑張ればここは手作業でいけます。しないけど。)

ヤコビアンを求めて,Gauss-Newton法の枠組みでこれを計算します。

こんな風にフィッティング出来ます。
f:id:ossyaritoori:20170131220211p:plain

なお,Gauss-Newton法は案外簡単に発散するのでその場合は以下のLevenberg-Marquardt法を試してみてください。
ossyaritoori.hatenablog.com


問題設定

例題としてwikipedeiaの問題を考えます。
ガウス・ニュートン法 - Wikipedia


Fitting対象の関数は以下のようになります。

 y = \dfrac{ax}{x+b}

フィッティングするのはaとbの2つの変数です。

フィッティングするデータは次の様に表せます。

% data for fitting
xhat = [0.038, 0.194, 0.425, 0.626, 1.253, 2.500, 3.740].';
yhat = [0.050, 0.127, 0.094, 0.2122, 0.2729, 0.2665, 0.3317].';

通常こういう値のベクトルは縦向きですので後ろで転置してます。
今回は7×1のベクトル,すなわち7個のデータセットですね。

問題の定式化

残差と最小二乗和を以下の様に定義します。iはデータ群の各成分ってこと。

残差:  r_i = y_i - \dfrac{ax_i}{x_i+b}

残差の二乗和:  S = \sum_{i=1}^n (r_i)^2

Symbolic math Toolboxを使ってこれは次の様にかけます。

%% making evaluate funciton
syms a b x y

% evaluate fuction
func = a*x/(x+b);
R = y - func;
S = R^2;

ヤコビ行列の作成

ヤコビ行列はシンボリックの微分diffで簡単に作成できます。
(もっと簡単に作成する手法は一番下を参照)

実装上工夫する点は,

  • 代入できる値は早めに代入して,計算コストを減らす,(シンボリック計算は重い)


% partial derivative
Ra = diff(R,a);
Rb = diff(R,b);

% make jacobian matrix
Ja = subs(Ra,{x,y},{xhat,yhat});
Jb = subs(Rb,{x,y},{xhat,yhat});

Jacob = [Ja,Jb]; % jacobian

Ja,Jbの計算では,ヤコビ行列に先にフィッティングデータの値を代入して後の計算を楽にします。

補足:ヤコビ行列のサイズ

フィッティング係数がm個,データがn個あるとします。

この際,ヤコビ行列はn×mになることに注意。
f:id:ossyaritoori:20170131214013p:plain:w200
なんて親切な図だ←

注意:subsを用いた複数の配列の代入

subs関数を用いてシンボリックに配列を代入する時の書き方ですが,ややコツがいるかも?
公式を読んでいると以下のように代入しがちですがアウトです。

% 失敗例
subs(fa,[x,y],[xhat,yhat]); 

セル配列として受け渡すのが正解です。

% 成功例
subs(fa,{x,y},{xhat,yhat}); 

セル配列誰かに教わりたい。

反復計算による求解

ヤコビ行列が求まれば,その時々のパラメータの推定値 a_n,b_nをヤコビ行列Jと残差Rに代入して更新量がわかります。
パラメータをまとめてvとし,残差への代入値をrとすると,

更新式:  v_{new} = v + \Delta v
に対して

 \Delta v =  - (J^TJ)^{-1}J^T \  r

が求める計算です。
これまたsubsでの代入に注意。

% 残差に事前にフィッティングするデータを代入。
r = subs(R,{x,y},{xhat,yhat});

%ヤコビ行列にデータvを代入
J = double(subs(Jacob,[a,b],v'));
% 残差にも代入
df = double(subs(r,[a,b],v'));

% 更新量Δを計算して更新
delta = - ( J.' * J )\J.' *  df;
v = v + delta;

symsだと計算した値がシンボリックのままになるので,
doubleで一度数値に直しています。

補足:行列のサイズ

フィッティング係数がm個,データがn個あるとします。
この例題では,m=2,n=7ですね。

図解すると次のとおりになります。
f:id:ossyaritoori:20170131215154p:plain

な,なんて親切な図なんだ←


計算結果

今回は固定ステップ itaration=10 でやりました。
一般的には,「誤差が閾値を下回るまで」という条件付けをします。
正確さを気にしなければ誤差の微分見て鈍くなった所で止めてもいいかと。

フィッティングの結果を図示します。
f:id:ossyaritoori:20170131220211p:plain


各ステップ毎の誤差の二乗和Sは次のようになっています。
f:id:ossyaritoori:20170131220401p:plain

順調に減って居ますが途中から鈍くなってますね。今回最適化した結果は

a = 0.3618
b = 0.5563

です。wikiの値とほぼ同じですね。

まとめと今後

simbolicでGauss-newton法のフィッティングを行いました。
今後やるとしたら以下についてまとめる予定です。

サンプルコード

終了条件が誤差の大きさではなく,反復回数になっているので気に食わない方は変更してね。

%% get data
clear all;
% data for fitting
xhat = [0.038, 0.194, 0.425, 0.626, 1.253, 2.500, 3.740].';
yhat = [0.050, 0.127, 0.094, 0.2122, 0.2729, 0.2665, 0.3317].';

%% making evaluate funciton
syms a b x y

% evaluate fuction
func = a*x/(x+b);
R = y - func;
S = R^2;

% partial derivative
Ra = diff(R,a);
Rb = diff(R,b);

% make jacobian matrix
Ja = subs(Ra,{x,y},{xhat,yhat});
% subs(fa,[x,y],[xhat,yhat]); ではダメ
Jb = subs(Rb,{x,y},{xhat,yhat});

Jacob = [Ja,Jb]; % jacobian


%% initial value
vinit = [0.9;0.2];
v = vinit;
iteration = 10;

% evaluate function
SumOfError = zeros(iteration,1);
SEF = subs(S,{x,y},{xhat,yhat});

%% iterative optimization
% error function
r = subs(R,{x,y},{xhat,yhat});

for i = 1:iteration
   J = double(subs(Jacob,[a,b],v'));
   df = double(subs(r,[a,b],v'));
   delta = - ( J.' * J )\J.' *  df;
   v = v + delta;

   SOE = double(subs(SEF,[a,b],v'));
   SumOfError(i) = SOE.' * SOE;
end

%% showing
fit = subs(func,x,xhat);
yfit = double( subs(fit,[a,b],v') );

figure(1);
plot(xhat,yhat,'+',xhat,yfit);
xlabel('x');
ylabel('y');
legend('data','fitted value','Location','Best');
grid on;

figure(2);
plot(SumOfError);
xlabel('iteration');
ylabel('Sum Of Squared Error');
legend('Squared Error value')
grid on;

参考資料

基本的には教科書を読もう。

ガウス・ニュートン法 - Wikipedia

Python NumPy サンプルコード: Gauss-Newton 法で非線形最小二乗問題を解く | org-技術

jacobian 関数の使用 :2017/3/7 更新

「ヤコビ行列はシンボリックの微分diffで簡単に作成できます。」
matlabにはjacobian関数が存在し,ヤコビ行列を一発で作成してくれます。

% partial derivative
Jacob = jacobian(R,[a b]);

Referenceをちゃんと読もうな。

初歩過ぎてあまり説明を見ない行列の微分の公式

行列 微分 勉強

馬鹿にしてくれて構いませんが
行列で偏微分をしなきゃいけない時にとっさに忘れて非常に困ったので自分用にメモを残します。


Aとxはベクトル(行列)とします。


1.  \dfrac{\partial A^T x}{\partial x} = A

2.  \dfrac{\partial x^T A}{\partial x} = A

この2つは忘れた時に地味にネットに検索かけても出ないんですよね。
もちろん,適当に成分を仮定して計算することも出来ます。


3.  \dfrac{\partial x^T A x}{\partial x} = (A+A^T) x



練習用の証明)
 \dfrac{\partial x^T A x}{\partial x} = \dfrac{\partial (x^T A) x}{\partial x}+\dfrac{\partial x^T (A x)}{\partial x}


積の微分法。表記にはすこぶる自信がない。それぞれ1と2を適用して下のようになる。

  = (x^T A)^T + A x

ここで,  (AB)^T = B^TA^Tなので,

  = A^Tx + A x

とまぁこんな感じか。
良い子のみんなはきちんと勉強してこういうことがないようにしましょう。

MATLABでNaNやInfを何とかしたい

メモ メモ-MATLAB

ダジャレみたいな軽い記事です。

NaNを0に置換

Aという行列の中にNanがあってそれを0にする場合,以下のように書きます。

A(isnan(A))=0

なお,matlabではfor文はべらぼうに時間がかかるので
なるべく行列のまま処理したほうが計算時間の節約になります。

Infを0に置換

Aという行列の中にInfがあってそれを0にする場合,以下のように書きます。
なお,-Infも同様です

A(~isfinite(A))=0

種明かし

isnan(A)

というコマンドは行列Aのうち,Nanがある所を1,無い所を0の「論理値」で出力します。
はい,ここ重要です。
行列に論理値を食わせることで該当する箇所の値を参照できるらしいです。
なるほど~。

よくわからんので実験

以下のコードで実験してみました。

3*3の魔法陣を作ります。

Magi =[ 8  1  6; 3  5  7; 4  9  2]

代入するのは代数値でなければなりません。
例えば代数値の対角行列を入れてみる。

 Magi(diag([true true true]))

結果,ans = 8,5,2 と見事に対角の値だけにアクセスしています。

ならば,一つだけ食わせるとどうか?
なんと先頭の値にアクセスします。

 Magi(true)

結果:ans = 8

そして数値を足してずらせるようです。ポインタみたいだな。

 Magi(true+1)

結果:ans = 3

行 → 列の順に格納しているのがわかります。

 Magi(true+3)

結果:ans = 1

ほらね。


また,こんなことも出来ます。

Magi(true,true+1)

結果:ans = 1

う~ん,true=1として処理してるだけに見えてきた。

Infの方はなんか出力が逆ですが基本やってることは同じです。
ほ~ん。