Я пытаюсь вычислить матрицу рассеяния между кластерами. Чтобы сделать это, для каждого кластера (называемого «группа» в примере ниже) мне нужно выполнить операцию, которая приводит к матрице, а затем выполнить поэлементное добавление матриц из каждого кластера.
Для этого я пытаюсь сделать следующее:
import pandas as pd
import numpy as np
df = pd.DataFrame({'group': [1, 2, 1, 0, 0, 0, 1, 2],
'A': [1.5, 0.5, 2.5, 0.5, 1.5, 0.5, 1.5, 0.5],
'B': [3.5, 2.5, 3.5, 2.5, 3.5, 2.5, 3.5, 2.5]})
features = list(df.columns)
features.remove('group')
def g(x, mu):
y = np.array([np.mean(x) - mu])
print((y.T @ y)*len(x))
print("")
return (y.T @ y)*len(x)
m = len(df.index)
mu = df.groupby('group')[features].apply(lambda x: (np.multiply(x.count(), np.mean(x)))/m).sum()
print("mu:")
print(mu)
Sb = df.groupby('group')[features].apply(g, mu=(mu)).sum()
В этом примере выдается ошибка TypeError: Series.name must be a hashable type
в последней строке. Оператор print в функции g
показывает ожидаемый результат, см. Ниже, поэтому я считаю, что ошибка связана с операцией .sum()
.
[[0.2553 0.1458]
[0.1458 0.0833]]
[[1.5052 1.0625]
[1.0625 0.75 ]]
[[0.7912 0.625 ]
[0.625 0.5 ]]
Результат, который я ожидал, добавив * Операция 1012 * была поэлементным добавлением трех вышеприведенных матриц.
Ожидаемый результат:
[[2.5416 1.8333]
[1.8333 1.3333]]
Любые идеи, почему это дает мне ошибку и что я могу сделать, чтобы исправить это?
Обновление 1: Использование:
Sb = df.groupby('group').apply(g, mu=(mu)).sum()
вместо
Sb = df.groupby('group')[features].apply(g, mu=(mu)).sum()
дает правильную матрицу, дополненную нансами. Почему features
вызывает ошибку?