機械学習基礎理論独習

誤りがあればご指摘いただけると幸いです。数式が整うまで少し時間かかります。リンクフリーです。

勉強ログです。リンクフリーです
目次へ戻る

【Blender】Smooth Minimum / Maximum, Smooth Step

Smooth Minimum / Maximum

Geometry Node の Math Node の Type が "Smooth Minimum" と "Smooth Maximum" について説明します。

[Node 表示方法]
Shift + A 押下後、"math" と入力すれば Math Node が出てきます。
Math Node の Type は初期状態で Add が選択されています。

Math Node 作成後、Type を "Smooth Minimum" か "Smooth Maximum" にしてください。

[基本説明]
"Smooth Minimum" は文字通り "Minimum" を滑らかにしたような関数です。
"Smooth Maximum" は同様に "Maximum" を滑らかにしたような関数です。

[Smooth Minimum の数式とグラフ]
Smooth Minimum Node は 3つの入力値 ValueValue、Distance を持ちます。
3つの入力値を a, b, c とおくと smoothmin 関数は以下のように定義されます。

\begin{eqnarray}
\operatorname{smoothmin}(a,b,c) = \min(a,b) - {c \over 6} \left({\max(c - |a - b|, 0) \over c}\right)^3\tag{1}
\end{eqnarray}

smoothmin(x,1,1) のグラフは以下です。

[Smooth Maximum の数式とグラフ]
smoothmax 関数は smoothmin 関数を使って以下のように定義されます。

\begin{eqnarray}
\operatorname{smoothmax}(a,b,c) = -\operatorname{smoothmin}(-a, -b, c)\tag{2}
\end{eqnarray}

smoothmax(x,1,1) のグラフは以下です。

Smooth Step

Geometry Node の Map Range Node の Type が "Smooth Step" について説明します。

[Node 表示方法]
Shift + A 押下後、"map range" と入力すれば Map Range Node が出てきます。
Map Range Node の Interpolation は初期状態で Linear が選択されています。

Map Range Node 作成後、Interpolation Type を "Smooth Step " にしてください。

[基本説明]
"Smooth Step" は文字通り Step 関数を滑らかにしたような関数です。
注意すべきは計算されたパラメータ t が [0, 1] に clamp されることです。
(パラメータtについては数式参照)

[数式とグラフ]
式は Pythonで書きます。

def smoothmin(x, from_min, from_max, to_min, to_max):
    # 正規化された補間係数 t を計算
    t = (x - to_min) / (to_max - to_min)

    # t を 0〜1 に clamp
    t = max(0.0, min(1.0, t))

    # Hermite 補間係数 s を計算(C¹連続)
    s = t * t * (3 - 2 * t)

    # 線形補間で値を返す
    return (1 - s) * from_min + s * from_max

smoothstep(x,0,1,0,1) 関数のグラフは以下です。


Minimum 関数

\begin{eqnarray}
{\rm Minimum}(a,b)=\left\{
\begin{array}{l}
a\hspace{20px} ({\rm if}\ a \leq b)\\
b\hspace{20px} ({\rm otherwise})
\end{array}
\right.
\end{eqnarray}

{\rm Minimum}(x,1) の関数のグラフは以下です。


Maximum 関数

\begin{eqnarray}
{\rm Maximum}(a,b)=\left\{
\begin{array}{l}
a\hspace{20px} ({\rm if}\ a \geq b)\\
b\hspace{20px} ({\rm otherwise})
\end{array}
\right.
\end{eqnarray}

{\rm Maximum}(x,1) の関数のグラフは以下です。


Clamp 関数

\begin{eqnarray}
{\rm Clamp}(x,a,b)={\rm Maximum}(a,{\rm Minimum}(x,b))
\end{eqnarray}

{\rm Clamp}(x,0,1) の関数のグラフは以下です。


Step 関数

\begin{eqnarray}
{\rm Step}(x,a)=\left\{
\begin{array}{l}
1\hspace{20px} ({\rm if}\ x \geq a)\\
0\hspace{20px} ({\rm otherwise})
\end{array}
\right.
\end{eqnarray}

{\rm Step}(x,1) の関数のグラフは以下です。

この関数のグラフには Math Node の Type が Greater Than のものを使用しました。


目次へ戻る