if (!require(keras3))
{
  install.packages("keras3")
  library(keras3)
#install_keras() # r-kerasという仮想環境にKerasがインストールされる。
  # install_keras(tensorflow = "gpu") # GPU演算用(NVIDIA GPUとcuDNNが必要)
}

if (!require(plotly)) install.packages("plotly")
if ("keras3" %in% rownames(installed.packages())) {
  cat("kerasパッケージはインストールされています。")
} else {
  cat("kerasパッケージはインストールされていません。")
}
## kerasパッケージはインストールされています。
set.seed(5) # 乱数シード

n <- 24*7*2 # 時間数(全14日)
x <- 1:n    # 時刻
x2 <- x^2
x3 <- 100*sin(2*pi*x/24)

f <- function(x) 100 + 0.1*x + 0.02*x2 + x3

y <- f(x) + rnorm(n, sd = 5)

d <- data.frame(y, x, x2, x3)

ii <- 1:(24*11)  # 11日分のインデックス
d.tr <- d[ ii, ] # 訓練データを抽出(前11日)
d.te <- d[-ii, ] # 試験データを抽出(後3日)
d.tr
##               y   x    x2            x3
## 1    121.797627   1     1  2.588190e+01
## 2    157.201797   2     4  5.000000e+01
## 3    164.913219   3     9  7.071068e+01
## 4    187.673254   4    16  8.660254e+01
## 5    206.149787   5    25  9.659258e+01
## 6    198.305460   6    36  1.000000e+02
## 7    195.911751   7    49  9.659258e+01
## 8    185.505684   8    64  8.660254e+01
## 9    171.801810   9    81  7.071068e+01
## 10   153.690541  10   100  5.000000e+01
## 11   135.540056  11   121  2.588190e+01
## 12   100.071103  12   144  1.224606e-14
## 13    73.396132  13   169 -2.588190e+01
## 14    54.532328  14   196 -5.000000e+01
## 15    29.930522  15   225 -7.071068e+01
## 16    19.422529  16   256 -8.660254e+01
## 17     7.900852  17   289 -9.659258e+01
## 18    -2.639834  18   324 -1.000000e+02
## 19    13.731504  19   361 -9.659258e+01
## 20    22.100683  20   400 -8.660254e+01
## 21    44.711882  21   441 -7.071068e+01
## 22    66.589347  22   484 -5.000000e+01
## 23    94.337905  23   529 -2.588190e+01
## 24   117.453805  24   576 -2.449213e-14
## 25   144.976949  25   625  2.588190e+01
## 26   164.652591  26   676  5.000000e+01
## 27   195.083623  27   729  7.071068e+01
## 28   212.576410  28   784  8.660254e+01
## 29   213.027172  29   841  9.659258e+01
## 30   216.736023  30   900  1.000000e+02
## 31   220.492158  31   961  9.659258e+01
## 32   215.831011  32  1024  8.660254e+01
## 33   206.867981  33  1089  7.071068e+01
## 34   182.605518  34  1156  5.000000e+01
## 35   161.278013  35  1225  2.588190e+01
## 36   134.277869  36  1296  3.673819e-14
## 37   100.150432  37  1369 -2.588190e+01
## 38    72.677636  38  1444 -5.000000e+01
## 39    54.798393  39  1521 -7.071068e+01
## 40    48.684419  40  1600 -8.660254e+01
## 41    48.877719  41  1681 -9.659258e+01
## 42    35.467884  42  1764 -1.000000e+02
## 43    44.314523  43  1849 -9.659258e+01
## 44    65.995799  44  1936 -8.660254e+01
## 45    72.006477  45  2025 -7.071068e+01
## 46    99.731117  46  2116 -5.000000e+01
## 47   118.563053  47  2209 -2.588190e+01
## 48   148.578777  48  2304 -4.898425e-14
## 49   175.180262  49  2401  2.588190e+01
## 50   204.653944  50  2500  5.000000e+01
## 51   235.146921  51  2601  7.071068e+01
## 52   246.821171  52  2704  8.660254e+01
## 53   263.182697  53  2809  9.659258e+01
## 54   260.760826  54  2916  1.000000e+02
## 55   262.031579  55  3025  9.659258e+01
## 56   250.297775  56  3136  8.660254e+01
## 57   245.157202  57  3249  7.071068e+01
## 58   222.516955  58  3364  5.000000e+01
## 59   201.081450  59  3481  2.588190e+01
## 60   179.166376  60  3600  2.388660e-13
## 61   148.955181  61  3721 -2.588190e+01
## 62   137.354152  62  3844 -5.000000e+01
## 63   112.077470  63  3969 -7.071068e+01
## 64   104.199267  64  4096 -8.660254e+01
## 65    90.607128  65  4225 -9.659258e+01
## 66    92.013069  66  4356 -1.000000e+02
## 67    89.375772  67  4489 -9.659258e+01
## 68   111.168948  68  4624 -8.660254e+01
## 69   125.047405  69  4761 -7.071068e+01
## 70   153.601669  70  4900 -5.000000e+01
## 71   181.017609  71  5041 -2.588190e+01
## 72   209.751929  72  5184 -7.347638e-14
## 73   241.497047  73  5329  2.588190e+01
## 74   267.081839  74  5476  5.000000e+01
## 75   292.778335  75  5625  7.071068e+01
## 76   308.945798  76  5776  8.660254e+01
## 77   327.740010  77  5929  9.659258e+01
## 78   330.085451  78  6084  1.000000e+02
## 79   330.258451  79  6241  9.659258e+01
## 80   319.788115  80  6400  8.660254e+01
## 81   312.522759  81  6561  7.071068e+01
## 82   283.968488  82  6724  5.000000e+01
## 83   276.839550  83  6889  2.588190e+01
## 84   249.399586  84  7056  8.572244e-14
## 85   230.496518  85  7225 -2.588190e+01
## 86   202.968452  86  7396 -5.000000e+01
## 87   201.305485  87  7569 -7.071068e+01
## 88   174.710300  88  7744 -8.660254e+01
## 89   170.348555  89  7921 -9.659258e+01
## 90   168.390800  90  8100 -1.000000e+02
## 91   182.757653  91  8281 -9.659258e+01
## 92   186.565404  92  8464 -8.660254e+01
## 93   214.354491  93  8649 -7.071068e+01
## 94   240.623653  94  8836 -5.000000e+01
## 95   269.067824  95  9025 -2.588190e+01
## 96   295.838040  96  9216 -9.796851e-14
## 97   322.028985  97  9409  2.588190e+01
## 98   349.179054  98  9604  5.000000e+01
## 99   375.717900  99  9801  7.071068e+01
## 100  396.306042 100 10000  8.660254e+01
## 101  400.735648 101 10201  9.659258e+01
## 102  423.956556 102 10404  1.000000e+02
## 103  422.451555 103 10609  9.659258e+01
## 104  414.364957 104 10816  8.660254e+01
## 105  401.421450 105 11025  7.071068e+01
## 106  389.789057 106 11236  5.000000e+01
## 107  364.417578 107 11449  2.588190e+01
## 108  334.251737 108 11664  1.102146e-13
## 109  318.870543 109 11881 -2.588190e+01
## 110  309.400758 110 12100 -5.000000e+01
## 111  282.044797 111 12321 -7.071068e+01
## 112  283.589357 112 12544 -8.660254e+01
## 113  283.088127 113 12769 -9.659258e+01
## 114  272.018243 114 12996 -1.000000e+02
## 115  272.653819 115 13225 -9.659258e+01
## 116  298.112115 116 13456 -8.660254e+01
## 117  306.994343 117 13689 -7.071068e+01
## 118  342.598600 118 13924 -5.000000e+01
## 119  369.500243 119 14161 -2.588190e+01
## 120  398.989841 120 14400 -4.777320e-13
## 121  436.656187 121 14641  2.588190e+01
## 122  464.304224 122 14884  5.000000e+01
## 123  479.001235 123 15129  7.071068e+01
## 124  498.306286 124 15376  8.660254e+01
## 125  526.888835 125 15625  9.659258e+01
## 126  531.570418 126 15876  1.000000e+02
## 127  529.872415 127 16129  9.659258e+01
## 128  533.298019 128 16384  8.660254e+01
## 129  509.598626 129 16641  7.071068e+01
## 130  493.792933 130 16900  5.000000e+01
## 131  488.944650 131 17161  2.588190e+01
## 132  451.787358 132 17424 -2.205647e-13
## 133  434.993343 133 17689 -2.588190e+01
## 134  421.999804 134 17956 -5.000000e+01
## 135  410.954187 135 18225 -7.071068e+01
## 136  399.195858 136 18496 -8.660254e+01
## 137  393.927815 137 18769 -9.659258e+01
## 138  389.311545 138 19044 -1.000000e+02
## 139  406.971130 139 19321 -9.659258e+01
## 140  420.893271 140 19600 -8.660254e+01
## 141  437.029347 141 19881 -7.071068e+01
## 142  467.333233 142 20164 -5.000000e+01
## 143  508.299274 143 20449 -2.588190e+01
## 144  533.907092 144 20736 -1.469528e-13
## 145  559.356661 145 21025  2.588190e+01
## 146  588.827983 146 21316  5.000000e+01
## 147  618.090448 147 21609  7.071068e+01
## 148  638.333492 148 21904  8.660254e+01
## 149  648.436508 149 22201  9.659258e+01
## 150  663.037006 150 22500  1.000000e+02
## 151  672.443025 151 22801  9.659258e+01
## 152  667.641395 152 23104  8.660254e+01
## 153  651.603794 153 23409  7.071068e+01
## 154  643.761680 154 23716  5.000000e+01
## 155  618.809228 155 24025  2.588190e+01
## 156  608.511295 156 24336  5.144702e-13
## 157  581.107620 157 24649 -2.588190e+01
## 158  571.061832 158 24964 -5.000000e+01
## 159  548.592730 159 25281 -7.071068e+01
## 160  542.328034 160 25600 -8.660254e+01
## 161  524.820693 161 25921 -9.659258e+01
## 162  552.311273 162 26244 -1.000000e+02
## 163  551.554576 163 26569 -9.659258e+01
## 164  575.853860 164 26896 -8.660254e+01
## 165  587.734734 165 27225 -7.071068e+01
## 166  614.423096 166 27556 -5.000000e+01
## 167  648.397145 167 27889 -2.588190e+01
## 168  680.686530 168 28224 -1.714449e-13
## 169  713.903620 169 28561  2.588190e+01
## 170  742.571608 170 28900  5.000000e+01
## 171  765.429940 171 29241  7.071068e+01
## 172  796.201385 172 29584  8.660254e+01
## 173  806.299649 173 29929  9.659258e+01
## 174  814.157494 174 30276  1.000000e+02
## 175  826.415101 175 30625  9.659258e+01
## 176  825.382715 176 30976  8.660254e+01
## 177  822.852119 177 31329  7.071068e+01
## 178  796.132647 178 31684  5.000000e+01
## 179  789.183337 179 32041  2.588190e+01
## 180  763.025036 180 32400 -1.715804e-13
## 181  758.346329 181 32761 -2.588190e+01
## 182  727.261134 182 33124 -5.000000e+01
## 183  721.119618 183 33489 -7.071068e+01
## 184  713.789373 184 33856 -8.660254e+01
## 185  700.085050 185 34225 -9.659258e+01
## 186  709.132893 186 34596 -1.000000e+02
## 187  720.540424 187 34969 -9.659258e+01
## 188  737.157335 188 35344 -8.660254e+01
## 189  766.312262 189 35721 -7.071068e+01
## 190  785.158308 190 36100 -5.000000e+01
## 191  826.175789 191 36481 -2.588190e+01
## 192  858.311185 192 36864 -1.959370e-13
## 193  887.587190 193 37249  2.588190e+01
## 194  924.372841 194 37636  5.000000e+01
## 195  949.772076 195 38025  7.071068e+01
## 196  981.217887 196 38416  8.660254e+01
## 197  996.553679 197 38809  9.659258e+01
## 198 1004.291009 198 39204  1.000000e+02
## 199 1005.258269 199 39601  9.659258e+01
## 200 1010.234585 200 40000  8.660254e+01
## 201  998.262287 201 40401  7.071068e+01
## 202  984.804496 202 40804  5.000000e+01
## 203  975.307747 203 41209  2.588190e+01
## 204  948.844341 204 41616  5.634544e-13
## 205  936.497587 205 42025 -2.588190e+01
## 206  921.373908 206 42436 -5.000000e+01
## 207  910.025238 207 42849 -7.071068e+01
## 208  904.160313 208 43264 -8.660254e+01
## 209  896.089709 209 43681 -9.659258e+01
## 210  906.701884 210 44100 -1.000000e+02
## 211  921.020083 211 44521 -9.659258e+01
## 212  936.623132 212 44944 -8.660254e+01
## 213  960.608053 213 45369 -7.071068e+01
## 214  984.958723 214 45796 -5.000000e+01
## 215 1024.236671 215 46225 -2.588190e+01
## 216 1052.581059 216 46656 -2.204291e-13
## 217 1088.648685 217 47089  2.588190e+01
## 218 1129.373915 218 47524  5.000000e+01
## 219 1154.266348 219 47961  7.071068e+01
## 220 1179.619748 220 48400  8.660254e+01
## 221 1196.566747 221 48841  9.659258e+01
## 222 1207.713504 222 49284  1.000000e+02
## 223 1223.598568 223 49729  9.659258e+01
## 224 1210.668607 224 50176  8.660254e+01
## 225 1197.819506 225 50625  7.071068e+01
## 226 1193.512140 226 51076  5.000000e+01
## 227 1170.178520 227 51529  2.588190e+01
## 228 1160.102042 228 51984  5.879466e-13
## 229 1141.417584 229 52441 -2.588190e+01
## 230 1113.509705 230 52900 -5.000000e+01
## 231 1117.699405 231 53361 -7.071068e+01
## 232 1117.965900 232 53824 -8.660254e+01
## 233 1109.697213 233 54289 -9.659258e+01
## 234 1115.387724 234 54756 -1.000000e+02
## 235 1128.755161 235 55225 -9.659258e+01
## 236 1160.405568 236 55696 -8.660254e+01
## 237 1183.347025 237 56169 -7.071068e+01
## 238 1202.949871 238 56644 -5.000000e+01
## 239 1238.910230 239 57121 -2.588190e+01
## 240 1281.848391 240 57600 -9.554640e-13
## 241 1313.123840 241 58081  2.588190e+01
## 242 1344.892509 242 58564  5.000000e+01
## 243 1375.690250 243 59049  7.071068e+01
## 244 1409.077235 244 59536  8.660254e+01
## 245 1414.201845 245 60025  9.659258e+01
## 246 1431.501935 246 60516  1.000000e+02
## 247 1443.775286 247 61009  9.659258e+01
## 248 1440.575031 248 61504  8.660254e+01
## 249 1429.836597 249 62001  7.071068e+01
## 250 1427.045095 250 62500  5.000000e+01
## 251 1409.710869 251 63001  2.588190e+01
## 252 1393.945503 252 63504 -9.810403e-14
## 253 1380.418875 253 64009 -2.588190e+01
## 254 1363.752705 254 64516 -5.000000e+01
## 255 1346.070636 255 65025 -7.071068e+01
## 256 1342.006018 256 65536 -8.660254e+01
## 257 1347.156216 257 66049 -9.659258e+01
## 258 1352.819305 258 66564 -1.000000e+02
## 259 1374.819040 259 67081 -9.659258e+01
## 260 1391.245874 260 67600 -8.660254e+01
## 261 1410.531034 261 68121 -7.071068e+01
## 262 1449.548925 262 68644 -5.000000e+01
## 263 1488.709842 263 69169 -2.588190e+01
## 264 1517.336449 264 69696  4.411293e-13
nrow(d)
## [1] 336
vline <- list(type = "line",
              line = list(color = "blue", dash = "dash"),
              x0 = ii[length(ii)], x1 = ii[length(ii)],
              y0 = 0, y1 = max(d$y))

