def cluster(self, u, ndim, keepMetric=False):
w = self.metric.transform(u)
prev_region = self.region
if keepMetric:
self.region = RadFriendsRegion(members=w)
if self.force_shrink and self.region.maxdistance > self.prev_maxdistance:
self.region = RadFriendsRegion(members=w, maxdistance=self.prev_maxdistance)
self.prev_maxdistance = self.region.maxdistance
print 'keeping metric, not reclustering.'
return
metric_updated = False
clustermetric = self.metric
print 'computing distances for clustering...'
# Overlay all clusters (shift by cluster mean)
print 'Metric update ...'
cluster_mean = numpy.mean(u, axis=0)
shifted_cluster_members = u - cluster_mean
# Using original points and new metric, compute RadFriends bootstrapped distance and store
if self.metriclearner == 'none':
metric = self.metric # stay with identity matrix
metric_updated = False
elif self.metriclearner == 'simplescaling':
metric = SimpleScaling()
metric.fit(shifted_cluster_members)
metric_updated = True
elif self.metriclearner == 'truncatedscaling':
metric = TruncatedScaling()
metric.fit(shifted_cluster_members)
metric_updated = self.metric == IdentityMetric() or not numpy.all(self.metric.scale == metric.scale)
else:
assert False, self.metriclearner
self.metric = metric
wnew = self.metric.transform(u)
print 'Region update ...'
self.region = RadFriendsRegion(members=wnew) #, maxdistance=shifted_region.maxdistance)
if not metric_updated and self.force_shrink and self.prev_maxdistance is not None:
if self.region.maxdistance > self.prev_maxdistance:
self.region = RadFriendsRegion(members=w, maxdistance=self.prev_maxdistance)
self.prev_maxdistance = self.region.maxdistance
print 'done.'
评论列表
文章目录