Сокращение времени расчета и требований к большой ковариационной матрице

1

В настоящее время я пытаюсь вычислить матрицу ковариации для матрицы строк в 30 тыс. (Все значения находятся в диапазоне [0,1]), и она занимает очень много времени (я позволил ей работать больше и час, и она все еще имеет завершено).

Одна вещь, которую я заметил на более мелких примерах (матрица строк 7k), состоит в том, что выведенные значения имеют смехотворное количество значимых цифр (например, ~ 10 ^ 32) и могут замедлять работу (и увеличивать размер файла) --is там любым способом ограничить это?

Я использую метод ковариации numpys на простом фреймворке данных:

import numpy as np
import pandas as pd
import sklearn as sk

df = pd.read_csv('gene_data/genetic_data25.csv')

df = df.set_index('ID_REF')
df = (df-df.min(axis = 0))/(df.max(axis = 0)-df.min(axis = 0))

cov = np.cov(df)

cov = pd.DataFrame(cov)

cov.to_csv('/gemnetics/cov_matrix.csv')
  • 0
    Сколько столбцов у вашей матрицы? Вывод cov должен быть нормализован, поэтому эти большие числа не имеют смысла. Вы должны знать, если у вас есть прямоугольная матрица с одним измерением намного большим, чем другое (строки в вашем случае), то решение матрицы cov таким способом неэффективно из-за пустых пространств.
  • 0
    в этом случае мы имеем что-то порядка ~ 10 ^ 3 столбцов, так что это не квадратная матрица. Я не думал о пустых местах, спасибо, что удалил это
Показать ещё 3 комментария
Теги:
numpy
statistics

1 ответ

1

Поскольку я не знаком с генетикой, я дам вам общие рекомендации и надеюсь, что это сработает. Предположим, что у вас есть данные в матрице X которая равна 30 + k на 1k. Вам действительно не нужно нормализовать свои данные (если это не имеет для вас значения), но и для вычисления ковариации, которую вы должны сосредоточить на ней. Тогда вы можете вычислить правильные собственные векторы:

Xp=X-X.mean(axis=0,keepdims=True)
k=Xp.T @ Xp
ev,R=np.linalg.eigh(k)
ev=ev[::-1]
R=R[:,::-1]

На этом этапе вы должны посмотреть на собственные значения, чтобы увидеть, есть ли в них резкое падение (это метод Scree), позвольте этому номеру отсечки n. Если нет, то вам просто нужно выбрать, какой процент собственных значений вы хотите сохранить. Следующим шагом будет восстановление левых собственных векторов:

L=X @ R[:,:n]

Теперь RT говорит вам, какая комбинация собственных векторов важна, а собственные векторы (L) являются наиболее заметными комбинациями ваших генов. Надеюсь, это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню