Вам дана матрица
X — список списков с числовыми признаками. Один или несколько признаков были случайно сгенерированы, и не несут полезной информации (то есть, они не коррелируют ни с одним другим).Нужно реализовать функцию
drop_random_features(X, threshold=0.05), которая вернёт индексы признаков, слабо коррелирующих со всеми остальными (по модулю корреляции Пирсона).Если признак не коррелирует ни с одним другим больше, чем на
threshold, он считается псевдослучайным и подлежит удалению.Цель:
Найти признаки, которые не имеют статистической связи с другими и потенциально являются шумом. Возвращать нужно их индексы.
Решение задачи🔽
import numpy as np
def drop_random_features(X, threshold=0.05):
X = np.array(X)
n_features = X.shape[1]
to_drop = []
for i in range(n_features):
max_corr = 0
for j in range(n_features):
if i != j:
corr = abs(np.corrcoef(X[:, i], X[:, j])[0, 1])
max_corr = max(max_corr, corr)
if max_corr < threshold:
to_drop.append(i)
return to_drop
# Пример использования
np.random.seed(42)
X = np.column_stack([
np.linspace(1, 10, 100), # линейный
np.linspace(10, 1, 100), # обратный
np.random.rand(100), # шум
np.linspace(5, 50, 100) + np.random.rand(100) * 0.1 # почти линейный
])
print(drop_random_features(X, threshold=0.2))
# Ожидаемый результат: [2] — третий признак случайный