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 java.util.Arrays; 019import org.apache.commons.math3.stat.regression.SimpleRegression; 020 021/** 022 * apache.commons.mathを利用した線形単回帰計算のクラスです。 023 * f(x)=ax+bの形で線形回帰を行います。 024 */ 025// 8.5.5.1 (2024/02/29) spotbugs CT_CONSTRUCTOR_THROW(コンストラクタで、Excweptionを出さない) class を final にすれば、警告は消える。 026// public class HybsSimpleRegression implements HybsRegression { 027public final class HybsSimpleRegression implements HybsRegression { 028 private final double[] cnst = new double[3] ; // 係数(0次、1次、2次は常に0) 029 030 private double rsquare; // 決定係数 031 032 /** 033 * コンストラクタ。 034 * 与えた二次元データを元に回帰直線を計算します。 035 * {x,y}の配列でデータを与えます。 036 * 037 * @param data xとyの組み合わせの配列 038 */ 039 public HybsSimpleRegression( final double[][] data ) { 040 // ここで単回帰計算 041 train( data ); 042 } 043 044 /** 045 * dataを与えて回帰直線を求める。 046 * 047 * @param data {x,y}の配列 048 */ 049 private void train( final double[][] data ) { 050 final SimpleRegression regression = new SimpleRegression(); 051 regression.addData( data ); 052 053 cnst[2] = 0 ; // 2次係数は、常に0 054 cnst[1] = regression.getSlope(); 055 cnst[0] = regression.getIntercept(); 056 057 rsquare = regression.getRSquare(); 058 } 059 060 /** 061 * 係数(0次、1次、2次は常に0)の順にセットした配列を返します。 062 * 063 * @return 係数の配列 064 */ 065 @Override // HybsRegression 066 public double[] getCoefficient() { 067 return Arrays.copyOf( cnst,cnst.length ); 068 } 069 070 /** 071 * 決定係数の取得。 072 * 073 * @return 決定係数 074 */ 075 @Override // HybsRegression 076 public double getRSquare() { 077 return rsquare; 078 } 079 080 /** 081 * a + bxを計算。 082 * 083 * @param in_x 必要な大きさの変数配列 084 * @return 計算結果 085 */ 086 @Override // HybsRegression 087 public double predict( final double... in_x ) { 088 return cnst[1] * in_x[0] + cnst[0]; 089 } 090 091 // ================ ここまでが本体 ================ 092 093 /** 094 * ここからテスト用mainメソッド 。 095 * 096 * @param args 引数 097 */ 098 public static void main( final String[] args ) { 099 final double[][] data = {{1, 2.3}, {2, 3.4}, {3, 6.1}, {4, 8.2}}; 100 101 final HybsSimpleRegression sr = new HybsSimpleRegression(data); 102 103 final double[] cnst = sr.getCoefficient(); 104 105 System.out.println(cnst[2]); 106 System.out.println(cnst[1]); 107 System.out.println(cnst[0]); 108 109 System.out.println(sr.predict( 5 )); 110 } 111} 112