Вопрос или проблема
Даны списки $L_1, \dots, L_n$ с, скажем, 2000 значениями каждый, и произвольные числа $c_1, \dots, c_n$. Можно ли сгенерировать случайный список из 2000 значений, который имеет корреляцию $c_i$ с $L_i$ для всех $i$?
Да, вы должны взять значения корреляции из каждого списка и применить случайное правило, чтобы получить ожидаемый результат.
Вот пример с тремя списками:
import random
import numpy as np
# Список списков из n значений
L1 = [10, 12, 32, 23, 12, 25, 10, 6, 8]
L2 = [5, 8, 15, 52, 56, 3, 2, 31, 45]
L3 = [21, 18, 6, 9, 26, 15, 9, 16, 26]
n = len(L1)
# Значения корреляции
c1 = 0.9
c2 = 0.2
c3 = 0.1
L = []
for i in range(0, n):
noise1 = np.random.random()-0.5
noise2 = np.random.random()-0.5
noise3 = np.random.random()-0.5
new_value = ((L1[i]+noise1)*c1 + (L2[i]+noise2)*c2 + (L3[i]+noise3)*c3)/(c1+c2+c3)
L.append(new_value)
# Корреляции между L и первоначальными списками
corr1 = np.corrcoef(L, L1)[0][1]
corr2 = np.corrcoef(L, L2)[0][1]
corr3 = np.corrcoef(L, L3)[0][1]
print(corr1, corr2,corr3)
print(L)
Примечание: вы можете ограничить случайный выбор значениями, ближайшими к i, если хотите сохранить аналогичный порядок.
Ответ или решение
Создание набора значений с заданной корреляцией с другими наборами данных может показаться сложной задачей, однако с помощью программирования и анализа данных можно достичь желаемого результата. Давайте рассмотрим, как это сделать на примере.
Задача:
У нас есть списки (L_1, L_2, \ldots, L_n), каждый из которых содержит по 2000 значений. Для каждого списка задан коэффициент корреляции (c_i). Необходимо создать случайный список из 2000 значений, который будет иметь заданную корреляцию (c_i) с каждым из соответствующих (L_i).
Шаги решения:
-
Генерация случайного списка: Наша задача — создать новый список значений, который будет сочетать в себе элементы из исходных списков с добавлением некоторой случайности, чтобы достичь желаемой корреляции.
-
Вычисление значений с учётом корреляций: Для обеспечения заданной корреляции с каждым из списков, мы применим взвешенное суммирование элементов исходных списков, добавляя небольшую случайную составляющую для придания вариативности.
-
Использование библиотеки
numpy
для расчёта корреляции: После создания нового списка, мы проверяем, соответствует ли полученная корреляция заданным условиям, используя функциюnp.corrcoef
из библиотекиnumpy
.
Пример кода:
import random
import numpy as np
# Исходные списки
L1 = [10, 12, 32, 23, 12, 25, 10, 6, 8]
L2 = [5, 8, 15, 52, 56, 3, 2, 31, 45]
L3 = [21, 18, 6, 9, 26, 15, 9, 16, 26]
n = len(L1)
# Заданные корреляции
c1 = 0.9
c2 = 0.2
c3 = 0.1
# Новый список
new_list = []
for i in range(n):
# Добавляем случайную составляющую
noise1 = np.random.random() - 0.5
noise2 = np.random.random() - 0.5
noise3 = np.random.random() - 0.5
# Вычисляем новое значение на основе средневзвешенной суммы
new_value = ((L1[i] + noise1)*c1 + (L2[i] + noise2)*c2 + (L3[i] + noise3)*c3) / (c1 + c2 + c3)
new_list.append(new_value)
# Проверка корреляции
corr1 = np.corrcoef(new_list, L1)[0][1]
corr2 = np.corrcoef(new_list, L2)[0][1]
corr3 = np.corrcoef(new_list, L3)[0][1]
print(corr1, corr2, corr3)
print(new_list)
В этом примере новый список создается путём взвешивания значений из исходных списков (L1, L2) и (L3), а также случайного добавления «шума», чтобы достичь определённого уровня корреляции.
Заключение:
Этот метод позволяет создать новый набор данных, который имеет заданные параметры корреляции с исходными наборами. Он может быть полезен для моделирования, статистического анализа, а также в тех случаях, когда требуется контролировать перекрестное влияние различных переменных.