def fit(self, data):
""" Learn data, and construct a vector codebook.
Parameters
----------
data : real array-like, shape(n_samples, n_features)
Data matrix, each row represents a sample.
Returns
-------
self : object
The instance itself
"""
[n_samples, _] = data.shape
self.protos = data[self.rng.choice(n_samples, self.n_protos), ]
# avg_p = np.mean(data, 0)
#dist_from_avg_p = np.sum(pairwise_distances(avg_p, data))
#ndistortion = []
for iteration in range(self.iterations):
sample = data[self.rng.choice(n_samples, 1), ]
t = iteration / float(self.iterations)
lrate = self.lrate_i * (self.lrate_f / float(self.lrate_i)) ** t
epsilon = self.epsilon_i * (self.epsilon_f / float(self.epsilon_i)) ** t
D = pairwise_distances(sample, self.protos, metric='euclidean', n_jobs=self.n_jobs)
I = np.argsort(np.argsort(D))
H = np.exp(-I / epsilon).ravel()
diff = sample - self.protos
for proto_id in range(self.n_protos):
self.protos[proto_id, :] += lrate * H[proto_id] * diff[proto_id, :]
#nbrs = NearestNeighbors(n_neighbors=1, algorithm='auto').fit(protos)
#distances, _ = nbrs.kneighbors(data)
#ndistortion.append( np.sum(distances) / dist_from_avg_p )
return self
评论列表
文章目录