Используя алгоритм PyOD KNN , я пытаюсь использовать метрику расстояния Махаланобиса, предоставляя ковариационную матрицу в качестве аргумента metric_params
, как указано в документации.Я не уверен, где проблема, но ковариационная матрица не определяется должным образом методом fit
.Любая помощь будет высоко ценится.
Я уже смотрел на Как использовать расстояние Махаланобис в sklearn DistanceMetrics?
Вот некоторые детали.
Я сгенерировал некоторые смоделированные данные, используя функцию полезности PyOD, а затем преобразовал их в pandas DataFrame:
from pyod.utils.data import generate_data
outlier_fraction = 0.1
# generate random data with two features with 10% outliers
X_train, y_train = generate_data(n_train=200,train_only=True, n_features=2, contamination=outlier_fraction)
X_train_df = pd.DataFrame(X_train, columns = ['F1', 'F2'])
X_train_df.head()
Затем я могу легко получить ковариационную матрицу следующим образом:
X_train_cov_df = X_train_df.cov()
X_train_cov_df
Соответствующий массив NumPy: X_train_df.cov().values
.
Затем я создаю экземпляр KNN и вызываю метод fit следующим образом:
from pyod.models.knn import KNN
outlier_fraction = 0.1
clf = KNN(contamination = outlier_fraction, algorithm='auto', metric='mahalanobis', metric_params = {'V' : X_train_df.cov().values})
# fit the dataset to the model
clf.fit(X_train_df)
Я ожидаю, что созданный выше фрагмент кода будет созданподогнанная модель.Тем не менее получена ошибка:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-116-e4a09fa074e5> in <module>
5
6 # fit the dataset to the model
----> 7 clf.fit(X_train_df)
~/.virtualenvs/work/lib/python3.6/site-packages/pyod/models/knn.py in fit(self, X, y)
171 self._set_n_classes(y)
172
--> 173 self.tree_ = KDTree(X, leaf_size=self.leaf_size, metric=self.metric)
174 self.neigh_.fit(X)
175
sklearn/neighbors/binary_tree.pxi in sklearn.neighbors.kd_tree.BinaryTree.__init__()
sklearn/neighbors/dist_metrics.pyx in sklearn.neighbors.dist_metrics.DistanceMetric.get_metric()
sklearn/neighbors/dist_metrics.pyx in sklearn.neighbors.dist_metrics.MahalanobisDistance.__init__()
ValueError: Must provide either V or VI for Mahalanobis distance