ベクトルの画像的表示(練習)
ベクトルプロットの練習がてらベクトルの計算
まずは単純にベクトル表示
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()
なるほどこんな感じでプロットするのか
複数ベクトルの表示は
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()
癖が強い…w
因みに矢印の長さは=L2 ノルムって事らしい
仮に以下の様に指定すると
と仮定したとき、 は
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()
こんなイメージになると。
ベクトルの引き算 とすると
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()
この一番長いヤツが引き算結果のベクトルらしい
ベクトルの内積…ってどう書くんだ?とおもったら公式があった。
ってことで ベクトル間の開き角度ってことになるようだ
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()
要するにこの角度
Salesforce開発の基礎編4
- 適切な自動化ツールを選択する
- 「Salesforce フロー」(製品名)には「プロセスビルダー」と「フロービルダー」の二つがある。
- プロセスビルダー: レコード作成/更新/プラットフォームイベント発生で起動。バックグラウンドで関連レコードの操作やメール送信、他タスクのスケジュールなどができる。
- レコードの更新やフェーズなどが更新に付随してデータを更新する場合、上記イベント起因でタスクを作成する場合
- フロービルダー: ユーザのボタン操作や、レコードの作成/更新、プラットフォームイベント発生時、定期実行などで起動。画面操作などでウィザードを作ったり、プロセスビルダーの様にレコード操作などいろいろできる。
- 入力ウィザードが欲しい場合、レコードの更新やフェーズなどが更新に付随してデータを更新する場合、上記イベント起因でタスクを作成する場合
- プロセスビルダー: レコード作成/更新/プラットフォームイベント発生で起動。バックグラウンドで関連レコードの操作やメール送信、他タスクのスケジュールなどができる。
- 両ビルダーの機能は Apex コードで機能追加できる。
- 「Salesforce フロー」(製品名)には「プロセスビルダー」と「フロービルダー」の二つがある。
- プロセスビルダーを使用してシンプルなビジネスプロセスを自動化する
プロセスビルダーを実際に使ってみるハンズオン。プロセスビルダーの画面の使い方などを説明しています。
因みに画像は答えじゃないので、移されても課題を解ける保証しません
- Flow Builder でユーザをガイドしてビジネスプロセスを進める
こっちは Flow Builder のチュートリアルハンズオン。
- 承認でレコードが承認される方法をカスタマイズする
初めて言及される承認プロセスのカスタマイズ。これは Salesforce フローではない。
こんな感じで進めていけばいい。
ただしこの文言には注意
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.
集合おさらい
このあたりの数学はどっちかと言えば概念に近い。
hatena で tex 書式使う練習がてら
基本
A = \left\{ 2, 4, 6, 8, 10 \right\}
このような範囲がはっきりしたデータの集まりを 集合 といい、個別の値を 要素 という。
集合はただのあつまりなので、順番に意味はない(配列ではない)
\left\{ 2, 4, 6, 8, 10 \right\} = \left\{ 10, 4, 2, 6, 8 \right\}
また、 が集合 の要素であるということを以下の様に書く
x \in X
逆に含まれない場合は
x \notin X
集合要素は無限を定義できるのでこんな感じで関数も突っ込めるし
こんな感じで定義してもいい。
E = \left\{ x \mid x は偶数 \right\}
集合同士の関係
ある集合(ここではA)がもう一つの集合(B)の一部に含まれているときに、この関係を 包含関係 といい、A は B の部分集合という言い方ができる。
A \subset B
ただし は =
の可能性もある。
他の関係としては、
- 積集合: A, B 両方に含まれている部分的な集合
- 和集合: A, B どちらかには含まれているという集合
- 差集合: A の範囲ではあるが、B との共有部分は含まない集合
特殊な集合シリーズ
\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\}
とよく使う特殊集合系。
因みに
Salesforce開発の基礎編3
データインポート
データのインポートの概要 : データインポートウィザードとデータローダの二つがある。
データインポートウィザードは ここから ということで。
こんな感じにインポートしていきます。
こいつは標準オブジェクトにしかデータを突っ込めない。
データローダは外部ツールで、この辺 Help | Training | Salesforce からインストールできる。
見ての通り Java を使う。
こんな感じで表示されるので、通常はバッチファイルから起動する。
因みにこいつ何を元に Java を参照しに行ってるのか不明で、環境によってはこんなメッセージを吐く。
思わず クソが! とぼやいたが、仕方ない、この場合は java -jar dataloader-51.0.1-uber.jar
で起動できる。
こんなツール。
多分重要なのは データインポートウィザード 5 万件リミット、データローダ は 500 万件リミット。
この回の演習はデータインポートウィザードを利用してデータを取り込む演習です。
データのエクスポート
データエクスポートは データエクスポートサービス
と データローダ
の二つが選べる。
まぁデータローダは↑の画像見ればわかりそうなものなので。
データエクスポートはこんな画面から実行します。
エクスポートを開始するとこんな画面に
まぁ見ての通りか…
数式と入力規則
数式項目の使用
利用可能な数式はコレ Help | Training | Salesforce
カスタム項目
数式のカスタム項目を作成できますという話。
これは例えば 年齢 項目を参照して、60 以上で true になる「IsOld__c」みたいなカスタム項目を作れる。
これで作成したカラムは 「Formula」型となり、手動で設定することができない。更新は、レコードの保存/更新を行ったタイミングで自動設定される。
そのため、Apex でレコード作成するときは、Insert した後に SELECT してやらないと項目が設定されない。
設定はオブジェクトマネージャに項目がある。
積み上げ集計項目の実装
二つのオブジェクトが主従関係(主:取引先 - 商談 : 従 など)にある時、子レコードの特定フィールドを集計した項目を親に作ったり、子レコードの件数を親レコードのカラムにできる。
こうしたカラム(項目)を「積み上げ集計項目」と呼ぶ。
- 合計
- カウント
- 最小値
- 最大値
何かが設定できる。
因みに、こいつも子要素を INSERT/UPDATE/DELETE 等すると、保存実行時に親項目も更新で UPDATE される。なので、トリガーを仕掛けてたりするとこのタイミングで呼び出されるので、ちょっと注意。
入力規則
オブジェクトマネージャの項目内にこっそりある。
こんな感じで作成できる。
実行してみると
Apex でレコード操作してて、突然起こられるときは大体こいつ…一応複数項目評価もできるので、 「XXX が YYY の時は ZZZ は --- でなければならない」
みたいな制限もつけれる。
DeepLerning らしいDeepLerning実装
ここに、Dropout 層とか色々積んでみたというもの。
尚、この記事初めて見た人は突然何のことやらだと思うので、この辺の 2021/2 月あたりから継続してるのでその辺見ると良いかも?
やってみてわかったことは、大量のデータセットでいきなり学習させるとかではなくて、そこそこ小さなデータセットで 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続きを読む