読者です 読者をやめる 読者になる 読者になる

ローグウェーブソフトウェアのブログ

開発をシンプルに 安全で高品質のコードを 素早くお客様のもとへ

チュートリアル: JMSLを使ったデータベース上の組み込み解析

IMSL 製品とサービス

今回はローグウェーブソフトウェアの数値・統計ライブラリJMSLを使ったデータベース上の組み込み解析について書かれたホワイトペーパーを紹介します。

JMSLとは

roguewave.jp

JMSL数値計算ライブラリは、Java の環境で利用できる数学、統計、金融、データマイニングおよびチャートのクラスが一つに集約された包括的な数値解析ライブラリです。業界最高レベルのIMSLライブラリの信頼性の高い数値計算・統計解析用のアルゴリズムに豊富なチャート機能を統合した、Javaプログラマ向けの唯一のソリューションです。Java環境での高度な数値解析と可視化機能を組み合わせは、企業の皆様が組織内の価値ある情報を素早く理解し解析結果を即座に共有することを可能にします。

データベースとの組み合わせ

既にこのブログでもJMSLとHadoopを組みあわせた記事を何回か紹介しています。

今回の記事ではHadoopではなくSQLをJMSLと組み合わせ、詳細にコードを交えて単純ベイズ分類による解析例を紹介しています。なお、Oracleデータベース内でJavaを利用する方法については、Oracleによるドキュメントもご覧ください。

ホワイトペーパーは以下の様に構成されています。

チュートリアル: JMSLを使ったデータベース上の組み込み解析」の概要

ビッグデータ解析は文字通り大量のデータを扱うため、そのままではデータベースとクライアント間でデータをロードやストアするのに多くの時間を費やさなければなりません。その解決策として、安価なハードウェア上に保存されたデータストアの中で処理を行うという戦略が考えられます。データと処理の融合です。1つの技術としてはMapReduceフレームワークを使ったHadoopが有名ですが、これがどんなアプリケーションに対しても最良の選択肢である、という訳ではありません。データベースを構造化して扱うSQLは今でも依然として有用であり、ビッグデータ解析のそれぞれの得意分野ごとに使い分けるべきなのです(参考記事)。

SQLはリレーショナルデータベースを処理するのに適した言語です。データ量の増大に伴い、最近(Java 1.1以降)では内部にJDBCを実装し、Javaと共に発展を続けています。RDBMS(関係データベース管理システム)はJVMを内包し、逆にJavaSQLのデータ型をそのまま使うことができる型を持つようになっています。そのため、データベースとJavaはシームレスに融合し、ユーザーはデータベースの中でJavaアプリケーションを使って、重いデータ移動なしにデータベースの操作ができるようになっています。

JMSLを使うと、開発中のJavaアプリケーションからシームレスに高度な数学・統計関数を利用することができます。JMSLが持っているベイズアプリオリ、K-means、決定木など多くの高品質な部品を使ってデータマイニングやPredictive analytics、データ可視化のための高度なJavaアプリケーションを容易に開発することができます。このホワイトペーパーでは、単純ベイズ(Naïve Bayes)の分類アルゴリズムの完全な実装を行い、JMSLをデータベースに組み込む手順を説明します。有名なFisherのあやめの分類をテストケースとして利用します。

このホワイトペーパーでは、Oracle 12cデータベース上でJMSLをロードし、単純ベイズ分類器のクラスRWNaiveBayesを実装して訓練し、クラスをロードしてClassifyメソッドをOracleデータ・ディクショナリにストアド・プロシージャとして公開します。そしてそのプロシージャをSQLから呼び出して結果を得るところまでを説明しています。

コードの例を挙げると、例えばJMSLルーチンを組み込んだストアド・プロシージャをSQLで呼び出す時にはSELECT文を使って以下のように記述されます。

1. SELECT CT FROM ( SELECT RWNaiveBayes(
2. CURSOR(SELECT classification, sepallength, sepalwidth, petallength, petalwidth
FROM iris_trn ),
3. CURSOR( SELECT * FROM faux_iris OFFSET 8 ROWS FETCH FIRST 1 ROWS ONLY),
4. CURSOR( SELECT COUNT(*) FROM iris_trn ),
5. CURSOR( SELECT MAX(classification) FROM iris_trn ) )
6. AS CT FROM dual);

まず訓練用のFisherのアヤメのデータを読み込み、訓練用のパラメータを与え、データ内の数を数え、CT(Classification Type)に保存されます。ここでは標準的なSQLの構文のみを使って分類を行うことができました。

また、JMSLを使った分類器のJava実装は以下のようになります。

public static int Classify ( ResultSet rsT, ResultSet rsC,
                             int nrows, int nClasses )throws SQLException {
    int nclass = -1;
    ResultSetMetaData rsmd = null;
    try {
        NaiveBayesClassifier nbTrainer = Train( rsT, nrows, nClasses);
        rsmd = rsC.getMetaData();
        int nContinuous = rsmd.getColumnCount();
        double[] continuousInput = new double[nContinuous];
        rsC.next();
        for (int jj=0; jj<nContinuous; jj++)
            continuousInput[jj]=rsC.getDouble(jj+1);
        double[] classifiedProbabilities = new double[nClasses];
        classifiedProbabilities =
            nbTrainer.probabilities(continuousInput, null);
        nclass = nbTrainer.predictClass(continuousInput, null) + 1;
    } catch (SQLException e) {
        System.err.println(e);
        e.printStackTrace();
        throw(e);
    }
    return nclass;
}

以上、ホワイトペーパーの概要を紹介しました。実際の手順や完全なコードを以下のホワイトペーパーでご覧ください。

Tech tutorial: Embedding analytics into a database using JMSL

また、

JMSLのマニュアル (英語)にNaiveBayesClassifierの理論的説明とAPIの使用方法が詳述されていますので、合わせてご覧ください。

まとめ

こうした手順により、データ転送のオーバーヘッドやセキュリティ、データの破損リスクなしにデータストア上で高度な解析を柔軟に行うことができます。Hadoopのようなデータ構造だけでなくリレーショナル・データベースに対しても、JMSLを使えば容易に高度な解析を行うことができます。ぜひお気軽にJavaを使ったデータ解析をお試しください。

http://roguewave.jp/forms/request.htmlroguewave.jp

ローグウェーブ セールスエンジニア 柄澤(からさわ)