plot_ly(type = "scatter", mode = "markers") |>
  add_trace(x = d$x, y = d$y,  mode = 'markers', name = "観測値") |>
  add_trace(x = x,   y = f(x), mode = 'lines',   name = "真値") |>
  layout(title = "青破線の左側:訓練領域,右側:予測領域", shapes = list(vline))
# モデル候補
FML <- vector("list", 4)
FML[[1]] <- formula("y ~ x")
FML[[2]] <- formula("y ~ x + x2")
FML[[3]] <- formula("y ~ x + x2 + x3")
FML[[4]] <- formula("y ~ poly(x, 4)")

# 選択モデル番号
ID.MODEL <- 3

# 回帰モデルから計画行列を作成
x.tr <- model.matrix(FML[[ID.MODEL]], d.tr)
nrow(d.tr)
## [1] 264
nrow(x.tr)
## [1] 264
x.te <- model.matrix(FML[[ID.MODEL]], d.te)
nc <- ncol(x.tr) # カラム数
x.tr
##     (Intercept)   x    x2            x3
## 1             1   1     1  2.588190e+01
## 2             1   2     4  5.000000e+01
## 3             1   3     9  7.071068e+01
## 4             1   4    16  8.660254e+01
## 5             1   5    25  9.659258e+01
## 6             1   6    36  1.000000e+02
## 7             1   7    49  9.659258e+01
## 8             1   8    64  8.660254e+01
## 9             1   9    81  7.071068e+01
## 10            1  10   100  5.000000e+01
## 11            1  11   121  2.588190e+01
## 12            1  12   144  1.224606e-14
## 13            1  13   169 -2.588190e+01
## 14            1  14   196 -5.000000e+01
## 15            1  15   225 -7.071068e+01
## 16            1  16   256 -8.660254e+01
## 17            1  17   289 -9.659258e+01
## 18            1  18   324 -1.000000e+02
## 19            1  19   361 -9.659258e+01
## 20            1  20   400 -8.660254e+01
## 21            1  21   441 -7.071068e+01
## 22            1  22   484 -5.000000e+01
## 23            1  23   529 -2.588190e+01
## 24            1  24   576 -2.449213e-14
## 25            1  25   625  2.588190e+01
## 26            1  26   676  5.000000e+01
## 27            1  27   729  7.071068e+01
## 28            1  28   784  8.660254e+01
## 29            1  29   841  9.659258e+01
## 30            1  30   900  1.000000e+02
## 31            1  31   961  9.659258e+01
## 32            1  32  1024  8.660254e+01
## 33            1  33  1089  7.071068e+01
## 34            1  34  1156  5.000000e+01
## 35            1  35  1225  2.588190e+01
## 36            1  36  1296  3.673819e-14
## 37            1  37  1369 -2.588190e+01
## 38            1  38  1444 -5.000000e+01
## 39            1  39  1521 -7.071068e+01
## 40            1  40  1600 -8.660254e+01
## 41            1  41  1681 -9.659258e+01
## 42            1  42  1764 -1.000000e+02
## 43            1  43  1849 -9.659258e+01
## 44            1  44  1936 -8.660254e+01
## 45            1  45  2025 -7.071068e+01
## 46            1  46  2116 -5.000000e+01
## 47            1  47  2209 -2.588190e+01
## 48            1  48  2304 -4.898425e-14
## 49            1  49  2401  2.588190e+01
## 50            1  50  2500  5.000000e+01
## 51            1  51  2601  7.071068e+01
## 52            1  52  2704  8.660254e+01
## 53            1  53  2809  9.659258e+01
## 54            1  54  2916  1.000000e+02
## 55            1  55  3025  9.659258e+01
## 56            1  56  3136  8.660254e+01
## 57            1  57  3249  7.071068e+01
## 58            1  58  3364  5.000000e+01
## 59            1  59  3481  2.588190e+01
## 60            1  60  3600  2.388660e-13
## 61            1  61  3721 -2.588190e+01
## 62            1  62  3844 -5.000000e+01
## 63            1  63  3969 -7.071068e+01
## 64            1  64  4096 -8.660254e+01
## 65            1  65  4225 -9.659258e+01
## 66            1  66  4356 -1.000000e+02
## 67            1  67  4489 -9.659258e+01
## 68            1  68  4624 -8.660254e+01
## 69            1  69  4761 -7.071068e+01
## 70            1  70  4900 -5.000000e+01
## 71            1  71  5041 -2.588190e+01
## 72            1  72  5184 -7.347638e-14
## 73            1  73  5329  2.588190e+01
## 74            1  74  5476  5.000000e+01
## 75            1  75  5625  7.071068e+01
## 76            1  76  5776  8.660254e+01
## 77            1  77  5929  9.659258e+01
## 78            1  78  6084  1.000000e+02
## 79            1  79  6241  9.659258e+01
## 80            1  80  6400  8.660254e+01
## 81            1  81  6561  7.071068e+01
## 82            1  82  6724  5.000000e+01
## 83            1  83  6889  2.588190e+01
## 84            1  84  7056  8.572244e-14
## 85            1  85  7225 -2.588190e+01
## 86            1  86  7396 -5.000000e+01
## 87            1  87  7569 -7.071068e+01
## 88            1  88  7744 -8.660254e+01
## 89            1  89  7921 -9.659258e+01
## 90            1  90  8100 -1.000000e+02
## 91            1  91  8281 -9.659258e+01
## 92            1  92  8464 -8.660254e+01
## 93            1  93  8649 -7.071068e+01
## 94            1  94  8836 -5.000000e+01
## 95            1  95  9025 -2.588190e+01
## 96            1  96  9216 -9.796851e-14
## 97            1  97  9409  2.588190e+01
## 98            1  98  9604  5.000000e+01
## 99            1  99  9801  7.071068e+01
## 100           1 100 10000  8.660254e+01
## 101           1 101 10201  9.659258e+01
## 102           1 102 10404  1.000000e+02
## 103           1 103 10609  9.659258e+01
## 104           1 104 10816  8.660254e+01
## 105           1 105 11025  7.071068e+01
## 106           1 106 11236  5.000000e+01
## 107           1 107 11449  2.588190e+01
## 108           1 108 11664  1.102146e-13
## 109           1 109 11881 -2.588190e+01
## 110           1 110 12100 -5.000000e+01
## 111           1 111 12321 -7.071068e+01
## 112           1 112 12544 -8.660254e+01
## 113           1 113 12769 -9.659258e+01
## 114           1 114 12996 -1.000000e+02
## 115           1 115 13225 -9.659258e+01
## 116           1 116 13456 -8.660254e+01
## 117           1 117 13689 -7.071068e+01
## 118           1 118 13924 -5.000000e+01
## 119           1 119 14161 -2.588190e+01
## 120           1 120 14400 -4.777320e-13
## 121           1 121 14641  2.588190e+01
## 122           1 122 14884  5.000000e+01
## 123           1 123 15129  7.071068e+01
## 124           1 124 15376  8.660254e+01
## 125           1 125 15625  9.659258e+01
## 126           1 126 15876  1.000000e+02
## 127           1 127 16129  9.659258e+01
## 128           1 128 16384  8.660254e+01
## 129           1 129 16641  7.071068e+01
## 130           1 130 16900  5.000000e+01
## 131           1 131 17161  2.588190e+01
## 132           1 132 17424 -2.205647e-13
## 133           1 133 17689 -2.588190e+01
## 134           1 134 17956 -5.000000e+01
## 135           1 135 18225 -7.071068e+01
## 136           1 136 18496 -8.660254e+01
## 137           1 137 18769 -9.659258e+01
## 138           1 138 19044 -1.000000e+02
## 139           1 139 19321 -9.659258e+01
## 140           1 140 19600 -8.660254e+01
## 141           1 141 19881 -7.071068e+01
## 142           1 142 20164 -5.000000e+01
## 143           1 143 20449 -2.588190e+01
## 144           1 144 20736 -1.469528e-13
## 145           1 145 21025  2.588190e+01
## 146           1 146 21316  5.000000e+01
## 147           1 147 21609  7.071068e+01
## 148           1 148 21904  8.660254e+01
## 149           1 149 22201  9.659258e+01
## 150           1 150 22500  1.000000e+02
## 151           1 151 22801  9.659258e+01
## 152           1 152 23104  8.660254e+01
## 153           1 153 23409  7.071068e+01
## 154           1 154 23716  5.000000e+01
## 155           1 155 24025  2.588190e+01
## 156           1 156 24336  5.144702e-13
## 157           1 157 24649 -2.588190e+01
## 158           1 158 24964 -5.000000e+01
## 159           1 159 25281 -7.071068e+01
## 160           1 160 25600 -8.660254e+01
## 161           1 161 25921 -9.659258e+01
## 162           1 162 26244 -1.000000e+02
## 163           1 163 26569 -9.659258e+01
## 164           1 164 26896 -8.660254e+01
## 165           1 165 27225 -7.071068e+01
## 166           1 166 27556 -5.000000e+01
## 167           1 167 27889 -2.588190e+01
## 168           1 168 28224 -1.714449e-13
## 169           1 169 28561  2.588190e+01
## 170           1 170 28900  5.000000e+01
## 171           1 171 29241  7.071068e+01
## 172           1 172 29584  8.660254e+01
## 173           1 173 29929  9.659258e+01
## 174           1 174 30276  1.000000e+02
## 175           1 175 30625  9.659258e+01
## 176           1 176 30976  8.660254e+01
## 177           1 177 31329  7.071068e+01
## 178           1 178 31684  5.000000e+01
## 179           1 179 32041  2.588190e+01
## 180           1 180 32400 -1.715804e-13
## 181           1 181 32761 -2.588190e+01
## 182           1 182 33124 -5.000000e+01
## 183           1 183 33489 -7.071068e+01
## 184           1 184 33856 -8.660254e+01
## 185           1 185 34225 -9.659258e+01
## 186           1 186 34596 -1.000000e+02
## 187           1 187 34969 -9.659258e+01
## 188           1 188 35344 -8.660254e+01
## 189           1 189 35721 -7.071068e+01
## 190           1 190 36100 -5.000000e+01
## 191           1 191 36481 -2.588190e+01
## 192           1 192 36864 -1.959370e-13
## 193           1 193 37249  2.588190e+01
## 194           1 194 37636  5.000000e+01
## 195           1 195 38025  7.071068e+01
## 196           1 196 38416  8.660254e+01
## 197           1 197 38809  9.659258e+01
## 198           1 198 39204  1.000000e+02
## 199           1 199 39601  9.659258e+01
## 200           1 200 40000  8.660254e+01
## 201           1 201 40401  7.071068e+01
## 202           1 202 40804  5.000000e+01
## 203           1 203 41209  2.588190e+01
## 204           1 204 41616  5.634544e-13
## 205           1 205 42025 -2.588190e+01
## 206           1 206 42436 -5.000000e+01
## 207           1 207 42849 -7.071068e+01
## 208           1 208 43264 -8.660254e+01
## 209           1 209 43681 -9.659258e+01
## 210           1 210 44100 -1.000000e+02
## 211           1 211 44521 -9.659258e+01
## 212           1 212 44944 -8.660254e+01
## 213           1 213 45369 -7.071068e+01
## 214           1 214 45796 -5.000000e+01
## 215           1 215 46225 -2.588190e+01
## 216           1 216 46656 -2.204291e-13
## 217           1 217 47089  2.588190e+01
## 218           1 218 47524  5.000000e+01
## 219           1 219 47961  7.071068e+01
## 220           1 220 48400  8.660254e+01
## 221           1 221 48841  9.659258e+01
## 222           1 222 49284  1.000000e+02
## 223           1 223 49729  9.659258e+01
## 224           1 224 50176  8.660254e+01
## 225           1 225 50625  7.071068e+01
## 226           1 226 51076  5.000000e+01
## 227           1 227 51529  2.588190e+01
## 228           1 228 51984  5.879466e-13
## 229           1 229 52441 -2.588190e+01
## 230           1 230 52900 -5.000000e+01
## 231           1 231 53361 -7.071068e+01
## 232           1 232 53824 -8.660254e+01
## 233           1 233 54289 -9.659258e+01
## 234           1 234 54756 -1.000000e+02
## 235           1 235 55225 -9.659258e+01
## 236           1 236 55696 -8.660254e+01
## 237           1 237 56169 -7.071068e+01
## 238           1 238 56644 -5.000000e+01
## 239           1 239 57121 -2.588190e+01
## 240           1 240 57600 -9.554640e-13
## 241           1 241 58081  2.588190e+01
## 242           1 242 58564  5.000000e+01
## 243           1 243 59049  7.071068e+01
## 244           1 244 59536  8.660254e+01
## 245           1 245 60025  9.659258e+01
## 246           1 246 60516  1.000000e+02
## 247           1 247 61009  9.659258e+01
## 248           1 248 61504  8.660254e+01
## 249           1 249 62001  7.071068e+01
## 250           1 250 62500  5.000000e+01
## 251           1 251 63001  2.588190e+01
## 252           1 252 63504 -9.810403e-14
## 253           1 253 64009 -2.588190e+01
## 254           1 254 64516 -5.000000e+01
## 255           1 255 65025 -7.071068e+01
## 256           1 256 65536 -8.660254e+01
## 257           1 257 66049 -9.659258e+01
## 258           1 258 66564 -1.000000e+02
## 259           1 259 67081 -9.659258e+01
## 260           1 260 67600 -8.660254e+01
## 261           1 261 68121 -7.071068e+01
## 262           1 262 68644 -5.000000e+01
## 263           1 263 69169 -2.588190e+01
## 264           1 264 69696  4.411293e-13
## attr(,"assign")
## [1] 0 1 2 3
me.tr <- apply(x.tr, 2, mean) # 訓練データの説明変数ごとの平均
sd.tr <- apply(x.tr, 2, sd)   # 訓練データの説明変数ごとの標準偏差
x.tr <- scale(x.tr, center = me.tr, scale = sd.tr) # 標準化訓練データ
x.te <- scale(x.te, center = me.tr, scale = sd.tr) # 標準化試験データ
x.tr[, 1] <- 1 # 切片は標準化できない(NaNなる)ので1で置換
x.te[, 1] <- 1 # 切片は標準化できない(NaNなる)ので1で置換
# 深層学習モデル
model <- 
  keras_model_sequential(input_shape = c(nc))    |> # 入力層
  layer_dense(units = nc*8, activation = "relu") |> # 中間層(ReLU)
  layer_dense(units = nc*4, activation = "relu") |> # 中間層(ReLU)
  layer_dense(units = nc*2, activation = "relu") |> # 中間層(ReLU)
  layer_dense(units = 1,    activation = "linear")  # 出力層(線形)

