| 67 | |
| 68 | # Holds one SGDRegressor for each action |
| 69 | class Model: |
| 70 | def __init__(self, env, feature_transformer): |
| 71 | self.env = env |
| 72 | self.models = [] |
| 73 | self.feature_transformer = feature_transformer |
| 74 | for i in range(env.action_space.n): |
| 75 | model = SGDRegressor(feature_transformer.dimensions) |
| 76 | self.models.append(model) |
| 77 | |
| 78 | def predict(self, s): |
| 79 | X = self.feature_transformer.transform(np.atleast_2d(s)) |
| 80 | result = np.stack([m.predict(X) for m in self.models]).T |
| 81 | return result |
| 82 | |
| 83 | def update(self, s, a, G): |
| 84 | X = self.feature_transformer.transform(np.atleast_2d(s)) |
| 85 | self.models[a].partial_fit(X, [G]) |
| 86 | |
| 87 | def sample_action(self, s, eps): |
| 88 | if np.random.random() < eps: |
| 89 | return self.env.action_space.sample() |
| 90 | else: |
| 91 | return np.argmax(self.predict(s)) |
| 92 | |
| 93 | |
| 94 | def play_one(env, model, eps, gamma): |