ひよこメモ

備忘ブログ Ruby, Rails, AWS, html5, css3, javascript, vim,

【AI】平均二乗誤差 mean_squared_error

kerasでcompileする際に引数として指定できる。
損失関数lossに指定する。
正解からのズレを2乗することで、符号が消え差を大きく表現できる。

正解10に対して
15を当てはめる:(15-10)^2 = 25
2を当てはめる:(2-10)^2 = 64
よって15のほうが正解に近いと学習される。

k-最近傍法(KNeighborClassifier)

classifier(クラシファイア 分類器):様々なデータを分類していくシステム。
データセット:機械学習においてこの様々なデータの塊のこと。
データポイント:複数の特徴量をまとめたデータ。(行)
特徴量:データポイントを構成する特徴(列)

k-最近傍法。k nearest neighbor。k-NN。
k-最近傍法は「教師あり学習」であり、比較的シンプルな分類器である。

①既存のデータセットをベクトル空間(座標)上に描画する。
ベクトル空間(vector space線形空間):n次元の場合n個のベクトルで表されるもの。
 →2次元の場合2個のベクトルで表されるもの。2次元の座標軸。
ベクトル:向きと大きさをもつ量のこと。数字が縦or横に一直線に並んだもの。平面や空間を走るやじるし。
 大きさをスカラーという。スカラーに向きが加わるとベクトル(vector)と呼ぶ。
 スカラーは「|a|」などの表記。ベクトルABの大きさ=線分ABの長さ。つまり「大きさ」と「長さ」は同じ意味を表す。
 スカラー倍:長さ4のベクトルに10を掛ける。(10a) この10aの大きさは10*4=40である。このようにベクトルにスカラー(長さ・大きさ)を掛けることをスカラー倍と言う。

②kの数を予め決めておく。(k=1, k=3など)
②未知のデータポイントをベクトル空間上に置く。
③未知のデータポイントから距離が最も近い既存データポイントを取得しクラスを記録する。
 距離の算出には一般的にユークリッド距離が用いられる。(難しいから後回し。)
④③をk回繰り返し、記録したクラスから多数決を行い、未知のデータポイントのクラスを決定する。

k-最近傍法を実際にやってみる。
前提:
sk-learnはfit()で訓練データを学習しpredict()で未知のデータを予測する。
kの指定はKNeighborsClassifierの引数n_neighborsで指定する。

#参考:https://qiita.com/fujin/items/128ed7188f7e7df74f2c

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt #描画ライブラリ

from sklearn.datasets import load_iris # アヤメ(花)のデータセット

iris = load_iris()
X = iris.data
y = iris.target
pd.DataFrame(X, columns=iris.feature_names).head()

f:id:hiyotama:20210303125441p:plain

#学習データ/テストデータ分け
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

# k-NN
list_k = []
list_score = []
for k in range(1, 31):
  knc = KNeighborsClassifier(n_neighbors=k)
  knc.fit(X_train, y_train) #ここで最も近い既存データをk個取得し学習している。

  score = knc.score(X_test, y_test)
  list_k.append(k)
  list_score.append(score)

# 描画
plt.ylim(0.9, 1.0)
plt.xlabel("k")
plt.ylabel("score")
plt.plot(list_k, list_score)

f:id:hiyotama:20210303125543p:plain

アヤメの分類の場合、k値を増やす程精度は落ちていく。

重みつけの種類
uniformとdistanceの2つある。

【GCP】GCPコマンド一覧

コンソールにてgoogle-cloud-sdkのインストール
curl https://sdk.cloud.google.com | bash

gcloud info
アカウントやプロジェクトなど、gcloudの情報が分かる


gcloud config set project プロジェクト名
GCPプロジェクトの切り替え

gcloud auth login
gcloudコマンドをGCPアカウントと紐づける。
ローカルのコンソールで入力したことを、googleアカウント
gcloud auth listで表示されるようになる

gcloud auth list
登録されたアカウントとACTIVEなアカウントの一覧

gcloud compute --project aaaaaproject-171606 ssh --zone asia-northeast1-a instance-1
ログインできた

gcloud config set compute/zone asia-northeast1-a
ゾーンをconfigurationに設定する

gcloud config set account アカウント名(gmail)
アカウントを設定する

MySQL キーの種類

PRIMARY

プライマリーキー制約(主キー制約)
重複する値は設定できない。
NOT NULL必須
各テーブル1つまで
PRIMARYという名前のユニークインデックスが作成されると考えて良い。
ユーザーIDなど。
AUTO_INCREMENTで自動的に数値が加算される。

UNIQUE

ユニークキー制約(一意キー制約)
重複する値は保存できない。
nullでもOK。(nullの重複もOK。)
ユニークインデックスが作成される。

MULTIPLE

プライマリーキーでもユニークキーでもないインデックス。
外部キー制約。FOREIGN KEY。
外部キーを設定すると、キー欄が「MUL」となる。
同じ名前の複数重複が許されている。
参照整合性を保つための仕組み。
(MULTIPLE = 複数)

