案例学习
import numpy as np
import json
import os.path
from collections import OrderedDict
# if config file not exists, use this default config
default_config = """{
"input": {
"nodes": 2,
"functions":
[
"lambda x: np.sin(128 * np.pi * x)",
"lambda x: x"
],
"length": 5000
},
"reservoir": {
"start_node": 95,
"end_node": 100,
"step": 2,
"degree_function": "lambda x: np.sqrt(x)",
"sigma": 0.5,
"bias": 1,
"leakage_rate": 0.3,
"regression_parameter": 1e-8
},
"output": {
"nodes": 2
},
"training": {
"init": 1000,
"train": 3000,
"test": 2000,
"error": 1000
}
}"""
class Reservoir:
def __init__(self):
config_file_name = 'reservoir.config'
global config
if os.path.isfile(config_file_name):
with open(config_file_name) as config_file:
config = json.load(config_file, object_pairs_hook=OrderedDict)
else:
config = json.loads(default_config, object_pairs_hook=OrderedDict)
print('Config file not exist, using default config instead!')
# Input layer
self.M = config["input"]["nodes"]
self.input_len = config["input"]["length"]
self.input_func = []
dataset = []
for i in range(self.M):
self.input_func.append(eval(config["input"]["functions"][i]))
dataset.append(self.input_func[i](
np.arange(self.input_len) / self.input_len))
self.dataset = np.array(list(zip(*dataset))).T # shape = (M, length)
# Reservoir layer
self.start_node = config["reservoir"]["start_node"]
self.N = self.start_node
self.step = config["reservoir"]["step"]
self.end_node = config["reservoir"]["end_node"]
self.degree_func = eval(config["reservoir"]["degree_function"])
self.D = self.degree_func(self.start_node)
self.sigma = config["reservoir"]["sigma"]
self.bias = config["reservoir"]["bias"]
self.alpha = config["reservoir"]["leakage_rate"]
self.beta = config["reservoir"]["regression_parameter"]
# Output layer
self.P = config["output"]["nodes"]
# Training relevant
self.init_len = config["training"]["init"]
self.train_len = config["training"]["train"]
self.test_len = config["training"]["test"]
self.error_len = config["training"]["error"]
# Invoke automatically when exit, write the progress back to config file
def exit_handler():
global config
with open('reservoir.config', 'w') as config_file:
config_file.write(json.dumps(config, indent = 4))
print('Program finished! Current node = ' +
str(config["reservoir"]["start_node"]))
if __name__ == '__main__':
atexit.register(exit_handler)
比较有意思的是可以读取函数,然后生成数据
func_str = "lambda x: np.sin(x/np.pi)"
N = 20
data = eval(func_str)(np.arange(N)/N)
输出:
array([0. , 0.01591482, 0.03182561, 0.04772834, 0.06361898,
0.07949351, 0.0953479 , 0.11117814, 0.12698022, 0.14275013,
0.15848389, 0.1741775 , 0.18982699, 0.2054284 , 0.22097778,
0.23647118, 0.25190469, 0.26727439, 0.28257638, 0.29780681])