技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

ベクトルの画像的表示(練習)

ベクトルプロットの練習がてらベクトルの計算
まずは単純にベクトル表示

import numpy as np
import matplotlib.pyplot as plt

plt.figure()

LX, LY=5,5

# ベクトルの
plt.quiver(0, 0, 2.5, 1, angles='xy', scale_units='xy', scale=1)

plt.xlim([-LX,LX])
plt.ylim([-LY,LY])
plt.grid()
plt.draw()
plt.show()

f:id:white-azalea:20210520205446p:plain

なるほどこんな感じでプロットするのか
複数ベクトルの表示は

plt.figure()

# ベクトルを行列で表示
X1 = [0, 1, 2]
Y1 = [0, 0, 0]
U = [0.5,  0.25, -0.5]
V = [0.25, 0.5,  -0.25]

# ベクトルの
plt.quiver(X1, Y1, U, V, angles='xy', scale_units='xy', scale=1)

plt.xlim([-1, 3])
plt.ylim([-1, 3])
plt.grid()
plt.draw()
plt.show()

f:id:white-azalea:20210520205539p:plain

癖が強い…w

因みに矢印の長さは=L2 ノルムって事らしい


\parallel a \parallel

仮に以下の様に指定すると


a = (2, 3)^T \\
b = (1, 5)^T

と仮定したとき、  a+b

plt.figure()

# ベクトルを行列で表示
X1 = [0, 0, 2]
Y1 = [0, 0, 3]
U = [3, 2, 1]
V = [8, 3, 5]

# ベクトルの
plt.quiver(X1, Y1, U, V, angles='xy', scale_units='xy', scale=1)

plt.xlim([-1, 5])
plt.ylim([-1, 10])
plt.grid()
plt.draw()
plt.show()

f:id:white-azalea:20210520205730p:plain

こんなイメージになると。
ベクトルの引き算  a-b とすると

plt.figure()

# ベクトルを行列で表示
# a, b, a-b
X1 = [0, 0, -1]
Y1 = [0, 0, -5]
U = [2, -1, 3]
V = [3, -5, 8]

# ベクトルの
plt.quiver(X1, Y1, U, V, angles='xy', scale_units='xy', scale=1)

plt.xlim([-2, 4])
plt.ylim([-6, 4])
plt.grid()
plt.draw()
plt.show()

f:id:white-azalea:20210520205838p:plain

この一番長いヤツが引き算結果のベクトルらしい
ベクトルの内積…ってどう書くんだ?とおもったら公式があった。


a^T b = \parallel a \parallel \parallel b \parallel cos \theta

ってことで  \theta ベクトル間の開き角度ってことになるようだ

plt.figure()

# ベクトルを行列で表示
# a, b
X1 = [0, 0]
Y1 = [0, 0]
U  = [2, 1]
V  = [3, 5]

# ベクトルの
plt.quiver(X1, Y1, U, V, angles='xy', scale_units='xy', scale=1)

plt.xlim([-1, 3])
plt.ylim([-1, 6])
plt.grid()
plt.draw()
plt.show()

f:id:white-azalea:20210520210117p:plain

要するにこの角度

Salesforce開発の基礎編4

trailhead.salesforce.com

  • 適切な自動化ツールを選択する
    • Salesforce フロー」(製品名)には「プロセスビルダー」と「フロービルダー」の二つがある。
      • プロセスビルダー: レコード作成/更新/プラットフォームイベント発生で起動。バックグラウンドで関連レコードの操作やメール送信、他タスクのスケジュールなどができる。
        • レコードの更新やフェーズなどが更新に付随してデータを更新する場合、上記イベント起因でタスクを作成する場合
      • フロービルダー: ユーザのボタン操作や、レコードの作成/更新、プラットフォームイベント発生時、定期実行などで起動。画面操作などでウィザードを作ったり、プロセスビルダーの様にレコード操作などいろいろできる。
        • 入力ウィザードが欲しい場合、レコードの更新やフェーズなどが更新に付随してデータを更新する場合、上記イベント起因でタスクを作成する場合
    • 両ビルダーの機能は Apex コードで機能追加できる。
  • プロセスビルダーを使用してシンプルなビジネスプロセスを自動化する
    プロセスビルダーを実際に使ってみるハンズオン。プロセスビルダーの画面の使い方などを説明しています。
    因みに画像は答えじゃないので、移されても課題を解ける保証しません
    f:id:white-azalea:20210519223035p:plain
    f:id:white-azalea:20210519223229p:plain
    f:id:white-azalea:20210519223555p:plain
    f:id:white-azalea:20210519223829p:plain
  • Flow Builder でユーザをガイドしてビジネスプロセスを進める
    こっちは Flow Builder のチュートリアルハンズオン。
    f:id:white-azalea:20210519224150p:plain
    f:id:white-azalea:20210519224220p:plain
    f:id:white-azalea:20210519224303p:plain
    f:id:white-azalea:20210519224427p:plain
    f:id:white-azalea:20210519224657p:plain
    f:id:white-azalea:20210519224950p:plain
  • 承認でレコードが承認される方法をカスタマイズする
    初めて言及される承認プロセスのカスタマイズ。これは Salesforce フローではない。
    f:id:white-azalea:20210519225645p:plain
    f:id:white-azalea:20210519230223p:plain
    こんな感じで進めていけばいい。
    ただしこの文言には注意

