Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

本題の前に

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

本題の前にもう少し

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

ここからが本題

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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 → 母集団の分散とする

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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 は 最大試行回数

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

最後に

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

おまけ(1)

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

おまけ(2)

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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