# モデル概要
summary(model)
## Model: "sequential"
## ┌───────────────────────────────────┬──────────────────────────┬───────────────
## │ Layer (type)                      │ Output Shape             │       Param # 
## ├───────────────────────────────────┼──────────────────────────┼───────────────
## │ dense (Dense)                     │ (None, 32)               │           160 
## ├───────────────────────────────────┼──────────────────────────┼───────────────
## │ dense_1 (Dense)                   │ (None, 16)               │           528 
## ├───────────────────────────────────┼──────────────────────────┼───────────────
## │ dense_2 (Dense)                   │ (None, 8)                │           136 
## ├───────────────────────────────────┼──────────────────────────┼───────────────
## │ dense_3 (Dense)                   │ (None, 1)                │             9 
## └───────────────────────────────────┴──────────────────────────┴───────────────
##  Total params: 833 (3.25 KB)
##  Trainable params: 833 (3.25 KB)
##  Non-trainable params: 0 (0.00 B)
# 高速演算のためのコンパイル(PCが素早く理解できる機械語に翻訳)
compile(model,
        loss      = "mse", # mean-squared-erros(2乗誤差平均)
        optimizer = optimizer_adam(learning_rate = 0.1), # 最適化アルゴリズム 
        metrics   = c("mean_absolute_error")) # 評価指標:絶対値誤差平均
