001/* 002 * Copyright (c) 2009 The openGion Project. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 013 * either express or implied. See the License for the specific language 014 * governing permissions and limitations under the License. 015 */ 016package org.opengion.penguin.math.statistics; 017 018import org.apache.commons.math3.linear.MatrixUtils; 019import org.apache.commons.math3.linear.RealMatrix; 020import org.apache.commons.math3.stat.correlation.PearsonsCorrelation; 021 022/** 023 * apache.commons.mathを利用した相関計算及びその周辺機能を利用するためのクラスです。 024 * 025 * とりあえず通常のピアソン積率相関のみを利用可能としておきます。 026 * 027 */ 028// 8.5.5.1 (2024/02/29) spotbugs CT_CONSTRUCTOR_THROW(コンストラクタで、Excweptionを出さない) class を final にすれば、警告は消える。 029// public class HybsCorrelation { 030public final class HybsCorrelation { 031 private String[] names; 032 final private RealMatrix corrMatrix; 033 034 /** 035 * 名称と、データマトリクスを指定するコンストラクタ。 036 * 与えたデータマトリクスを元にピアソン積率相関を計算します。 037 * 名称 = { "数学" , "英語", "国語" } 038 * データ = { { 90 ,60 ,70 }, {70, 90, 80 } } 039 * のような形としてデータを与えます。 040 * 041 * @param name 名称 042 * @param matrix データマトリクス 043 */ 044 public HybsCorrelation( final String[] name, final double[][] matrix ) { 045 // 一応元データをセットしておく 046 this.names = name; 047 048 // ここで相関係数行列を作成してしまう 049 corrMatrix = new PearsonsCorrelation().computeCorrelationMatrix( matrix ); // 6.9.7.0 (2018/05/14) PMD Useless parentheses. 050 } 051 052 /** 053 * 相関係数行列を指定したコンストラクタ。 054 * 計算後の相関係数行列をdouble[][]型で直接与えられるようにしておきます。 055 * 以前に計算した行列を使って行列の積を算出する場合に利用します。 056 * 057 * @param matrix 相関係数行列 058 */ 059 public HybsCorrelation( final double[][] matrix ) { 060 corrMatrix = MatrixUtils.createRealMatrix( matrix ); 061 } 062 063 /** 064 * コンストラクタで算出した相関値行列に対して与えた行列を掛け算します。 065 * 例えば以下のような算出を行う事が可能です。 066 * 各商品を何回購入したかというデータを人数分用意し、相関係数行列を作成し、 067 * それに対してある人の今まで購入した履歴を掛け算する事で相関の高い商品を導出します。 068 * つまり、購入した事のないもので有意な相関係数を持つものは購入可能性が高いと言えます。 069 * 070 * @param data 掛け算する行列 071 * @return 行列積の結果マトリクス 072 */ 073 public double[][] multiply( final double[][] data ) { 074 final RealMatrix dataMatrix = MatrixUtils.createRealMatrix( data ); 075 final RealMatrix scores = dataMatrix.multiply( corrMatrix ); 076 077 return scores.getData(); 078 } 079 080 /** 081 * 相関値行列取得。 082 * 083 * @return 相関マトリクス 084 */ 085 public double[][] getCorrMatrix() { 086 return corrMatrix.getData(); 087 } 088 089 /** 090 * 指定行の相関値配列取得。 091 * 092 * @param row ROW番号 093 * @return 行方向の相関ベクトル 094 */ 095 public double[] getCorrMatrixRow( final int row ) { 096 return corrMatrix.getRow( row ); 097 } 098 099 /** 100 * 指定列の相関値配列取得。 101 * 102 * @param col COL番号 103 * @return 列方向の相関ベクトル 104 */ 105 public double[] getCorrMatrixCol( final int col ) { 106 return corrMatrix.getColumn( col ); 107 } 108 109 /** 110 * 名称配列の取得。 111 * 112 * @return 名称配列 113 */ 114 public String[] getNames() { 115 return names; 116 } 117 118 /** 119 * 名称配列のセット。 120 * 121 * @param name 名称配列 122 */ 123 public void setNames( final String[] name ) { 124 this.names = name; 125 } 126 127 // ここまでが本体 128 129 /** ここからテスト用mainメソッド 。 130 * 131 * @param args 引数 132 */ 133 public static void main( final String [] args ) { 134 final String[] name = {"A", "B", "C", "D","E"}; 135 final double[][] data = { 136 {3, 1, 0, 0 , 1}, 137 {1, 0, 0, 0 , 1}, 138 {0, 0, 2, 2 , 2}, 139 {2, 2, 1, 0 , 0}, 140 {1, 0, 2, 4 , 1}, 141 }; 142 143 final HybsCorrelation rtn = new HybsCorrelation( name,data ); 144 145 for( int i = 0; i< rtn.getCorrMatrix().length; i++ ) { 146 System.out.println( java.util.Arrays.toString( rtn.getCorrMatrix()[i] ) ); 147 } 148 149 // オススメ度計算 150 System.out.println( java.util.Arrays.toString(rtn.multiply( new double[][] {{0, 1, 0, 0 , 0}} ) [0] ) ); 151 } 152}