Before You Start In the Account object, check the Type field’s picklist values for Prospect, Customer, and Pending. Add any of these values that are missing.

数学回

数列

ってもこんなの義務教育でもちょこっとはやるでしょう(汗
エンジニア大好き数列の一つ偶数とか


a_n = 2n \\
a_1 = 2, a_2 = 4, a_3 = 6, ...

でこの足した合計をこんな感じで記述する。


\sum^{N}_{n=1} a_n

これは一緒に習うと思うけど


\sum^{N}_{n=1} i = \frac{1}{2} n (n + 1) \\
\sum^{N}_{n=1} i^2 = \frac{1}{6} n (n + 1)(2n + 1)

これが掛け算だとこんな感じ


\prod^{N}_{n=1} a_n = a_1 \cdot a_2 \cdot a_3 ... a_N

因みにこんな公式もある。


\sum^{N}_{n=1} (a_n + b_n) = \sum^{N}_{n=1} a_n + \sum^{N}_{n=1} b_n \\
\sum^{N}_{n=1} ka_n = k \sum^{N}_{n=1} a_n
続きを読む

集合おさらい

このあたりの数学はどっちかと言えば概念に近い。
hatena で tex 書式使う練習がてら

基本


A = \left\{ 2, 4, 6, 8, 10 \right\}
A = \left\{ 2, 4, 6, 8, 10 \right\}

このような範囲がはっきりしたデータの集まりを 集合 といい、個別の値を 要素 という。
集合はただのあつまりなので、順番に意味はない(配列ではない)


\left\{ 2, 4, 6, 8, 10 \right\} = \left\{ 10, 4, 2, 6, 8 \right\}
\left\{ 2, 4, 6, 8, 10 \right\} = \left\{ 10, 4, 2, 6, 8 \right\}

また、 x が集合  X の要素であるということを以下の様に書く


x \in X
x \in X

逆に含まれない場合は


x \notin X
x \notin X

集合要素は無限を定義できるのでこんな感じで関数も突っ込めるし


X = \left\{ x \mid P(x) \right\}

こんな感じで定義してもいい。


E = \left\{ x \mid x は偶数 \right\}
E = \left\{ x \mid x は偶数 \right\}

集合同士の関係

ある集合(ここではA)がもう一つの集合(B)の一部に含まれているときに、この関係を 包含関係 といい、A は B の部分集合という言い方ができる。


A \subset B
A \subset B

ただし  \subset = の可能性もある。
他の関係としては、

  • 積集合: A, B 両方に含まれている部分的な集合

A \cap B =   \left\{
    x \mid x \in A かつ x \in B 
\right\}
  • 和集合: A, B どちらかには含まれているという集合
 
A \cup B = \left\{   x \mid x \in A または x \in B   \right\}
  • 差集合: A の範囲ではあるが、B との共有部分は含まない集合

A - B = \left\{   x \mid x \in A かつ x \notin B   \right\}

特殊な集合シリーズ


\mathbb{Z} = \left\{ x \mid x は整数 \right\} \\
\mathbb{N} = \left\{ x \mid x は自然数 \right\} 
    = \left\{ x \mid x \in \mathbb{Z} かつ x \ge 1 \right\}  \\
\mathbb{Q} = \left\{ x \mid x は有理数 \right\} 
    =  \left\{ \frac{p}{q} \mid p \in \mathbb{Z}, q \in \mathbb{Z} - \left\{ 0 \right\} \right\} \\
\mathbb{R} = \left\{ x \mid x は実数 \right\}  \\
\mathbb{C} = \left\{ x \mid x は複素数 \right\}
    = \left\{ u + v \sqrt{-1} \mid u, v \in \mathbb{R} \right\}
\mathbb{Z} = \left\{ x \mid x は整数 \right\} \\
\mathbb{N} = \left\{ x \mid x は自然数 \right\} 
    = \left\{ x \mid x \in \mathbb{Z} かつ x \ge 1 \right\}  \\
\mathbb{Q} = \left\{ x \mid x は有理数 \right\} 
    =  \left\{ \frac{p}{q} \mid p \in \mathbb{Z}, q \in \mathbb{Z} - \left\{ 0 \right\} \right\} \\
\mathbb{R} = \left\{ x \mid x は実数 \right\}  \\
\mathbb{C} = \left\{ x \mid x は複素数 \right\}
    = \left\{ u + v \sqrt{-1} \mid u, v \in \mathbb{R} \right\}

とよく使う特殊集合系。
因みに


\mathbb{N} 
\subset \mathbb{Z} 
\subset \mathbb{Q} 
\subset \mathbb{R} 
\subset \mathbb{C}

Salesforce開発の基礎編3

データインポート

trailhead.salesforce.com

データのインポートの概要 : データインポートウィザードとデータローダの二つがある。

データインポートウィザードは f:id:white-azalea:20210512200730p:plain ここから f:id:white-azalea:20210512200823p:plain ということで。
こんな感じにインポートしていきます。
こいつは標準オブジェクトにしかデータを突っ込めない。

f:id:white-azalea:20210512201042p:plain

データローダは外部ツールで、この辺 Help | Training | Salesforce からインストールできる。
見ての通り Java を使う。
f:id:white-azalea:20210512201603p:plain
こんな感じで表示されるので、通常はバッチファイルから起動する。

因みにこいつ何を元に Java を参照しに行ってるのか不明で、環境によってはこんなメッセージを吐く。
f:id:white-azalea:20210512202039p:plain
思わず クソが! とぼやいたが、仕方ない、この場合は java -jar dataloader-51.0.1-uber.jar で起動できる。

f:id:white-azalea:20210512202147p:plain

こんなツール。
多分重要なのは データインポートウィザード 5 万件リミット、データローダ は 500 万件リミット。
この回の演習はデータインポートウィザードを利用してデータを取り込む演習です。

データのエクスポート

データエクスポートは データエクスポートサービスデータローダ の二つが選べる。
まぁデータローダは↑の画像見ればわかりそうなものなので。

f:id:white-azalea:20210512203904p:plain

データエクスポートはこんな画面から実行します。
エクスポートを開始するとこんな画面に

f:id:white-azalea:20210512204120p:plain

まぁ見ての通りか…

数式と入力規則

trailhead.salesforce.com

数式項目の使用

利用可能な数式はコレ Help | Training | Salesforce

カスタム項目

数式のカスタム項目を作成できますという話。
これは例えば 年齢 項目を参照して、60 以上で true になる「IsOld__c」みたいなカスタム項目を作れる。

これで作成したカラムは 「Formula」型となり、手動で設定することができない。更新は、レコードの保存/更新を行ったタイミングで自動設定される。
そのため、Apex でレコード作成するときは、Insert した後に SELECT してやらないと項目が設定されない。

設定はオブジェクトマネージャに項目がある。

f:id:white-azalea:20210512205528p:plain

積み上げ集計項目の実装

二つのオブジェクトが主従関係(主:取引先 - 商談 : 従 など)にある時、子レコードの特定フィールドを集計した項目を親に作ったり、子レコードの件数を親レコードのカラムにできる。
こうしたカラム(項目)を「積み上げ集計項目」と呼ぶ。

  • 合計
  • カウント
  • 最小値
  • 最大値

何かが設定できる。
因みに、こいつも子要素を INSERT/UPDATE/DELETE 等すると、保存実行時に親項目も更新で UPDATE される。なので、トリガーを仕掛けてたりするとこのタイミングで呼び出されるので、ちょっと注意。

入力規則

オブジェクトマネージャの項目内にこっそりある。

f:id:white-azalea:20210512211848p:plain

こんな感じで作成できる。
f:id:white-azalea:20210512212531p:plain

実行してみると
f:id:white-azalea:20210512212612p:plain

Apex でレコード操作してて、突然起こられるときは大体こいつ…一応複数項目評価もできるので、 「XXX が YYY の時は ZZZ は --- でなければならない」 みたいな制限もつけれる。

DeepLerning らしいDeepLerning実装

white-azalea.hatenablog.jp

ここに、Dropout 層とか色々積んでみたというもの。
尚、この記事初めて見た人は突然何のことやらだと思うので、この辺の 2021/2 月あたりから継続してるのでその辺見ると良いかも?

white-azalea.hatenablog.jp

やってみてわかったことは、大量のデータセットでいきなり学習させるとかではなくて、そこそこ小さなデータセットで 1 層づつ増やしていった方が無難だと思った。

いきなり層を増やしてエラー起こすと、何層目で設定ミスしたのか本気で分からなくなるので…。
行列計算の問題なので、行列サイズ(input / output) の形状一つでもミスすると、即エラーです。

尚、im2col 変換や col2im は以前の記事参照で。

畳み込み層

画像の特徴抽出層。
内部でフィルタを持っていて、フィルタによって特徴を拾う。

尚、ニューロンからのリクエスト(backpropagation)を受けて、よりリクエストに合ったフィルタに形状変更していく。

class ILayer:
    def forward(self, x, is_test):
        pass
    def backward(self, grad_y):
        pass
    def update(self, eta):
        pass

class ConvLayer(ILayer):
    def __init__(self, x_ch, x_h, x_w, n_flt, flt_h, flt_w, stride, pad, wb_width):

        # パラメータをまとめる
        self.params = (x_ch, x_h, x_w, n_flt, flt_h, flt_w, stride, pad)
        
        # フィルタとバイアスの初期値
        self.w = wb_width * np.random.randn(n_flt, x_ch, flt_h, flt_w)
        self.b = wb_width * np.random.randn(1, n_flt)
        
        # 出力画像のサイズ
        self.y_ch = n_flt  # 出力チャンネル数
        self.y_h = (x_h - flt_h + 2*pad) // stride + 1  # 出力高さ
        self.y_w = (x_w - flt_w + 2*pad) // stride + 1  # 出力幅
 
        # AdaGrad用
        self.h_w = np.zeros((n_flt, x_ch, flt_h, flt_w)) + 1e-8
        self.h_b = np.zeros((1, n_flt)) + 1e-8
        
    def forward(self, x, is_test):
        n_bt = x.shape[0] 
        x_ch, x_h, x_w, n_flt, flt_h, flt_w, stride, pad = self.params
        y_ch, y_h, y_w = self.y_ch, self.y_h, self.y_w
        
        # 入力画像とフィルタを行列に変換
        self.cols = im2col(x, flt_h, flt_w, y_h, y_w, stride, pad)
        self.w_col = self.w.reshape(n_flt, x_ch*flt_h*flt_w)
        
        # 出力の計算: 行列積、バイアスの加算、活性化関数
        u = np.dot(self.w_col, self.cols).T + self.b
        self.u = u.reshape(n_bt, y_h, y_w, y_ch).transpose(0, 3, 1, 2)
        self.y = np.where(self.u <= 0, 0, self.u)
        return self.y
    
    def backward(self, grad_y):
        n_bt = grad_y.shape[0]
        x_ch, x_h, x_w, n_flt, flt_h, flt_w, stride, pad = self.params
        y_ch, y_h, y_w = self.y_ch, self.y_h, self.y_w
        
        # delta
        delta = grad_y * np.where(self.u <= 0, 0, 1)
        delta = delta.transpose(0,2,3,1).reshape(n_bt*y_h*y_w, y_ch)
        
        # フィルタとバイアスの勾配
        grad_w = np.dot(self.cols, delta)
        self.grad_w = grad_w.T.reshape(n_flt, x_ch, flt_h, flt_w)
        self.grad_b = np.sum(delta, axis=0)
        
        # 入力の勾配
        grad_cols = np.dot(delta, self.w_col)
        x_shape = (n_bt, x_ch, x_h, x_w)
        self.grad_x = col2im(grad_cols.T, x_shape, flt_h, flt_w, y_h, y_w, stride, pad)
        return self.grad_x

    def update(self, eta):
        self.h_w += self.grad_w * self.grad_w
        self.w -= eta / np.sqrt(self.h_w) * self.grad_w
        
        self.h_b += self.grad_b * self.grad_b
        self.b -= eta / np.sqrt(self.h_b) * self.grad_b
続きを読む