dim(x.tr)   # Should return something like (n, p) where n is the number of observations
## [1] 264   4
length(d.tr$y) 
## [1] 264
# コールバック設定
callbacks <- list(
  # 早期停止(検証データでの損失値の改善が20エポック以上なかったら停止)
  callback_early_stopping(patience = 20, monitor = "val_loss"),
  
  # 検証データでの損失が改善されない限りモデルを上書きしない設定
  # (early_stoppingとセットで使用する)
  callback_model_checkpoint(filepath = "bestmodel.keras",
                            monitor = "val_loss", save_best_only = T),
  
  # 検証データでの損失が改善せず停滞した時(判定:5エポック)
  # に局所解を抜け出すため学習率を0.1倍に下げる設定。 
  callback_reduce_lr_on_plateau(monitor = "val_loss", 
                                factor = 0.1, patience = 5)
)

# フィッティング
fit.dp <- fit(model,                  # 深層学習モデル
              x.tr,                   # 計画行列 
              d.tr$y,                 # 目的変数
              verbose    = 0,         # 1:出力表示(低速),0:出力表示抑制
              batch_size = 2^6,       # バッチサイズ(要調整)
              epochs     = 100,       # エポック数(早期停止設定時設定不要) 
              validation_split = 0.2, # 検証用データ割合(訓練には不使用)
              callbacks  = callbacks) # コールバック設定
