if (!require(keras3))
{
  install.packages("keras3")
  library(keras3)
  install_keras() # r-kerasという仮想環境にKerasがインストールされる。
  # install_keras(tensorflow = "gpu") # GPU演算用(NVIDIA GPUとcuDNNが必要)
}
##  要求されたパッケージ keras3 をロード中です
if (!require(plotly)) install.packages("plotly")
##  要求されたパッケージ plotly をロード中です
##  要求されたパッケージ ggplot2 をロード中です
## 
##  次のパッケージを付け加えます: 'plotly'
##  以下のオブジェクトは 'package:ggplot2' からマスクされています:
## 
##     last_plot
##  以下のオブジェクトは 'package:stats' からマスクされています:
## 
##     filter
##  以下のオブジェクトは 'package:graphics' からマスクされています:
## 
##     layout
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)

d
##               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
## 265 1557.255929 265  70225  2.588190e+01
## 266 1602.707147 266  70756  5.000000e+01
## 267 1627.165794 267  71289  7.071068e+01
## 268 1647.187829 268  71824  8.660254e+01
## 269 1662.706167 269  72361  9.659258e+01
## 270 1681.343132 270  72900  1.000000e+02
## 271 1690.733879 271  73441  9.659258e+01
## 272 1688.555469 272  73984  8.660254e+01
## 273 1684.934825 273  74529  7.071068e+01
## 274 1686.246620 274  75076  5.000000e+01
## 275 1675.174981 275  75625  2.588190e+01
## 276 1651.137485 276  76176  6.369308e-13
## 277 1629.679219 277  76729 -2.588190e+01
## 278 1624.236470 278  77284 -5.000000e+01
## 279 1615.459368 279  77841 -7.071068e+01
## 280 1608.785068 280  78400 -8.660254e+01
## 281 1611.353189 281  78961 -9.659258e+01
## 282 1614.817829 282  79524 -1.000000e+02
## 283 1628.422587 283  80089 -9.659258e+01
## 284 1659.752058 284  80656 -8.660254e+01
## 285 1680.172685 285  81225 -7.071068e+01
## 286 1710.362003 286  81796 -5.000000e+01
## 287 1757.197882 287  82369 -2.588190e+01
## 288 1787.765070 288  82944 -2.939055e-13
## 289 1834.439389 289  83521  2.588190e+01
## 290 1857.568303 290  84100  5.000000e+01
## 291 1892.337058 291  84681  7.071068e+01
## 292 1924.495505 292  85264  8.660254e+01
## 293 1945.493233 293  85849  9.659258e+01
## 294 1958.522750 294  86436  1.000000e+02
## 295 1966.861510 295  87025  9.659258e+01
## 296 1964.836245 296  87616  8.660254e+01
## 297 1969.422868 297  88209  7.071068e+01
## 298 1960.801534 298  88804  5.000000e+01
## 299 1944.738359 299  89401  2.588190e+01
## 300 1931.364929 300  90000 -4.911978e-14
## 301 1922.288826 301  90601 -2.588190e+01
## 302 1905.223286 302  91204 -5.000000e+01
## 303 1905.581815 303  91809 -7.071068e+01
## 304 1892.811019 304  92416 -8.660254e+01
## 305 1886.514281 305  93025 -9.659258e+01
## 306 1899.334894 306  93636 -1.000000e+02
## 307 1925.209187 307  94249 -9.659258e+01
## 308 1939.650792 308  94864 -8.660254e+01
## 309 1968.996370 309  95481 -7.071068e+01
## 310 2005.802396 310  96100 -5.000000e+01
## 311 2035.334467 311  96721 -2.588190e+01
## 312 2084.273172 312  97344 -1.028940e-12
## 313 2120.399083 313  97969  2.588190e+01
## 314 2147.882954 314  98596  5.000000e+01
## 315 2187.048197 315  99225  7.071068e+01
## 316 2223.348243 316  99856  8.660254e+01
## 317 2244.233730 317 100489  9.659258e+01
## 318 2252.384431 318 101124  1.000000e+02
## 319 2256.963250 319 101761  9.659258e+01
## 320 2268.427131 320 102400  8.660254e+01
## 321 2261.812703 321 103041  7.071068e+01
## 322 2262.753267 322 103684  5.000000e+01
## 323 2246.221383 323 104329  2.588190e+01
## 324 2235.472959 324 104976  6.859151e-13
## 325 2214.429291 325 105625 -2.588190e+01
## 326 2202.549684 326 106276 -5.000000e+01
## 327 2203.741182 327 106929 -7.071068e+01
## 328 2196.721495 328 107584 -8.660254e+01
## 329 2194.286446 329 108241 -9.659258e+01
## 330 2207.225463 330 108900 -1.000000e+02
## 331 2222.099434 331 109561 -9.659258e+01
## 332 2249.980663 332 110224 -8.660254e+01
## 333 2279.697782 333 110889 -7.071068e+01
## 334 2310.429897 334 111556 -5.000000e+01
## 335 2354.479766 335 112225 -2.588190e+01
## 336 2387.173719 336 112896 -3.428898e-13
ii <- 1:(24*11)  # 11日分のインデックス
d.tr <- d[ ii, ] # 訓練データを抽出(前11日)
d.te <- d[-ii, ] # 試験データを抽出(後3日)

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)
x.te <- model.matrix(FML[[ID.MODEL]], d.te)
nc <- ncol(x.tr) # カラム数

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*2, 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, 8)                │            40 
## ├───────────────────────────────────┼──────────────────────────┼───────────────
## │ dense_1 (Dense)                   │ (None, 16)               │           144 
## ├───────────────────────────────────┼──────────────────────────┼───────────────
## │ dense_2 (Dense)                   │ (None, 8)                │           136 
## ├───────────────────────────────────┼──────────────────────────┼───────────────
## │ dense_3 (Dense)                   │ (None, 1)                │             9 
## └───────────────────────────────────┴──────────────────────────┴───────────────
##  Total params: 329 (1.29 KB)
##  Trainable params: 329 (1.29 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")) # 評価指標:絶対値誤差平均

# コールバック設定
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 - 128ms/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 -316.2873 316.2873 16.0048 328.0075
# Kerasパッケージでの精度指標
evaluate(model, x.te, d.te$y)
## 3/3 - 0s - 18ms/step - loss: 107588.8906 - mean_absolute_error: 316.2873
## $loss
## [1] 107588.9
## 
## $mean_absolute_error
## [1] 316.2873
get.accuracy(yhat = yhat.lm, y = d.te$y)
##         MBE      MAE      MAPE     RMSE
## 1 -1.683005 3.942815 0.2068178 4.884525