Skip to content

Instantly share code, notes, and snippets.

@niisan-tokyo
Last active October 8, 2017 04:32
Show Gist options
  • Save niisan-tokyo/8c619878048b07f0a46cb682d6eb293f to your computer and use it in GitHub Desktop.
Save niisan-tokyo/8c619878048b07f0a46cb682d6eb293f to your computer and use it in GitHub Desktop.
時系列データの予測をphpnnをしようして作ってみました。effect( 学習率 )がやたらでかいですが、何故かこれでうまく言ったので
<?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));
<?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);
<?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);
@niisan-tokyo
Copy link
Author

create_data.phpでサンプルの時系列データを作成します。
learn.phpで学習します。
predict.phpで予測します。

composerでphpnnをインストールしている必要があります。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment