Есть ли способ обнаружить горб в линейных данных?Python

Программы на Python
Ответить
Anonymous
 Есть ли способ обнаружить горб в линейных данных?

Сообщение Anonymous »

У меня есть набор данных x и y. На графике данные являются линейными, за исключением определенного участка, где данные отклоняются от прямой линии, что-то вроде горба. Моя цель — разработать процедуру, которая идентифицирует точки горба (т. е. те точки, которые отклоняются от прямой линии). Прикрепленное изображение показывает именно то, чего я хочу достичь.
Изображение

Я попытался подогнать линейную линию тренда к введенным данным, вычислив остатки и исключив участок с большими остатками; однако мой подход оказался не очень успешным. Линия тренда, похоже, не проходит через нужные точки. Вот мой код:

Код: Выделить всё

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# Data provided
x = np.array([134, 147, 161, 175, 190, 206, 222, 237, 251, 263, 275, 291, 300, 312, 324, 337, 349, 360, 372, 382]).reshape(-1, 1)
y = np.array([0.788875116, 0.692846919, 0.605305046, 0.738780558, 0.826074803, 0.871572936, 0.776701184,
0.646403726, 0.677606953, 0.615950052, 0.357934847, 0.267171728, 0.217483944, 0.155336037,
0.071882007, 0.029383778, -0.008773924, -0.050609993, -0.102372909, -0.148741651])

# Fit linear regression
model = LinearRegression()
model.fit(x, y)
y_pred = model.predict(x)

# Calculate residuals
residuals = y - y_pred
std_dev = np.std(residuals)

# Identify hump points by adjusting alpha
alpha = 2 / 3
threshold = std_dev * alpha
hump_points = np.where(np.abs(residuals) > threshold)[0]

# Visualize
plt.figure(figsize=(12, 6))
plt.plot(x, y, 'o-', label='Data', markersize=6)
plt.plot(x, y_pred, 'r--', label='Fitted Line', linewidth=2)
plt.axhline(0, color='gray', linestyle='--', label='Zero Residual')
plt.scatter(x[hump_points], y[hump_points], color='orange', label='Hump Point', s=100)
plt.legend()
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Detecting Hump in Data')
plt.grid(True)
plt.show()

# Print hump points
hump_info = [(x[point][0], y[point]) for point in hump_points]
Изображение


Подробнее здесь: https://stackoverflow.com/questions/792 ... inear-data
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»