Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Apache Commons Math を使って 機械学習をやってみた / Enjoy Machine Learning using Apache Commons Math

Apache Commons Math を使って 機械学習をやってみた / Enjoy Machine Learning using Apache Commons Math

mackey0225

June 04, 2023
Tweet

More Decks by mackey0225

Other Decks in Programming

Transcript

  1. Apache Commons Math を使って
    機械学習をやってみた
    2023-06-04 JJUG CCC 2023 Spring
    BABY JOB 株式会社 浅野 正貴(@mackey0225)

    View Slide

  2. Apache Commons Math を使って 機械学習をやってみた
    目次
    ❏ 自己紹介
    ❏ 背景と感想
    ❏ Java で 数学をするには
    ❏ とりあえず、やってみた
    ❏ まとめ
    2

    View Slide

  3. Apache Commons Math を使って 機械学習をやってみた
    自己紹介
    名前:浅野 正貴
    所属:BABY JOB 株式会社(2022-06 入社)
    役割:Javaエンジニア
    Twitter: @mackey0225 / GitHub: @mackey0225
    対面での発表は人生初!緊張!最高!
    3

    View Slide

  4. Apache Commons Math を使って 機械学習をやってみた 4
    注意
    ● 内容は、
    ○ 実務や業務での結果ではございません!
    ○ 個人の活動の範囲での発表です!
    ○ つまり、趣味です!
    ハードルは可能な限り下げてお聞きください!

    View Slide

  5. 本題の前に

    View Slide

  6. Apache Commons Math を使って 機械学習をやってみた
    背景
    ● 昨今、機械学習 や AI が世間で賑わっている
    ● 実装の例は Python や R が多く、Java での実装例は少ない
    ● Java だったら、どうなるのかが気になる
    ○ ライブラリはどんなものがあるか?
    ○ 実装時の難易度やコード量はどうか?
    ● じゃあ、やってみよう!
    6

    View Slide

  7. Apache Commons Math を使って 機械学習をやってみた
    やってみた感想
    ● コード量は Python に比べると多い
    ○ ライブラリの充実さ が 圧倒的に強い
    ● でも、Java だからといって扱いづらいとは感じなかった
    ○ データを扱うクラスの作成 と データの投入 さえ できれば OK
    ○ 可読性 も そこまで悪くない
    ○ データを定義するので、個人的には良かった
    目的に応じていれば、手段の一つとしてもアリかも。。。
    7

    View Slide

  8. 本題の前にもう少し

    View Slide

  9. Apache Commons Math を使って 機械学習をやってみた
    そもそも、Java で 数学 を扱うには
    ● Mathクラス(java.lang.math)
    ● Apache Commons Math
    ● Apache Commons Numbers
    ● Apache Commons Geometry
    ● DeepLearning4J
    ● MOA
    ● Weka      ...and more.
    9

    View Slide

  10. Apache Commons Math を使って 機械学習をやってみた
    そもそも、Java で 数学 を扱うには
    ● Mathクラス(java.lang.math)
    ● Apache Commons Math
    ● Apache Commons Numbers
    ● Apache Commons Geometry
    ● DeepLearning4J
    ● MOA
    ● Weka      ...and more.
    10

    View Slide

  11. Apache Commons Math を使って 機械学習をやってみた
    Apache Commons Math とは
    ● Apache Software Foundation によって 開発メンテ
    ● 数値計算だけでなく、行列演算や確率・統計の機能も提供
    ● 加えて、以下などの機能も提供
    ○ クラスタリング(教師なし学習)
    ○ 数理最適化
    ○ カーブフィッティングや線形回帰
    ● 現在、バージョン 4.0 のベータ版が提供
    ○ 公式(3.6.1)は最終更新が2016年で、現在サポートされていない😥
    11

    View Slide

  12. Apache Commons Math を使って 機械学習をやってみた
    Apache Commons Math とは
    ● Apache Software Foundation によって 開発メンテ
    ● 数値計算だけでなく、行列演算や確率・統計の機能も提供
    ● 加えて、以下などの機能も提供
    ○ クラスタリング(教師なし学習)
    ○ 数理最適化
    ○ カーブフィッティングや線形回帰
    ● 現在、バージョン 4.0 のベータ版が提供
    ○ 公式(3.6.1)は最終更新が2016年で、現在サポートされていない😥
    12

    View Slide

  13. Apache Commons Math を使って 機械学習をやってみた
    機械学習 について 予備知識
    一言でいうと、
    大量のデータから学習し、規則性やパターンを見出す方法
    13

    View Slide

  14. Apache Commons Math を使って 機械学習をやってみた
    機械学習 について 予備知識
    大別すると、
    1. 教師あり学習
    ● 入出力データを与え、未知の入力に対して出力を予測させる
    2. 教師なし学習
    ● データから、背景にあるパターンや規則性を見つける
    3. 強化学習
    ● データを用いず、システム自ら試行錯誤し学習する
    14

    View Slide

  15. ここからが本題

    View Slide

  16. Apache Commons Math を使って 機械学習をやってみた
    今回やったこと
    アヤメの分類(Iris Dataset)を対象データとして以下を実施
    ● データセットの取得
    ● データの統計情報取得
    ○ 各データの最大値や最小値などの簡単な計算
    ● k-means++法 による クラスタリング
    ○ データの格納
    ○ クラスタリング結果の出力
    ○ 散布図の出力
    16

    View Slide

  17. Apache Commons Math を使って 機械学習をやってみた
    「アヤメの分類(Iris Dataset)」とは
    ● 花の アヤメ についてのデータセット(n=150)
    ● 機械学習でよく使用される
    ○ いわゆる、Hello World に近い
    ● データのレイアウト
    ○ がく片の長さ(cm)[sepal_length]
    ○ がく片の幅(cm)[sepal_width]
    ○ 花びらの長さ(cm)[petal_length]
    ○ 花びらの幅(cm)[petal_width]
    ○ 品種(Setosa、Versicolour、Virginica)
    17

    View Slide

  18. Apache Commons Math を使って 機械学習をやってみた
    「k-means++法」について
    ● 教師なし学習 の 一種
    ● データ・点の集まりに対して、k個のクラスタに分けるアルゴリズム
    ● k-means法 の 改良版
    ○ アルゴリズムのイメージは「おまけ」に記載
    18

    View Slide

  19. 実際のコード
    GitHub に 公開していますので、ご参照ください
    https://github.com/mackey0225/20230604-jjug_ccc_2023_spring_math

    View Slide

  20. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(データセットからの取得)
    private enum IrisClassification {
    IrisSetosa(0, "Iris-setosa"),
    IrisVersicolour(1, "Iris-versicolor"),
    IrisVirginica(2, "Iris-virginica");
    private final int id;
    private final String dataValue;
    IrisClassification(int id, String dataValue) {
    this.id = id;
    this.dataValue = dataValue;
    }
    static IrisClassification getByDataValue(String dataValue) {
    return Arrays.stream(IrisClassification.values())
    .filter(ic -> ic.dataValue.equals(dataValue))
    .findFirst()
    .orElse(null);
    }
    }
    private record IrisRecord(
    double sepalLength,
    double sepalWidth,
    double petalLength,
    double petalWidth,
    IrisClassification irisClassification
    ) {
    }
    20

    View Slide

  21. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(データセットからの取得)
    private enum IrisClassification {
    IrisSetosa(0, "Iris-setosa"),
    IrisVersicolour(1, "Iris-versicolor"),
    IrisVirginica(2, "Iris-virginica");
    private final int id;
    private final String dataValue;
    IrisClassification(int id, String dataValue) {
    this.id = id;
    this.dataValue = dataValue;
    }
    static IrisClassification getByDataValue(String dataValue) {
    return Arrays.stream(IrisClassification.values())
    .filter(ic -> ic.dataValue.equals(dataValue))
    .findFirst()
    .orElse(null);
    }
    }
    private record IrisRecord(
    double sepalLength,
    double sepalWidth,
    double petalLength,
    double petalWidth,
    IrisClassification irisClassification
    ) {
    }
    データセットの1行を表す
    recordクラス
    21

    View Slide

  22. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(データセットからの取得)
    private enum IrisClassification {
    IrisSetosa(0, "Iris-setosa"),
    IrisVersicolour(1, "Iris-versicolor"),
    IrisVirginica(2, "Iris-virginica");
    private final int id;
    private final String dataValue;
    IrisClassification(int id, String dataValue) {
    this.id = id;
    this.dataValue = dataValue;
    }
    static IrisClassification getByDataValue(String dataValue) {
    return Arrays.stream(IrisClassification.values())
    .filter(ic -> ic.dataValue.equals(dataValue))
    .findFirst()
    .orElse(null);
    }
    }
    private record IrisRecord(
    double sepalLength,
    double sepalWidth,
    double petalLength,
    double petalWidth,
    IrisClassification irisClassification
    ) {
    }
    品種を扱うenumクラス
    22

    View Slide

  23. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(データセットからの取得)
    static List getData() {
    String dataPath = "./src/main/resources/data/iris/iris.data";
    List target = new ArrayList<>();
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(dataPath),
    StandardCharsets.UTF_8))) {
    String line;
    while ((line = reader.readLine()) != null) {
    String[] data = line.split(",");
    target.add(
    new IrisRecord(
    Double.parseDouble(data[0]),
    Double.parseDouble(data[1]),
    Double.parseDouble(data[2]),
    Double.parseDouble(data[3]),
    IrisClassification.getByDataValue(data[4])
    )
    );
    }
    } catch (IOException e) {
    System.out.println("ファイル読み込みに失敗
    ");
    }
    return target;
    } 23

    View Slide

  24. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(データセットからの取得)
    static List getData() {
    String dataPath = "./src/main/resources/data/iris/iris.data";
    List target = new ArrayList<>();
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(dataPath),
    StandardCharsets.UTF_8))) {
    String line;
    while ((line = reader.readLine()) != null) {
    String[] data = line.split(",");
    target.add(
    new IrisRecord(
    Double.parseDouble(data[0]),
    Double.parseDouble(data[1]),
    Double.parseDouble(data[2]),
    Double.parseDouble(data[3]),
    IrisClassification.getByDataValue(data[4])
    )
    );
    }
    } catch (IOException e) {
    System.out.println("ファイル読み込みに失敗
    ");
    }
    return target;
    }
    データセット(CSV)から、
    record の List にする
    24

    View Slide

  25. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(統計情報の取得)
    public class Iris {
    public static void main(String[] args) throws IOException {
    List data = getData();
    // 統計情報
    MultivariateSummaryStatistics stat = new MultivariateSummaryStatistics(4, false);
    for (IrisRecord row : data) {
    double[] row_data = {row.sepalLength, row.sepalWidth, row.petalLength, row.petalWidth};
    stat.addValue(row_data);
    }
    System.out.println("がく片の長さ(cm)の平均 : " + stat.getMean()[0]);
    // => がく片の長さ(cm)の平均 : 5.843333333333333
    System.out.println("花びらの長さ(cm)の最大と最小 : 最大:" + stat.getMax()[2] + " / 最小:" + stat.getMin()[2]);
    // => 花びらの長さ(cm)の最大と最小 : 最大:6.9 / 最小:1.0
    System.out.println("花びらの幅(cm)の標準偏差 : " + stat.getStandardDeviation()[3]);
    // => 花びらの幅(cm)の標準偏差 : 0.7606126185881713
    25

    View Slide

  26. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(統計情報の取得)
    public class Iris {
    public static void main(String[] args) throws IOException {
    List data = getData();
    // 統計情報
    MultivariateSummaryStatistics stat = new MultivariateSummaryStatistics(4, false);
    for (IrisRecord row : data) {
    double[] row_data = {row.sepalLength, row.sepalWidth, row.petalLength, row.petalWidth};
    stat.addValue(row_data);
    }
    System.out.println("がく片の長さ(cm)の平均 : " + stat.getMean()[0]);
    // => がく片の長さ(cm)の平均 : 5.843333333333333
    System.out.println("花びらの長さ(cm)の最大と最小 : 最大:" + stat.getMax()[2] + " / 最小:" + stat.getMin()[2]);
    // => 花びらの長さ(cm)の最大と最小 : 最大:6.9 / 最小:1.0
    System.out.println("花びらの幅(cm)の標準偏差 : " + stat.getStandardDeviation()[3]);
    // => 花びらの幅(cm)の標準偏差 : 0.7606126185881713
    // 統計情報
    MultivariateSummaryStatistics stat
    = new MultivariateSummaryStatistics(4, false);
    for (IrisRecord row : data) {
    double[] row_data
    = {row.sepalLength, row.sepalWidth, row.petalLength, row.petalWidth};
    stat.addValue(row_data);
    }
    26

    View Slide

  27. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(統計情報の取得)
    public class Iris {
    public static void main(String[] args) throws IOException {
    List data = getData();
    // 統計情報
    MultivariateSummaryStatistics stat = new MultivariateSummaryStatistics(4, false);
    for (IrisRecord row : data) {
    double[] row_data = {row.sepalLength, row.sepalWidth, row.petalLength, row.petalWidth};
    stat.addValue(row_data);
    }
    System.out.println("がく片の長さ(cm)の平均 : " + stat.getMean()[0]);
    // => がく片の長さ(cm)の平均 : 5.843333333333333
    System.out.println("花びらの長さ(cm)の最大と最小 : 最大:" + stat.getMax()[2] + " / 最小:" + stat.getMin()[2]);
    // => 花びらの長さ(cm)の最大と最小 : 最大:6.9 / 最小:1.0
    System.out.println("花びらの幅(cm)の標準偏差 : " + stat.getStandardDeviation()[3]);
    // => 花びらの幅(cm)の標準偏差 : 0.7606126185881713
    // 統計情報
    MultivariateSummaryStatistics stat
    = new MultivariateSummaryStatistics(4, false);
    for (IrisRecord row : data) {
    double[] row_data
    = {row.sepalLength, row.sepalWidth, row.petalLength, row.petalWidth};
    stat.addValue(row_data);
    }
    27
    ここの引数の
    - 第1引数 は データ列数
    - 第2引数 は 共分散の計算方法の設定
    - true → 不偏分散とする
    - false → 母集団の分散とする

    View Slide

  28. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(統計情報の取得)
    public class Iris {
    public static void main(String[] args) throws IOException {
    List data = getData();
    // 統計情報
    MultivariateSummaryStatistics stat = new MultivariateSummaryStatistics(4, false);
    for (IrisRecord row : data) {
    double[] row_data = {row.sepalLength, row.sepalWidth, row.petalLength, row.petalWidth};
    stat.addValue(row_data);
    }
    System.out.println("がく片の長さ(cm)の平均 : " + stat.getMean()[0]);
    // => がく片の長さ(cm)の平均 : 5.843333333333333
    System.out.println("花びらの長さ(cm)の最大と最小 : 最大:" + stat.getMax()[2] + " / 最小:" + stat.getMin()[2]);
    // => 花びらの長さ(cm)の最大と最小 : 最大:6.9 / 最小:1.0
    System.out.println("花びらの幅(cm)の標準偏差 : " + stat.getStandardDeviation()[3]);
    // => 花びらの幅(cm)の標準偏差 : 0.7606126185881713
    System.out.println("がく片の長さ(cm)の平均 : " + stat.getMean()[0]);
    +/ +> がく片の長さ(cm)の平均 : 5.843333333333333
    System.out.println("花びらの長さ(cm)の最大と最小 : 最大:" + stat.getMax()[2] +
    " / 最小:" + stat.getMin()[2]);
    +/ +> 花びらの長さ(cm)の最大と最小 : 最大:6.9 / 最小:1.0
    System.out.println("花びらの幅(cm)の標準偏差 : " +
    stat.getStandardDeviation()[3]);
    +/ +> 花びらの幅(cm)の標準偏差 : 0.7606126185881713
    28

    View Slide

  29. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(k-means++)
    +/ k-means++法 によるクラスタリング
    List clusterInput = new ArrayList+>();
    for (IrisRecord record : data) {
    clusterInput.add(new IrisDataPoint(record));
    }
    KMeansPlusPlusClusterer clusterer = new KMeansPlusPlusClusterer+>(3, 10000);
    List clusterResults = clusterer.cluster(clusterInput);
    +/ 分類したクラスターの結果
    for (int i = 0; i < clusterResults.size(); i++) {
    System.out.println("Cluster " + i);
    for (IrisDataPoint point : clusterResults.get(i).getPoints())
    System.out.println(point.getPointInfo());
    System.out.println();
    }
    29

    View Slide

  30. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(k-means++)
    +/ k-means++法 によるクラスタリング
    List clusterInput = new ArrayList+>();
    for (IrisRecord record : data) {
    clusterInput.add(new IrisDataPoint(record));
    }
    KMeansPlusPlusClusterer clusterer = new KMeansPlusPlusClusterer+>(3, 10000);
    List clusterResults = clusterer.cluster(clusterInput);
    +/ 分類したクラスターの結果
    for (int i = 0; i < clusterResults.size(); i++) {
    System.out.println("Cluster " + i);
    for (IrisDataPoint point : clusterResults.get(i).getPoints())
    System.out.println(point.getPointInfo());
    System.out.println();
    }
    public static class IrisDataPoint implements Clusterable {
    private final double[] points;
    private final IrisClassification irisClassification;
    public IrisDataPoint(IrisRecord record) {
    this.points = new double[]{
    record.sepalLength,
    record.sepalWidth,
    record.petalLength,
    record.petalWidth
    };
    this.irisClassification = record.irisClassification;
    }
    public double[] getPoint() {
    return points;
    }
    public String getPointInfo() {
    return Arrays.toString(this.getPoint()) + ":" + this.irisClassification.dataValue;
    }
    }
    30

    View Slide

  31. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(k-means++)
    +/ k-means++法 によるクラスタリング
    List clusterInput = new ArrayList+>();
    for (IrisRecord record : data) {
    clusterInput.add(new IrisDataPoint(record));
    }
    KMeansPlusPlusClusterer clusterer = new KMeansPlusPlusClusterer+>(3, 10000);
    List clusterResults = clusterer.cluster(clusterInput);
    +/ 分類したクラスターの結果
    for (int i = 0; i < clusterResults.size(); i++) {
    System.out.println("Cluster " + i);
    for (IrisDataPoint point : clusterResults.get(i).getPoints())
    System.out.println(point.getPointInfo());
    System.out.println();
    }
    31

    View Slide

  32. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(k-means++)
    +/ k-means++法 によるクラスタリング
    List clusterInput = new ArrayList+>();
    for (IrisRecord record : data) {
    clusterInput.add(new IrisDataPoint(record));
    }
    KMeansPlusPlusClusterer clusterer = new KMeansPlusPlusClusterer+>(3, 10000);
    List clusterResults = clusterer.cluster(clusterInput);
    +/ 分類したクラスターの結果
    for (int i = 0; i < clusterResults.size(); i++) {
    System.out.println("Cluster " + i);
    for (IrisDataPoint point : clusterResults.get(i).getPoints())
    System.out.println(point.getPointInfo());
    System.out.println();
    }
    +/ k-means++法 によるクラスタリング
    List clusterInput = new ArrayList+>();
    for (IrisRecord record : data) {
    clusterInput.add(new IrisDataPoint(record));
    }
    KMeansPlusPlusClusterer clusterer
    = new KMeansPlusPlusClusterer+>(3, 10000);
    List clusterResults
    = clusterer.cluster(clusterInput);
    32

    View Slide

  33. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(k-means++)
    +/ k-means++法 によるクラスタリング
    List clusterInput = new ArrayList+>();
    for (IrisRecord record : data) {
    clusterInput.add(new IrisDataPoint(record));
    }
    KMeansPlusPlusClusterer clusterer = new KMeansPlusPlusClusterer+>(3, 10000);
    List clusterResults = clusterer.cluster(clusterInput);
    +/ 分類したクラスターの結果
    for (int i = 0; i < clusterResults.size(); i++) {
    System.out.println("Cluster " + i);
    for (IrisDataPoint point : clusterResults.get(i).getPoints())
    System.out.println(point.getPointInfo());
    System.out.println();
    }
    +/ k-means++法 によるクラスタリング
    List clusterInput = new ArrayList+>();
    for (IrisRecord record : data) {
    clusterInput.add(new IrisDataPoint(record));
    }
    KMeansPlusPlusClusterer clusterer
    = new KMeansPlusPlusClusterer+>(3, 10000);
    List clusterResults
    = clusterer.cluster(clusterInput);
    33
    ここの引数の
    - 3 は クラスターの数(つまり、k のこと)
    - 10000 は 最大試行回数

    View Slide

  34. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(k-means++)
    +/ k-means++法 によるクラスタリング
    List clusterInput = new ArrayList+>();
    for (IrisRecord record : data) {
    clusterInput.add(new IrisDataPoint(record));
    }
    KMeansPlusPlusClusterer clusterer = new KMeansPlusPlusClusterer+>(3, 10000);
    List clusterResults = clusterer.cluster(clusterInput);
    +/ 分類したクラスターの結果
    for (int i = 0; i < clusterResults.size(); i++) {
    System.out.println("Cluster " + i);
    for (IrisDataPoint point : clusterResults.get(i).getPoints())
    System.out.println(point.getPointInfo());
    System.out.println();
    }
    +/ 分類したクラスターの結果
    for (int i = 0; i < clusterResults.size(); i++) {
    System.out.println("Cluster " + i);
    for (IrisDataPoint point : clusterResults.get(i).getPoints())
    System.out.println(point.getPointInfo());
    System.out.println();
    }
    34

    View Slide

  35. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(k-means++)
    Cluster 0
    [5.1, 3.5, 1.4, 0.2]:Iris-setosa
    [4.9, 3.0, 1.4, 0.2]:Iris-setosa
    [4.7, 3.2, 1.3, 0.2]:Iris-setosa
    ・・・略
    [4.6, 3.2, 1.4, 0.2]:Iris-setosa
    [5.3, 3.7, 1.5, 0.2]:Iris-setosa
    [5.0, 3.3, 1.4, 0.2]:Iris-setosa
    Cluster 2
    [6.9, 3.1, 4.9, 1.5]:Iris-versicolor
    [6.7, 3.0, 5.0, 1.7]:Iris-versicolor
    [6.3, 3.3, 6.0, 2.5]:Iris-virginica
    [7.1, 3.0, 5.9, 2.1]:Iris-virginica
    [6.3, 2.9, 5.6, 1.8]:Iris-virginica
    ・・・略
    [6.7, 3.0, 5.2, 2.3]:Iris-virginica
    [6.5, 3.0, 5.2, 2.0]:Iris-virginica
    [6.2, 3.4, 5.4, 2.3]:Iris-virginica
    Cluster 1
    [7.0, 3.2, 4.7, 1.4]:Iris-versicolor
    [6.4, 3.2, 4.5, 1.5]:Iris-versicolor
    [5.5, 2.3, 4.0, 1.3]:Iris-versicolor
    ・・・略
    [6.2, 2.9, 4.3, 1.3]:Iris-versicolor
    [5.1, 2.5, 3.0, 1.1]:Iris-versicolor
    [5.7, 2.8, 4.1, 1.3]:Iris-versicolor
    [5.8, 2.7, 5.1, 1.9]:Iris-virginica
    [4.9, 2.5, 4.5, 1.7]:Iris-virginica
    [5.7, 2.5, 5.0, 2.0]:Iris-virginica
    ・・・略
    [5.8, 2.7, 5.1, 1.9]:Iris-virginica
    [6.3, 2.5, 5.0, 1.9]:Iris-virginica
    [5.9, 3.0, 5.1, 1.8]:Iris-virginica
    35

    View Slide

  36. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(k-means++)
    Cluster 0
    [5.1, 3.5, 1.4, 0.2]:Iris-setosa
    [4.9, 3.0, 1.4, 0.2]:Iris-setosa
    [4.7, 3.2, 1.3, 0.2]:Iris-setosa
    ・・・略
    [4.6, 3.2, 1.4, 0.2]:Iris-setosa
    [5.3, 3.7, 1.5, 0.2]:Iris-setosa
    [5.0, 3.3, 1.4, 0.2]:Iris-setosa
    Cluster 2
    [6.9, 3.1, 4.9, 1.5]:Iris-versicolor
    [6.7, 3.0, 5.0, 1.7]:Iris-versicolor
    [6.3, 3.3, 6.0, 2.5]:Iris-virginica
    [7.1, 3.0, 5.9, 2.1]:Iris-virginica
    [6.3, 2.9, 5.6, 1.8]:Iris-virginica
    ・・・略
    [6.7, 3.0, 5.2, 2.3]:Iris-virginica
    [6.5, 3.0, 5.2, 2.0]:Iris-virginica
    [6.2, 3.4, 5.4, 2.3]:Iris-virginica
    Cluster 1
    [7.0, 3.2, 4.7, 1.4]:Iris-versicolor
    [6.4, 3.2, 4.5, 1.5]:Iris-versicolor
    [5.5, 2.3, 4.0, 1.3]:Iris-versicolor
    ・・・略
    [6.2, 2.9, 4.3, 1.3]:Iris-versicolor
    [5.1, 2.5, 3.0, 1.1]:Iris-versicolor
    [5.7, 2.8, 4.1, 1.3]:Iris-versicolor
    [5.8, 2.7, 5.1, 1.9]:Iris-virginica
    [4.9, 2.5, 4.5, 1.7]:Iris-virginica
    [5.7, 2.5, 5.0, 2.0]:Iris-virginica
    ・・・略
    [5.8, 2.7, 5.1, 1.9]:Iris-virginica
    [6.3, 2.5, 5.0, 1.9]:Iris-virginica
    [5.9, 3.0, 5.1, 1.8]:Iris-virginica
    クラスタ0 に分類された 50件 のすべてが setosa
    だった。
    →分類はうまくいっている
    36

    View Slide

  37. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(k-means++)
    Cluster 0
    [5.1, 3.5, 1.4, 0.2]:Iris-setosa
    [4.9, 3.0, 1.4, 0.2]:Iris-setosa
    [4.7, 3.2, 1.3, 0.2]:Iris-setosa
    ・・・略
    [4.6, 3.2, 1.4, 0.2]:Iris-setosa
    [5.3, 3.7, 1.5, 0.2]:Iris-setosa
    [5.0, 3.3, 1.4, 0.2]:Iris-setosa
    Cluster 2
    [6.9, 3.1, 4.9, 1.5]:Iris-versicolor
    [6.7, 3.0, 5.0, 1.7]:Iris-versicolor
    [6.3, 3.3, 6.0, 2.5]:Iris-virginica
    [7.1, 3.0, 5.9, 2.1]:Iris-virginica
    [6.3, 2.9, 5.6, 1.8]:Iris-virginica
    ・・・略
    [6.7, 3.0, 5.2, 2.3]:Iris-virginica
    [6.5, 3.0, 5.2, 2.0]:Iris-virginica
    [6.2, 3.4, 5.4, 2.3]:Iris-virginica
    Cluster 1
    [7.0, 3.2, 4.7, 1.4]:Iris-versicolor
    [6.4, 3.2, 4.5, 1.5]:Iris-versicolor
    [5.5, 2.3, 4.0, 1.3]:Iris-versicolor
    ・・・略
    [6.2, 2.9, 4.3, 1.3]:Iris-versicolor
    [5.1, 2.5, 3.0, 1.1]:Iris-versicolor
    [5.7, 2.8, 4.1, 1.3]:Iris-versicolor
    [5.8, 2.7, 5.1, 1.9]:Iris-virginica
    [4.9, 2.5, 4.5, 1.7]:Iris-virginica
    [5.7, 2.5, 5.0, 2.0]:Iris-virginica
    ・・・略
    [5.8, 2.7, 5.1, 1.9]:Iris-virginica
    [6.3, 2.5, 5.0, 1.9]:Iris-virginica
    [5.9, 3.0, 5.1, 1.8]:Iris-virginica
    クラスタ1 に分類された 62件 の内訳が、
     48件:versicolor
     14件:virginica
    37

    View Slide

  38. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(k-means++)
    Cluster 0
    [5.1, 3.5, 1.4, 0.2]:Iris-setosa
    [4.9, 3.0, 1.4, 0.2]:Iris-setosa
    [4.7, 3.2, 1.3, 0.2]:Iris-setosa
    ・・・略
    [4.6, 3.2, 1.4, 0.2]:Iris-setosa
    [5.3, 3.7, 1.5, 0.2]:Iris-setosa
    [5.0, 3.3, 1.4, 0.2]:Iris-setosa
    Cluster 2
    [6.9, 3.1, 4.9, 1.5]:Iris-versicolor
    [6.7, 3.0, 5.0, 1.7]:Iris-versicolor
    [6.3, 3.3, 6.0, 2.5]:Iris-virginica
    [7.1, 3.0, 5.9, 2.1]:Iris-virginica
    [6.3, 2.9, 5.6, 1.8]:Iris-virginica
    ・・・略
    [6.7, 3.0, 5.2, 2.3]:Iris-virginica
    [6.5, 3.0, 5.2, 2.0]:Iris-virginica
    [6.2, 3.4, 5.4, 2.3]:Iris-virginica
    Cluster 1
    [7.0, 3.2, 4.7, 1.4]:Iris-versicolor
    [6.4, 3.2, 4.5, 1.5]:Iris-versicolor
    [5.5, 2.3, 4.0, 1.3]:Iris-versicolor
    ・・・略
    [6.2, 2.9, 4.3, 1.3]:Iris-versicolor
    [5.1, 2.5, 3.0, 1.1]:Iris-versicolor
    [5.7, 2.8, 4.1, 1.3]:Iris-versicolor
    [5.8, 2.7, 5.1, 1.9]:Iris-virginica
    [4.9, 2.5, 4.5, 1.7]:Iris-virginica
    [5.7, 2.5, 5.0, 2.0]:Iris-virginica
    ・・・略
    [5.8, 2.7, 5.1, 1.9]:Iris-virginica
    [6.3, 2.5, 5.0, 1.9]:Iris-virginica
    [5.9, 3.0, 5.1, 1.8]:Iris-virginica
    クラスタ2 に分類された 38件 の内訳が、
     2件:versicolor
     36件:virginica
    38

    View Slide

  39. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(k-means++)
    Cluster 0
    [5.1, 3.5, 1.4, 0.2]:Iris-setosa
    [4.9, 3.0, 1.4, 0.2]:Iris-setosa
    [4.7, 3.2, 1.3, 0.2]:Iris-setosa
    ・・・略
    [4.6, 3.2, 1.4, 0.2]:Iris-setosa
    [5.3, 3.7, 1.5, 0.2]:Iris-setosa
    [5.0, 3.3, 1.4, 0.2]:Iris-setosa
    Cluster 2
    [6.9, 3.1, 4.9, 1.5]:Iris-versicolor
    [6.7, 3.0, 5.0, 1.7]:Iris-versicolor
    [6.3, 3.3, 6.0, 2.5]:Iris-virginica
    [7.1, 3.0, 5.9, 2.1]:Iris-virginica
    [6.3, 2.9, 5.6, 1.8]:Iris-virginica
    ・・・略
    [6.7, 3.0, 5.2, 2.3]:Iris-virginica
    [6.5, 3.0, 5.2, 2.0]:Iris-virginica
    [6.2, 3.4, 5.4, 2.3]:Iris-virginica
    Cluster 1
    [7.0, 3.2, 4.7, 1.4]:Iris-versicolor
    [6.4, 3.2, 4.5, 1.5]:Iris-versicolor
    [5.5, 2.3, 4.0, 1.3]:Iris-versicolor
    ・・・略
    [6.2, 2.9, 4.3, 1.3]:Iris-versicolor
    [5.1, 2.5, 3.0, 1.1]:Iris-versicolor
    [5.7, 2.8, 4.1, 1.3]:Iris-versicolor
    [5.8, 2.7, 5.1, 1.9]:Iris-virginica
    [4.9, 2.5, 4.5, 1.7]:Iris-virginica
    [5.7, 2.5, 5.0, 2.0]:Iris-virginica
    ・・・略
    [5.8, 2.7, 5.1, 1.9]:Iris-virginica
    [6.3, 2.5, 5.0, 1.9]:Iris-virginica
    [5.9, 3.0, 5.1, 1.8]:Iris-virginica
    setosaについては分類ができたが、
    versicolor 寄りの virginica が大きく入り込んでいる。
    39

    View Slide

  40. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(k-means++)
    40

    View Slide

  41. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(k-means++)
    クラスタ3 に分類された38件の内訳が、
     2件:versicolor
     36件:virginica
    ここは、ほぼ一致しているのが見て取れる。
    41

    View Slide

  42. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(k-means++)
    クラスタ3 に分類された38件の内訳が、
     2件:versicolor
     36件:virginica
    このあたりは被っているので、
    クラスタが意図していない方に分別されている。
    42

    View Slide

  43. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(k-means++)
    43

    View Slide

  44. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(k-means++)
    クラスタ3 に分類された38件の内訳が、
     2件:versicolor
     36件:virginica
    このあたりは被っているので、
    クラスタが意図していない方に分別されている。
    44

    View Slide

  45. Apache Commons Math を使って 機械学習をやってみた
    Python で やってみるとどんな実装になるか?
    https://github.com/mackey0225/20230604-jjug_ccc_2023_s
    pring_math/blob/main/iris_kmeans.ipynb
    実際にやってみた(k-means++)
    45

    View Slide

  46. 最後に

    View Slide

  47. Apache Commons Math を使って 機械学習をやってみた
    ● 簡単なものであれば、そんなに苦にならない
    ● とはいえ、Python のほうがお手軽
    ● 今後はもう少し業務に近いもので実装してみたい
    ● 他のライブラリも使って比較したい
    ● バージョン 4.0 が いつ 正式版 になるのか・・・!
    まとめ
    47

    View Slide

  48. ご清聴ありがとうございました!

    View Slide

  49. おまけ(1)

    View Slide

  50. Apache Commons Math を使って 機械学習をやってみた
    ChatGPT で やってみるとどうなるか?
    実際にやってみた(ChatGPT)

    50

    View Slide

  51. Apache Commons Math を使って 機械学習をやってみた
    ChatGPT で やってみるとどうなるか?
    実際にやってみた(ChatGPT)
    51

    View Slide

  52. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(ChatGPT)
    コードは割愛
    52

    View Slide

  53. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(ChatGPT)
    53

    View Slide

  54. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(ChatGPT)
    54

    View Slide

  55. Apache Commons Math を使って 機械学習をやってみた
    実際にやってみた(ChatGPT)
    アヤメのデータセットって、ようわかったな。
    お前、工藤やろ?
    55

    View Slide

  56. おまけ(2)

    View Slide

  57. Apache Commons Math を使って 機械学習をやってみた
    k-means法 の イメージ
    57
    データが与えられた状態

    View Slide

  58. Apache Commons Math を使って 機械学習をやってみた
    k-means法 の イメージ
    58
    k=2 であれば 基準点 を 2つ(青・赤)を置く

    View Slide

  59. Apache Commons Math を使って 機械学習をやってみた
    k-means法 の イメージ
    59
    それぞれのデータに対して、基準点に近い方に色分けをする

    View Slide

  60. Apache Commons Math を使って 機械学習をやってみた
    k-means法 の イメージ
    60
    色分けしたあとに、それぞれの色ごとの中心になる点を計算する

    View Slide

  61. Apache Commons Math を使って 機械学習をやってみた
    k-means法 の イメージ
    61
    色分けしたあとに、それぞれの色ごとの中心になる点を計算する

    View Slide

  62. Apache Commons Math を使って 機械学習をやってみた
    k-means法 の イメージ
    62
    これを新しい基準点として、また色分けをする

    View Slide

  63. Apache Commons Math を使って 機械学習をやってみた
    k-means法 の イメージ
    63
    これを新しい基準点として、また色分けをする

    View Slide

  64. Apache Commons Math を使って 機械学習をやってみた
    k-means法 の イメージ
    64
    これを新しい基準点として、また色分けをする

    View Slide

  65. Apache Commons Math を使って 機械学習をやってみた
    k-means法 の イメージ
    65
    また、この状態で新しい基準点を計算する

    View Slide

  66. Apache Commons Math を使って 機械学習をやってみた
    k-means法 の イメージ
    66
    また、この状態で新しい基準点を計算する

    View Slide

  67. Apache Commons Math を使って 機械学習をやってみた
    k-means法 の イメージ
    67
    というのを、基準点が変わらなくなるまで繰り返す(アルゴリズム)

    View Slide

  68. Apache Commons Math を使って 機械学習をやってみた
    k-means法 の イメージ
    68
    で、最終的に落ち着いた状態が、クラスタリングの結果となる

    View Slide

  69. Apache Commons Math を使って 機械学習をやってみた
    k-means法 の イメージ
    69
    最初の基準点によって、繰り返しが多くなったり、結果が変わったりするので、

    View Slide

  70. Apache Commons Math を使って 機械学習をやってみた
    k-means法 の イメージ
    70
    k-means++法 は k-means法 に比べて、最初の基準点の設定を改良している

    View Slide