def test_pca_increment_noncentred(): pca_samples = [np.random.randn(10) for _ in range(10)] ipca_model = PCAVectorModel(pca_samples[:3], centre=False) ipca_model.increment(pca_samples[3:6]) ipca_model.increment(pca_samples[6:]) bpca_model = PCAVectorModel(pca_samples, centre=False) assert_almost_equal(np.abs(ipca_model.components), np.abs(bpca_model.components)) assert_almost_equal(ipca_model.eigenvalues, bpca_model.eigenvalues) assert_almost_equal(ipca_model.mean(), bpca_model.mean())
def test_pca_increment_noncentred(): pca_samples = [np.random.randn(10) for _ in range(10)] ipca_model = PCAVectorModel(pca_samples[:3], centre=False) ipca_model.increment(pca_samples[3:6]) ipca_model.increment(pca_samples[6:]) bpca_model = PCAVectorModel(pca_samples, centre=False) assert_almost_equal(np.abs(ipca_model.components), np.abs(bpca_model.components)) assert_almost_equal(ipca_model.eigenvalues, bpca_model.eigenvalues) assert_almost_equal(ipca_model.mean(), bpca_model.mean())
def increment(self, samples, n_samples=None, forgetting_factor=1.0, verbose=False): r""" Update the eigenvectors, eigenvalues and mean vector of this model by performing incremental PCA on the given samples. Parameters ---------- samples : `list` of :map:`Vectorizable` List of new samples to update the model from. n_samples : `int`, optional If provided then ``samples`` must be an iterator that yields ``n_samples``. If not provided then samples has to be a list (so we know how large the data matrix needs to be). forgetting_factor : ``[0.0, 1.0]`` `float`, optional Forgetting factor that weights the relative contribution of new samples vs old samples. If 1.0, all samples are weighted equally and, hence, the results is the exact same as performing batch PCA on the concatenated list of old and new simples. If <1.0, more emphasis is put on the new samples. See [1] for details. References ---------- .. [1] David Ross, Jongwoo Lim, Ruei-Sung Lin, Ming-Hsuan Yang. "Incremental Learning for Robust Visual Tracking". IJCV, 2007. """ # build a data matrix from the new samples data = as_matrix(samples, length=n_samples, verbose=verbose) n_new_samples = data.shape[0] PCAVectorModel.increment(self, data, n_samples=n_new_samples, forgetting_factor=forgetting_factor, verbose=verbose)