いい加減時代の潮流に乗ろうということで機械学習を学びたいと思う。またRはともかくとしてPythonは未経験であるため、丁度良い書籍として
を用いることにする。
1. 線形回帰
1.4.2 RおよびPythonによる実装
入力データは以下のCSVファイルを用いた:
https://drive.google.com/file/d/1VqaXF2xcBme87bLrGXsQUHgD5t1QUVFa/view?usp=sharing
########################################################## ### 最小二乗法により重回帰モデルのパラメータを推定する ### ########################################################## # モデル # y_i=beta_0+x_1*beta_1+x_2*beta_2+x_3*beta_3+eps_i ### 真の値: # beta_0 = -0.5 # beta_1 = 3.1 # beta_2 = -2.1 # beta_3 = 1.1 # eps~N(0,1) # 初期設定 options(stringsAsFactors = F) # ディレクトリの設定 dir.input <- "...入力ファイルのある適当なパス..." dir.output <- "...適当な出力先のパス..." # 実際に推定する df.input <- read.csv(paste0(dir.input,"01_02_TestData.csv"),header = T) vc.ObjVar <- df.input[,ncol(df.input)] mt.ExpVars <- as.matrix(df.input[,-ncol(df.input)]) vc.start <- Sys.time() vc.beta <- solve(t(mt.ExpVars)%*%mt.ExpVars)%*%t(mt.ExpVars)%*%vc.ObjVar vc.end <- Sys.time() - vc.start # 推定結果と計算時間を出力 vc.AbsError <- vc.beta-c(-0.5,3.1,-2.1,1.1) # 絶対誤差 vc.RelError <- vc.AbsError/c(-0.5,3.1,-2.1,1.1) # 絶対誤差 vc.out <- c("R",vc.beta,vc.AbsError,vc.RelError,as.numeric(vc.end)) df.output <- as.data.frame(t(vc.out)) colnames(df.output) <- c("言語","EstBeta0","EstBeta1","EstBeta2","EstBeta3","AbsErrorBeta0","AbsErrorBeta1","AbsErrorBeta2","AbsErrorBeta3","RelErrorBeta0","RelErrorBeta1","RelErrorBeta2","RelErrorBeta3","CalcTime[s]") write.csv(x = df.output, file = paste0(dir.output,"01_02_Output_R.csv"),row.names = F)
############################################### ### 最小二乗法により重回帰モデルのパラメータを推定する ### ############################################### # モデル # y_i=beta_0+x_1*beta_1+x_2*beta_2+x_3*beta_3+eps_i ### 真の値: # beta_0 = -0.5 # beta_1 = 3.1 # beta_2 = -2.1 # beta_3 = 1.1 # eps~N(0,1) import csv import itertools import numpy as np import pandas as pd import time # ディレクトリの設定 dir_input = "...入力ファイルのある適当なパス..." dir_output = "...適当な出力先のパス..." # データを読み込み file_input = open(dir_input + '01_02_TestData.csv', 'r', encoding='utf-8', errors='', newline='') #リスト形式 f = pd.read_csv(file_input) # xとyに分離する f_x = f.drop('y',axis = 1) f_y = f['y'] # 推定する start = time.time() betas = np.linalg.inv(f_x.T@f_x)@f_x.T@f_y elapsed_time = time.time() - start # 出力 output = list(itertools.chain.from_iterable([[beta for beta in betas], [beta for beta in betas-[-0.5,3.1,-2.1,1.1]],[beta for beta in (betas-[-0.5,3.1,-2.1,1.1])/[-0.5,3.1,-2.1,1.1]]])) output.insert(0, 'Python') output.insert(len(output),elapsed_time) with open(dir_output + '01_02_Output_Python.csv', 'w', newline="") as f: writer = csv.writer(f) writer.writerow(['言語','EstBeta0','EstBeta1','EstBeta2','EstBeta3','AbsErrorBeta0','AbsErrorBeta1','AbsErrorBeta2','AbsErrorBeta3','RelErrorBeta0','RelErrorBeta1','RelErrorBeta2','RelErrorBeta3','CalcTime[s]']) writer.writerow(output)
1.4.2.2 計算結果
言語 |
絶対誤差 |
絶対誤差 |
絶対誤差 |
絶対誤差 |
相対誤差 |
相対誤差 |
相対誤差 |
相対誤差 |
計測時間 |
||||
R | |||||||||||||
Python |