У меня есть функция, которая обновляет центроид (среднее) в алгоритме K-средних.Я запустил профилировщик и заметил, что эта функция использует много вычислительного времени.
Похоже:
def updateCentroid(self, label):
X=[]; Y=[]
for point in self.clusters[label].points:
X.append(point.x)
Y.append(point.y)
self.clusters[label].centroid.x = numpy.mean(X)
self.clusters[label].centroid.y = numpy.mean(Y)
Так что я думаю, есть ли более эффективный способ для вычисления среднего значенияэти точки?Если нет, есть ли более элегантный способ сформулировать это?;)
РЕДАКТИРОВАТЬ:
Спасибо за все отличные ответы!Я думал, что, возможно, я смогу вычислить среднее значение совокупно, используя что-то вроде:
, где x_bar (t) - новое среднее значение, а x_bar (t-1) - старое среднее значение.
Что может привести к функции, подобной этой:
def updateCentroid(self, label):
cluster = self.clusters[label]
n = len(cluster.points)
cluster.centroid.x *= (n-1) / n
cluster.centroid.x += cluster.points[n-1].x / n
cluster.centroid.y *= (n-1) / n
cluster.centroid.y += cluster.points[n-1].y / n
Это на самом деле не работает, но вы думаете, это может работать с некоторыми настройками?