Использование коэффициентов корреляции (Пирсон) для уменьшения размерности [Python]

Я использую этот ответ, чтобы найти корреляцию коэффициенты, превышающие заданный предел, f, в матрице (ndarray), имеющей форму (29421, 11001) [т.е. 29 421 строка и 11 001 столбец].

Я адаптировал код следующим образом (случайный бит выбирает один из двух столбцов для удаления; кроме того, строки, соответствующие связанному ответу, имеют после них "###"):

ПРОБЛЕМА: Я получаю тысячи коэффициентов корреляции больше 1 ... Что, по моему мнению, не должно происходить?

  rand = random()
  rows = dataset_normalized.shape[0] ###
  print("Rows: " + str(dataset_normalized.shape[0]) + ", Columns: " + str(dataset_normalized.shape[1]))
  ms = dataset_normalized.mean(axis=1)[(slice(None, None, None), None)] ###
  datam = dataset_normalized - ms ###
  datass = np.sqrt(scipy.stats.ss(datam, axis=1)) ###
  correlations = {}
  percent_rand_one = 0
  percent_rand_zero = 0
  for i in range(rows): ###
    if(0 in datass[i:] or datass[i] == 0):
      continue
    else:
      temp = np.dot(datam[i:], datam[i].T) ###
      rs = temp / (datass[i:] * datass[i]) ###
      for counter, corr in enumerate(rs):
        if(corr > 1 or corr < -1):
          # ERROR IS HERE: This is printing right now, 
          # a lot, so I'm not sure what's happening?
          print("Correlation of " + str(corr) + " on " + str(i) + " and " + str(counter) + ".") 
          print("Something went wrong. Correlations calculated were either above 1 or below -1.")
        elif(corr > f or corr < f):
          rand_int = randint(1, 100)
          if(rand_int > 50):
            correlations[counter] = corr
            percent_rand_one += 1
          else:
            correlations[i] = corr          
            percent_rand_zero += 1

Есть совет или мысли?


person user3684314    schedule 13.07.2016    source источник


Ответы (1)


Разобрался ... и это самое странное. Мне просто нужно было перевернуть ось.

  # Create correlations.
  dataset_normalized_switched = np.swapaxes(dataset_normalized, 0, 1)
  columns = dataset_normalized_switched.shape[0] ### This is the major change...
  ms = dataset_normalized_switched.mean(axis=1)[(slice(None, None, None), None)]
  datam = dataset_normalized_switched - ms
  datass = np.sqrt(scipy.stats.ss(datam, axis=1))
  correlations = {}
  for i in range(columns):
    temp = np.dot(datam[i:], datam[i].T)
    with warnings.catch_warnings():
      warnings.filterwarnings('ignore')
      rs = temp / (datass[i:] * datass[i])
      correlations[i] = [(index + i) for index, value in enumerate(rs) if (index != 0 and abs(value) < 1.1 and abs(value) > f)]
person user3684314    schedule 25.07.2016