'Inserts new data into the already fitted LSH Forest.
Cost is proportional to new total size, so additions
should be batched.
Parameters
X : array_like or sparse (CSR) matrix, shape (n_samples, n_features)
New data point to be inserted into the LSH Forest.'

def partial_fit(self, X, y=None):

    X = check_array(X, accept_sparse='csr')
    if (not hasattr(self, 'hash_functions_')):
        return self.fit(X)
    if (X.shape[1] != self._fit_X.shape[1]):
        raise ValueError('Number    of    features    in    X    and    fitted    array    does    not    match.')
    n_samples = X.shape[0]
    n_indexed = self._fit_X.shape[0]
    for i in range(self.n_estimators):
        bin_X = self.hash_functions_[i].transform(X)[:, 0]
        positions = self.trees_[i].searchsorted(bin_X)
        self.trees_[i] = np.insert(self.trees_[i], positions, bin_X)
        self.original_indices_[i] = np.insert(self.original_indices_[i], positions, np.arange(n_indexed, (n_indexed + n_samples)))
    if (sparse.issparse(X) or sparse.issparse(self._fit_X)):
        self._fit_X = sparse.vstack((self._fit_X, X))
    else:
        self._fit_X = np.row_stack((self._fit_X, X))
    return self
