Last active
October 8, 2017 04:32
-
-
Save niisan-tokyo/8c619878048b07f0a46cb682d6eb293f to your computer and use it in GitHub Desktop.
時系列データの予測をphpnnをしようして作ってみました。effect( 学習率 )がやたらでかいですが、何故かこれでうまく言ったので
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
$output = '../data/timeline_data'; | |
$number = 10000;// 生成するデータ数 | |
$tnum = $number * 0.1;// テストに使用するデータ数 | |
$samples = 32;// 時系列の予測に使用する連続したデータ点の個数 | |
$answers = 10;// 予測する次の連続したデータ点の個数 | |
$raw_data = []; | |
$pi = pi(); | |
// raw_data作成 | |
for ($i = 0; $i < $number; $i++) { | |
$npi = $pi * $i; | |
$temp = sin(0.01 * $npi) + sin(0.03 * $npi) + sin(0.1 * $npi); | |
$temp += sin(0.2 * $npi) + sin(0.3 * $npi); | |
$temp += cos(0.05 * $npi); | |
$raw_data[$i] = $temp / 6; | |
} | |
$data_set = ['trainX' => [], 'trainY' => [], 'testX' => [], 'testY' => []]; | |
for ($i = 0; $i < $number - $samples - $answers; $i++) { | |
$cut = $number - $tnum; | |
$key = ($i > $cut) ? 'test': 'train'; | |
$data_set[$key . 'X'][$i] = array_slice($raw_data, $i, $samples); | |
$data_set[$key . 'Y'][$i] = array_slice($raw_data, $i + $samples, $answers); | |
} | |
$data_set['raw_data'] = $raw_data; | |
file_put_contents($output, serialize($data_set)); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
require '../vendor/autoload.php'; | |
use Niisan\phpnn\layer\Relu; | |
use Niisan\phpnn\layer\Linear; | |
use Niisan\phpnn\layer\HyperbolicTangent; | |
use Niisan\phpnn\bundle\Simple; | |
$data_file = '../data/timeline_data'; | |
$batch_size = 16; | |
$epoch = 10; | |
$effect = 1; | |
$model_filename = '../data/model'; | |
$data_set = unserialize(file_get_contents($data_file)); | |
$trainX = $data_set['trainX']; | |
$trainY = $data_set['trainY']; | |
$testX = $data_set['testX']; | |
$testY = $data_set['testY']; | |
if (file_exists($model_filename)) { | |
$bundle = Simple::load($model_filename); | |
} else { | |
$bundle = new Simple; | |
$bundle->add(new HyperbolicTangent(64), ['input_dim' => 32]); | |
$bundle->add(new Relu(64)); | |
$bundle->add(new Relu(64)); | |
$bundle->add(new HyperbolicTangent(32)); | |
$bundle->add(new Linear(10)); | |
} | |
$bundle->fit([$trainX, $trainY], [ | |
'epoch' => $epoch, | |
'test' => [$testX, $testY], | |
'effect' => $effect, | |
'batch_size' => $batch_size, | |
]); | |
$bundle->save($model_filename); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
require '../vendor/autoload.php'; | |
use Niisan\phpnn\bundle\Simple; | |
$data_file = '../data/timeline_data'; | |
$model_filename = '../data/model'; | |
$csv_file = '../data/compare.csv'; | |
$data_set = unserialize(file_get_contents($data_file)); | |
$raw_data = $data_set['raw_data']; | |
$bundle = Simple::load($model_filename); | |
$start = mt_rand(10, 9500); | |
$sample = array_slice($raw_data, $start, 42); | |
$result = $bundle->exec($sample); | |
$str = ''; | |
for ($i = 0; $i < 32; $i++) { | |
$res = $sample[$i]; | |
$str .= "$i,$res,$res\n"; | |
} | |
for ($i = 0; $i < 10; $i++) { | |
$num = $i + 32; | |
$res = $sample[$num]; | |
$pred = $result[$i]; | |
$str .= "$num,$res,$pred\n"; | |
} | |
file_put_contents($csv_file, $str); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
create_data.phpでサンプルの時系列データを作成します。
learn.phpで学習します。
predict.phpで予測します。
composerでphpnnをインストールしている必要があります。