Удаление переменной не меняет корреляцию между другими переменными. Таким образом, вы можете итеративно удалить переменную с наибольшим числом корреляций выше порогового значения. Возможно, вы захотите посмотреть на уменьшение размерности или важность функций для удаления избыточных переменных.
import numpy as np
np.random.seed(42)
# 100 variables, 100 samples, to make some features
# highly correlated by random chance
x = np.random.random((100, 100))
corr = abs(np.corrcoef(x))
# Set diagonal to zero to make comparison with threshold simpler
np.fill_diagonal(corr, 0)
threshold = 0.3
# Mask to keep track of what is removed
keep_idx = np.ones(x.shape[0], dtype=bool)
for i in range(x.shape[0]):
# Create the mask from the kept indices
mask = np.ix_(keep_idx, keep_idx)
# Get the number of correlations above a threshold.
counts = np.sum(corr[mask] > threshold, axis=0)
print(counts.shape)
if max(counts) == 0:
break
# Get the worst offender and work out what the
# original index was
idx = np.where(keep_idx)[0][np.argmax(counts)]
# Update mask
keep_idx[idx] = False