Как получить вторую производную/падение из графика или сгенерировать лучшее значение EPS

Набор данных ниже

 ,id,revenue ,profit
0,101,779183,281257
1,101,144829,838451
2,101,766465,757565
3,101,353297,261071
4,101,1615461,275760
5,101,246731,949229
6,101,951518,301016
7,101,444669,430583

Код ниже

import pandas as pd;
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt
import numpy as np
from sklearn.preprocessing import StandardScaler
import seaborn as sns
from sklearn.neighbors import NearestNeighbors
df = pd.read_csv('1.csv',index_col=None)
df1 = StandardScaler().fit_transform(df)
dbsc = DBSCAN(eps = 2.5, min_samples = 20).fit(df1)
labels = dbsc.labels_

Моя форма df 1999

Я получил значение наклона eps из приведенного ниже метода, из графика видно, что eps = 2,5

введите здесь описание изображения

Ниже приведен метод поиска наилучшего значения EPS.

ns = 5
nbrs = NearestNeighbors(n_neighbors=ns).fit(df3)
distances, indices = nbrs.kneighbors(df3)
distanceDec = sorted(distances[:,ns-1], reverse=True)
plt.plot(indices[:,0], distanceDec)
#plt.plot(list(range(1,2000)), distanceDec)
  • Как система автоматически находит провал на графике, когда ожидается лучшее eps? не глядя на график, моя система должна сказать лучше всего eps

person Community    schedule 17.06.2020    source источник
comment
В этой статье представлен алгоритм, который автоматически присваивает значения eps и min_samples: ijisae .org/IJISAE/article/view/649/pdf   -  person Hugolmn    schedule 22.06.2020


Ответы (1)


Если я правильно понимаю, вы ищете точное значение y точки перегиба, появляющееся на вашем графике ε(x) (оно должно быть около 2,0), верно?

Если это верно, поскольку ε(x) ваша кривая, проблема сводится к следующему:

  1. Вычислите вторую производную вашей кривой: ε''(x).
  2. Найдите ноль (или нули) такой второй производной: x0.
  3. Восстановите оптимизированное значение ε, просто вставив ноль в вашу кривую: ε(x0).

Здесь я прикрепляю свой ответ, основанный на этих двух других ответах на переполнение стека: https://stackoverflow.com/a/26042315/10489040 (вычислить производную массива) https://stackoverflow.com/a/3843124/10489040 (найти ноль в множество)

import numpy as np
import matplotlib.pyplot as plt

# Generating x data range from -1 to 4 with a step of 0.01
x = np.arange(-1, 4, 0.01)

# Simulating y data with an inflection point as y(x) = x³ - 5x² + 2x
y = x**3 - 5*x**2 + 2*x

# Plotting your curve
plt.plot(x, y, label="y(x)")

# Computing y 1st derivative of your curve with a step of 0.01 and plotting it
y_1prime = np.gradient(y, 0.01)
plt.plot(x, y_1prime, label="y'(x)")

# Computing y 2nd derivative of your curve with a step of 0.01 and plotting it
y_2prime = np.gradient(y_1prime, 0.01)
plt.plot(x, y_2prime, label="y''(x)")

# Finding the index of the zero (or zeroes) of your curve
x_zero_index = np.where(np.diff(np.sign(y_2prime)))[0]

# Finding the x value of the zero of your curve
x_zero_value = x[x_zero_index][0]

# Finding the y value corresponding to the x value of the zero
y_zero_value = y[x_zero_index][0]

# Reporting
print(f'The inflection point of your curve is {y_zero_value:.3f}.')

введите здесь описание изображения

В любом случае имейте в виду, что точка перегиба (около 2,0) не совпадает с точкой падения около 2,5.

person Gian Arauz    schedule 27.06.2020