| 39 | |
| 40 | |
| 41 | class FeatureTransformer: |
| 42 | def __init__(self, env): |
| 43 | # observation_examples = np.array([env.observation_space.sample() for x in range(10000)]) |
| 44 | # NOTE!! state samples are poor, b/c you get velocities --> infinity |
| 45 | observation_examples = np.random.random((20000, 4))*2 - 1 |
| 46 | scaler = StandardScaler() |
| 47 | scaler.fit(observation_examples) |
| 48 | |
| 49 | # Used to converte a state to a featurizes represenation. |
| 50 | # We use RBF kernels with different variances to cover different parts of the space |
| 51 | featurizer = FeatureUnion([ |
| 52 | ("rbf1", RBFSampler(gamma=0.05, n_components=1000)), |
| 53 | ("rbf2", RBFSampler(gamma=1.0, n_components=1000)), |
| 54 | ("rbf3", RBFSampler(gamma=0.5, n_components=1000)), |
| 55 | ("rbf4", RBFSampler(gamma=0.1, n_components=1000)) |
| 56 | ]) |
| 57 | feature_examples = featurizer.fit_transform(scaler.transform(observation_examples)) |
| 58 | |
| 59 | self.dimensions = feature_examples.shape[1] |
| 60 | self.scaler = scaler |
| 61 | self.featurizer = featurizer |
| 62 | |
| 63 | def transform(self, observations): |
| 64 | scaled = self.scaler.transform(observations) |
| 65 | return self.featurizer.transform(scaled) |
| 66 | |
| 67 | |
| 68 | # Holds one SGDRegressor for each action |
no outgoing calls
no test coverage detected