機械学習から始めるなでしこ3 入門(番外編)¶
なでしこ3 は日本語で書くプログラミング言語です。助詞(「を」「で」「と」)で引数の役割を表し、「iris.csv」を開いてCSV取得 のように手順がそのまま文になります。本シリーズでは、Python 版と同じ題材の機械学習のアルゴリズムを TDD で自作し、なでしこ3 の書き方を学びます。
なでしこ3 版は、14 言語で完成したシリーズの番外編です。処理系には Go で書かれた nadesiko3go(コマンド名 gonako)を使います。2 つの軸で対比します。1 つは Python 版 で、同じ手順を英語の識別子と日本語の文で書き比べます。2 つめは Haskell 版・Go 版 で、機械学習のライブラリが無い言語という点が同じです。なでしこ3 版はさらに進んで、線形代数もテストの道具も自作します。
特徴¶
- 日本語で書く: 関数名も変数名も日本語にする。
●(特徴量を)ルール判定とはのように、機械学習の用語がそのままコードに現れる - 助詞が引数の役割を示す:
「名前」で実際と期待が一致確認のように、引数の順番ではなく助詞で役割が決まる - 識別子に助詞を入れられない:
ルールで判定は「ルール」の定義に割られる。名前は助詞を含まない名詞のつながりにし、変数名にはカタカナと漢字を使う - テストの道具を自作する: テスティングフレームワークが無く、
ASSERT等は最初の失敗で止まる。失敗を数えて最後に報告するテスト補助を作り、その道具もテストする - 残る守りはテストだけ: 型の検査もカバレッジも無く、lint は未定義の名前を半分しか捕まえない。名前を
終了にするとプログラムが黙って終わるので、テストが最後まで走ったことも確かめる =はゆるい比較: JavaScript の==と同じで0 = 「」が真になる。型まで比べる===を使い分ける
ほかの版との違い¶
- Notebook による探索と可視化の節は設けません。グラフは Python 版 と Kotlin 版 の可視化の節を参照してください
- 総合演習(付録 A)の解答例は作りません。演習問題は言語に依存しないので、Python 版の付録 A の問題になでしこ3 で取り組んでください
- 機械学習のライブラリも行列の命令もありません。 決定木・回帰・ロジスティック回帰・ランダムフォレスト・K-means・主成分分析に加えて、正規方程式を解く連立一次方程式と固有値分解も自作します。「ライブラリへの置き換え」の節は「ほかの言語版の数値との突き合わせ」の節に差し替えます(ADR 015)
- カバレッジを測る仕組みがありません。 シリーズで唯一、カバレッジを数字で示せない版です
- 乱数は
java.util.Randomと同じ線形合同法を自作します。乱数にシードを渡す口が無いためです。数値は float64 だけなので、PHP 版よりさらに細かく掛け算を分けます - CSV は
CSV取得を使いますが、BOM と空行は取り除かれません。数字だけのセルは自動で数値になります - 第 15 章の予測 API は、JSON の標準入出力でやりとりするコマンドとして作ります。 HTTP サーバーの命令が無いためです
開発環境¶
| ツール | 用途 |
|---|---|
nadesiko3go(gonako)3.8.8 |
言語・処理系(タグ 3.8.8 の疑似版で固定) |
Go 1.26(GOTOOLCHAIN=go1.26.8) |
gonako の導入 |
自作のテスト補助(test/helper.nako3) |
テスト(検査の件数と失敗を数え、最後に報告する) |
自作の関数の網羅(tools/function_coverage.nako3) |
カバレッジの代わり(テストから届かない関数を見つける) |
gonako lint |
文法の検査(1 回に 1 ファイル) |
gonako format |
整形(検査用のモードが無いので、差分で判定する) |
Nix の環境(nix develop .#nadesiko3)は Go 1.25.5 です。nadesiko3go は Go 1.26 を要求するので、導入のスクリプトが GOTOOLCHAIN で 1.26.8 のツールチェーンに切り替えます。
ライブラリ¶
外部のライブラリは使いません。
| 自作するもの | 用途 | 初出 |
|---|---|---|
| テスト補助 | テスト | 第 1 章 |
| 小数点以下の桁をそろえる表示 | 報告の数値(書式指定の命令が無いため) | 第 1 章 |
| 線形合同法 | 乱数(訓練データとテストデータの分割) | 第 2 章 |
| 連立一次方程式・固有値分解 | 線形代数(正規方程式・主成分分析) | 第 7 章 |
選定の理由と、章ごとの方針は ADR 015 を参照してください。
サンプルコード¶
サンプルコードは apps/nadesiko3/ にあります。学習データの配置方法は 第 1 章 の「題材とデータ」を参照してください。
nix develop .#nadesiko3
cd apps/nadesiko3
./tools/install-gonako.sh
./tools/check.sh
./bin/gonako main.nako3 chapter01
リポジトリのルートで npx gulp apps:check:nadesiko3 を実行すると、CI と同じ順(文法・整形・テスト・関数の網羅)でまとめて検査できます。
章構成¶
全 15 章を公開しています。実データ(配布データ)での実測は、どの章もまだ行っていません。
第 1 部: 機械学習と TDD の基本サイクル¶
| 章 | テーマ | 状態 |
|---|---|---|
| 第 1 章 | 機械学習とはじめてのテスト | 公開済み(実データでの実測は未確認) |
| 第 2 章 | データの前処理と三角測量 | 公開済み(実データでの実測は未確認) |
| 第 3 章 | 決定木による分類と明白な実装 | 公開済み(実データでの実測は未確認) |
第 2 部: 開発環境と自動化¶
| 章 | テーマ | 状態 |
|---|---|---|
| 第 4 章 | バージョン管理とデータ管理 | 公開済み |
| 第 5 章 | パッケージ管理と静的解析 | 公開済み |
| 第 6 章 | タスクランナーと CI/CD | 公開済み |
第 3 部: 回帰と実践的な前処理¶
| 章 | テーマ | 状態 |
|---|---|---|
| 第 7 章 | 線形回帰による数値予測 | 公開済み(実データでの実測は未確認) |
| 第 8 章 | 実践的な分類と前処理パイプライン | 公開済み(実データでの実測は未確認) |
| 第 9 章 | 特徴量エンジニアリング | 公開済み(実データでの実測は未確認) |
第 4 部: モデルの改善と評価¶
| 章 | テーマ | 状態 |
|---|---|---|
| 第 10 章 | ロジスティック回帰とアンサンブル学習 | 公開済み(実データでの実測は未確認) |
| 第 11 章 | 評価指標と交差検証 | 公開済み(実データでの実測は未確認) |
| 第 12 章 | 正則化とモデル選択 | 公開済み(実データでの実測は未確認) |
第 5 部: 教師なし学習と実運用¶
| 章 | テーマ | 状態 |
|---|---|---|
| 第 13 章 | 主成分分析による次元削減 | 公開済み(実データでの実測は未確認) |
| 第 14 章 | K-means によるクラスタリング | 公開済み(実データでの実測は未確認) |
| 第 15 章 | 機械学習 API とモジュール設計 | 公開済み(実データでの実測は未確認) |
付録¶
総合演習(Bank)の解答例は Python 版のみです。演習問題は言語に依存しないので、Python 版の付録 A の問題になでしこ3 で取り組んでください。