How to compute the distance of data points to decision boundary when using the EllipticEnvelope of sklearn?

Viewed 41

How can I compute the euclidean distance to the boundary decision of the EllipticEnvelope? Here is my code :

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.covariance import EllipticEnvelope
from sklearn.model_selection import train_test_split

feature, output = "temperature", "consumption"

data = pd.DataFrame(np.random.normal(0,15, size=(2355,2)), columns=[feature, output])

X = data[[feature, output]]
X_train, X_test = train_test_split(X, shuffle=True, train_size=0.8)

model = EllipticEnvelope(contamination=0.18)
model.fit(X_train)

# extract the model predictions
y_pred = pd.Series(model.predict(X), index=X.index, name="anomaly")

# define the meshgrid : X = (u,v).T
u_min, u_max = X_train.iloc[:, 0].min() - 1.5, X_train.iloc[:, 0].max() + 1.5
v_min, v_max = X_train.iloc[:, 1].min() - 1.5, X_train.iloc[:, 1].max() + 1.5

n_points = 500
u = np.linspace(u_min, u_max, n_points)
v = np.linspace(v_min, v_max, n_points)

U, V = np.meshgrid(u, v)

# evaluate the decision function on the meshgrid
W = model.decision_function(np.c_[U.ravel(), V.ravel()])
W = W.reshape(U.shape)

plt.figure(figsize=(20,6))
a = plt.contour(U, V, W, levels=[0], linewidths=2, colors="black")
b = plt.scatter(X.loc[y_pred == 1].iloc[:, 0], X.loc[y_pred == 1].iloc[:, 1], c="yellowgreen", edgecolors='k')
c = plt.scatter(X.loc[y_pred == -1].iloc[:, 0], X.loc[y_pred == -1].iloc[:, 1], c="tomato", edgecolors='k')
plt.legend([a.collections[0], b, c], ['learned frontier', 'regular observations', 'abnormal observations'], bbox_to_anchor=(1.05, 1))
plt.axis('tight')
plt.show()

Edits

I am able to get the decision boundary points using the following code. Now, the problem can be solved by computing numerically the distance.

for item in a.collections:
    for i in item.get_paths():
        v = i.vertices
        x = v[:, 0]
        y = v[:, 1]
  1. I have an obvious solution. Getting all data points d and compute the euclidean distance between d and e=(x,y). But, it is a brute-force technique.. :D I will continue my research !

  2. Another solution would be to fit an ellipse and compute the distance using the formula described by @epiliam there : https://math.stackexchange.com/questions/3670465/calculate-distance-from-point-to-ellipse-edge

  3. I will provide one solution tomorrow based on the brute-force. It seems to work well for small dataset (n_rows < 10000). I did not test for larger ones.

0 Answers
Related