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 を使って 機械学習をやってみた 目次 ❏ 自己紹介 ❏ 背景と感想

    ❏ Java で 数学をするには ❏ とりあえず、やってみた ❏ まとめ 2
  2. Apache Commons Math を使って 機械学習をやってみた 自己紹介 名前:浅野 正貴 所属:BABY JOB 株式会社(2022-06

    入社) 役割:Javaエンジニア Twitter: @mackey0225 / GitHub: @mackey0225 対面での発表は人生初!緊張!最高! 3
  3. Apache Commons Math を使って 機械学習をやってみた 4 注意 • 内容は、 ◦

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

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

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

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

    Mathクラス(java.lang.math) • Apache Commons Math • Apache Commons Numbers • Apache Commons Geometry • DeepLearning4J • MOA • Weka      ...and more. 10
  8. Apache Commons Math を使って 機械学習をやってみた Apache Commons Math とは •

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

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

    教師あり学習 • 入出力データを与え、未知の入力に対して出力を予測させる 2. 教師なし学習 • データから、背景にあるパターンや規則性を見つける 3. 強化学習 • データを用いず、システム自ら試行錯誤し学習する 14
  11. Apache Commons Math を使って 機械学習をやってみた 今回やったこと アヤメの分類(Iris Dataset)を対象データとして以下を実施 • データセットの取得

    • データの統計情報取得 ◦ 各データの最大値や最小値などの簡単な計算 • k-means++法 による クラスタリング ◦ データの格納 ◦ クラスタリング結果の出力 ◦ 散布図の出力 16
  12. 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
  13. Apache Commons Math を使って 機械学習をやってみた 「k-means++法」について • 教師なし学習 の 一種

    • データ・点の集まりに対して、k個のクラスタに分けるアルゴリズム • k-means法 の 改良版 ◦ アルゴリズムのイメージは「おまけ」に記載 18
  14. 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
  15. 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
  16. 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
  17. Apache Commons Math を使って 機械学習をやってみた 実際にやってみた(データセットからの取得) static List<IrisRecord> getData() {

    String dataPath = "./src/main/resources/data/iris/iris.data"; List<IrisRecord> 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
  18. Apache Commons Math を使って 機械学習をやってみた 実際にやってみた(データセットからの取得) static List<IrisRecord> getData() {

    String dataPath = "./src/main/resources/data/iris/iris.data"; List<IrisRecord> 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
  19. Apache Commons Math を使って 機械学習をやってみた 実際にやってみた(統計情報の取得) public class Iris {

    public static void main(String[] args) throws IOException { List<IrisRecord> 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
  20. Apache Commons Math を使って 機械学習をやってみた 実際にやってみた(統計情報の取得) public class Iris {

    public static void main(String[] args) throws IOException { List<IrisRecord> 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
  21. Apache Commons Math を使って 機械学習をやってみた 実際にやってみた(統計情報の取得) public class Iris {

    public static void main(String[] args) throws IOException { List<IrisRecord> 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 → 母集団の分散とする
  22. Apache Commons Math を使って 機械学習をやってみた 実際にやってみた(統計情報の取得) public class Iris {

    public static void main(String[] args) throws IOException { List<IrisRecord> 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
  23. Apache Commons Math を使って 機械学習をやってみた 実際にやってみた(k-means++) +/ k-means++法 によるクラスタリング List<IrisDataPoint>

    clusterInput = new ArrayList+>(); for (IrisRecord record : data) { clusterInput.add(new IrisDataPoint(record)); } KMeansPlusPlusClusterer<IrisDataPoint> clusterer = new KMeansPlusPlusClusterer+>(3, 10000); List<CentroidCluster<IrisDataPoint+> 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
  24. Apache Commons Math を使って 機械学習をやってみた 実際にやってみた(k-means++) +/ k-means++法 によるクラスタリング List<IrisDataPoint>

    clusterInput = new ArrayList+>(); for (IrisRecord record : data) { clusterInput.add(new IrisDataPoint(record)); } KMeansPlusPlusClusterer<IrisDataPoint> clusterer = new KMeansPlusPlusClusterer+>(3, 10000); List<CentroidCluster<IrisDataPoint+> 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
  25. Apache Commons Math を使って 機械学習をやってみた 実際にやってみた(k-means++) +/ k-means++法 によるクラスタリング List<IrisDataPoint>

    clusterInput = new ArrayList+>(); for (IrisRecord record : data) { clusterInput.add(new IrisDataPoint(record)); } KMeansPlusPlusClusterer<IrisDataPoint> clusterer = new KMeansPlusPlusClusterer+>(3, 10000); List<CentroidCluster<IrisDataPoint+> 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
  26. Apache Commons Math を使って 機械学習をやってみた 実際にやってみた(k-means++) +/ k-means++法 によるクラスタリング List<IrisDataPoint>

    clusterInput = new ArrayList+>(); for (IrisRecord record : data) { clusterInput.add(new IrisDataPoint(record)); } KMeansPlusPlusClusterer<IrisDataPoint> clusterer = new KMeansPlusPlusClusterer+>(3, 10000); List<CentroidCluster<IrisDataPoint+> 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<IrisDataPoint> clusterInput = new ArrayList+>(); for (IrisRecord record : data) { clusterInput.add(new IrisDataPoint(record)); } KMeansPlusPlusClusterer<IrisDataPoint> clusterer = new KMeansPlusPlusClusterer+>(3, 10000); List<CentroidCluster<IrisDataPoint+> clusterResults = clusterer.cluster(clusterInput); 32
  27. Apache Commons Math を使って 機械学習をやってみた 実際にやってみた(k-means++) +/ k-means++法 によるクラスタリング List<IrisDataPoint>

    clusterInput = new ArrayList+>(); for (IrisRecord record : data) { clusterInput.add(new IrisDataPoint(record)); } KMeansPlusPlusClusterer<IrisDataPoint> clusterer = new KMeansPlusPlusClusterer+>(3, 10000); List<CentroidCluster<IrisDataPoint+> 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<IrisDataPoint> clusterInput = new ArrayList+>(); for (IrisRecord record : data) { clusterInput.add(new IrisDataPoint(record)); } KMeansPlusPlusClusterer<IrisDataPoint> clusterer = new KMeansPlusPlusClusterer+>(3, 10000); List<CentroidCluster<IrisDataPoint+> clusterResults = clusterer.cluster(clusterInput); 33 ここの引数の - 3 は クラスターの数(つまり、k のこと) - 10000 は 最大試行回数
  28. Apache Commons Math を使って 機械学習をやってみた 実際にやってみた(k-means++) +/ k-means++法 によるクラスタリング List<IrisDataPoint>

    clusterInput = new ArrayList+>(); for (IrisRecord record : data) { clusterInput.add(new IrisDataPoint(record)); } KMeansPlusPlusClusterer<IrisDataPoint> clusterer = new KMeansPlusPlusClusterer+>(3, 10000); List<CentroidCluster<IrisDataPoint+> 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
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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
  34. Apache Commons Math を使って 機械学習をやってみた • 簡単なものであれば、そんなに苦にならない • とはいえ、Python のほうがお手軽

    • 今後はもう少し業務に近いもので実装してみたい • 他のライブラリも使って比較したい • バージョン 4.0 が いつ 正式版 になるのか・・・! まとめ 47
  35. Apache Commons Math を使って 機械学習をやってみた k-means法 の イメージ 70 k-means++法

    は k-means法 に比べて、最初の基準点の設定を改良している