REFERENCES table名(column名)
で、参照先を設定する。

LaravelでMySQL8を使う場合、認証方式をcaching_sha2_passwordからmysql_native_passwordに変更する必要がある。

qiita.com

SELECT user, host, plugin FROM mysql.user;
を実行した時、pluginが
caching_sha2_password
となっている。
Laravelで使うには、認証方式を
mysql_native_password
に変更する必要がある。

Laravel リソースコントローラー

CRUD(create, read, update, deleteの各アクション完備)
php artisan make:controller HiyokoController - -resource

Controller内に作成されるメソッド
index, create, store($request), show($id), edit($id), update($request, $id), destroy($id)

PUT, PATCH, DELETEを使う際は、フォームに__methodパラメータを設定する必要がある?

作成後にルートを登録する
Route::resource(‘URL’, ‘Controller名’);
これでindex, create, store, show, edit, update, destroy全てのメソッドのルート設定が完了

リソースモデルの指定
php artisan make:controller HiyokoController - -resource - -model=Hiyoko
もともとモデルが作成されている必要がある?

index, create, store, show, edit, update, destroy、指定して使わせないこともできる。
Route::resource(‘hiyokos’, ‘HiyokoController’)->only ([
‘index’,’show’,
]);

Route::resource(‘hiyokos’, ‘HiyokoController’)->except([
‘create’, ‘store’, ‘update’, ‘destroy’
]);

onlyからexceptどちらかで大丈夫だよね。

APIリソースルート
ゲーム制作で使うのは、基本的にAPIでしょう。
どうやってweb.phpではなくapi.phpを使う?ディレクトリ「/API」を作ってその下にAPI用のControllerを置いて、使いたい。

php artisan make:controller API/HiyokoController - - api
GETで表示して入力待ちのようなメソッドは必要ない。(createやeditなど。storeやupdateは必要。)

Route::apiResource(‘hiyokos’, ‘HiyokoController’);

リソースコントローラーのデフォルトルート(index, create, store, show, edit, update, destroy)以外にルートを登録したい時は、
Route::resourceよりも前にRoute::getやRoute::postで設定する。

ルートキャッシュを登録しておくと、ルート登録が100倍早くなる。
ルートキャッシュを行うためには、ルートファイルにクロージャを書かないことが条件。
php artisan route:cache

Laravel MiddleWare

HTTPミドルウェアは、HTTPカーネルのリストで最初に定義されている。
HTTPセッションの読み書き、CSRFトークンの確認など、通信の都度必要な処理が設定される。

ミドルウェア指定方法

1.ルートファイルで指定

web.phpやapi.php

Route::get(‘URL’, ‘HiyokoController@メソッド名’)->middleware(‘ミドルウェア名’);

2.ControllerのConstructerで指定
class HiyokoController extends Controller
{
	public function __construct()
	{
		$this->middleware(‘ミドルウェア名’);
	}

}

HiyokoController.php

Controllerにて、クロージャを使ったミドルウェアの登録

ミドルウェアをミドルウェアディレクトリに作成するまでもない時に便利。

$this->middleware(function ($request, $next) {
//処理
return $next($request);
});

ミドルウェアの引数$nextと$request

Modelデータの保存方法 createとfill

モデル::create
インスタンス化、fill、save全てやってくれる。
$flight = Flight::create([‘name’ => ‘飛行’]);

モデル:fill
インスタンスをnewする必要がある。
saveも自分で実行する必要がある。
$flight = new Flight();
$flight->fill([‘name’ => ‘飛行’]);
$user->save();

saveをあとで実行したい場合はfill
それ以外はcreate

Laravelのchunkとcursor DBデータを小分けにして取得

chunk/cursor
大量のデータをgetなど処理する場合に使う。
メモリの使用量を少なくする。

chunk(塊)
一定量ずつ処理

chunk(10, function ($people){
    foreach($people as $person) {
        //処理の実行
    }
}

10件ずつ取得して処理を実行。
10件終わったら次の10件を取得して処理の実行。

Laravel Eloquentで大量のデータを取得する場合 - Qiita


cursor(カーソル)
1クエリずつ処理。

Laravel(Eloquent): chunk() vs cursor() - Qiita

大量のデータを扱う場合、allよりはマシだがメモリの使用量は大きい。

ActiveRecord

データベースからデータを読み出すアプローチをするデザインパターン。
RailsやLaravelなどのFrameworkで使われている。
MVCのModelで使われる。
データベースのテーブル1行が1つのモデルクラスにラップされる。
シンプルだが複雑な設計に弱い。

Active Record - Wikipedia

Laravel Modelクラスでよく設定されるフィールド変数 $tableオーバーライドはよく使う

$table:DBのテーブル名。
通常デフォルトではテーブル名はモデル名の複数形だが、
$tableをオーバーライドすることで別名を付けることができる。
$connection:外部DBへの接続。データベース名を指定。
[Laravel]Laravelで別々のDB(MySQL)に接続させる方法 - Qiita
$fillable:必ず埋める必要のある項目。埋めることのできる項目。
$guarded:更新してはいけない項目