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

Apache Commons Math を使って 機械学習をやってみた / Enjoy Mac...

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

Avatar for mackey0225

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法 に比べて、最初の基準点の設定を改良している