plot(fit.dp)

# 予測
yhat <- predict(model, x.te)
## 3/3 - 0s - 47ms/step
# 重回帰モデルとの比較
fit <- lm(FML[[ID.MODEL]], data = d.tr)
yhat.lm <- predict(fit, newdata = d.te)

# 予測結果のグラフ
plot_ly(type = "scatter", mode = "markers") |>
  add_trace(x = d$x,    y = d$y,     mode = "markers", name = "観測値") |>
  add_trace(x = d.te$x, y = yhat,    mode = "markers", name = "予測値(DNN)") |>
  add_trace(x = d.te$x, y = yhat.lm, mode = "lines",   name = "予測値(重回帰)") |>
  layout(shapes = list(vline))
# 精度評価関数
get.accuracy <- function(yhat, y)
{
  data.frame(MBE  = mean(yhat - y),
             MAE  = mean(abs(yhat - y)),
             MAPE = mean(abs((yhat - y) / y)) * 100,
             RMSE = sqrt(mean((yhat - y)^2))
  )
}
get.accuracy(yhat = yhat, y = d.te$y)
##        MBE     MAE     MAPE    RMSE
## 1 -273.755 273.755 13.80677 284.095
# Kerasパッケージでの精度指標
evaluate(model, x.te, d.te$y)
## 3/3 - 0s - 15ms/step - loss: 80709.9688 - mean_absolute_error: 273.7550
## $loss
## [1] 80709.97
## 
## $mean_absolute_error
## [1] 273.755
get.accuracy(yhat = yhat.lm, y = d.te$y)
##         MBE      MAE      MAPE     RMSE
## 1 -1.683005 3.942815 0.2068178 4.884525