Создание матрицы совпадений - PullRequest
0 голосов
/ 03 августа 2020
    | 0                 | 1                 | 2                 | 3
_______________________________________________________________________________
|0  | (-1.774, 1.145]   | (-3.21, 0.533]    |(0.0166, 2.007]    | (2.0, 3.997]
_______________________________________________________________________________
|1  | (-1.774, 1.145]   | (-3.21, 0.533]    | (2.007, 3.993]    | (2.0, 3.997]
_______________________________________________________________________________

Я пытаюсь создать матрицу совместного появления набора данных, как указано выше, с 800 записями и 12 категориальными переменными. Я пытаюсь создать матрицу совместной встречаемости каждой категории из каждой переменной в каждую категорию из других переменных

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Вы можете сделать это прямым способом, используя OneHotEncoder() и np.dot()

  1. Превратите каждый элемент в кадре данных в строку
  2. Используйте однократный кодировщик для преобразования фрейма данных в одноразовые по уникальному словарю категориальных элементов
  3. Возьмите скалярное произведение с собой, чтобы получить количество совпадений
  4. Воссоздать фрейм данных с использованием матрицы совпадения и feature_names от одного горячего кодировщика
#assuming this is your dataset
                 0               1                2             3
0  (-1.774, 1.145]  (-3.21, 0.533]  (0.0166, 2.007]  (2.0, 3.997]
1  (-1.774, 1.145]  (-3.21, 0.533]   (2.007, 3.993]  (2.0, 3.997]
from sklearn.preprocessing import OneHotEncoder

df = df.astype(str) #turn each element to string

#get one hot representation of the dataframe
l = OneHotEncoder() 
data = l.fit_transform(df.values)

#get co-occurance matrix using a dot product
co_occurance = np.dot(data.T, data)

#get vocab (columns and indexes) for co-occuance matrix
#get_feature_names() has a weird suffix which I am removing for better readibility here
vocab = [i[3:] for i in l.get_feature_names()]

#create co-occurance matrix
ddf = pd.DataFrame(co_occurance.todense(), columns=vocab, index=vocab)
print(ddf)
                 (-1.774, 1.145]  (-3.21, 0.533]  (0.0166, 2.007]  \
(-1.774, 1.145]              2.0             2.0              1.0   
(-3.21, 0.533]               2.0             2.0              1.0   
(0.0166, 2.007]              1.0             1.0              1.0   
(2.007, 3.993]               1.0             1.0              0.0   
(2.0, 3.997]                 2.0             2.0              1.0   

                 (2.007, 3.993]  (2.0, 3.997]  
(-1.774, 1.145]             1.0           2.0  
(-3.21, 0.533]              1.0           2.0  
(0.0166, 2.007]             0.0           1.0  
(2.007, 3.993]              1.0           1.0  
(2.0, 3.997]                1.0           2.0  

Как вы можете убедиться из выходных данных выше, это именно то, какой должна быть матрица совпадения.

Преимущества этого подхода в том, что вы можете масштабировать это, используя метод transform объекта one-hot encoder, и большая часть обработки происходит в разреженных матрицах до последнего шага создания фрейма данных, чтобы его память была эффективной.

0 голосов
/ 03 августа 2020

Предположим, ваши данные находятся во фрейме данных df.

Затем вы можете сделать это с двумя циклами по фрейму данных и двумя циклами по каждой строке фрейма данных следующим образом:

from collections import defaultdict

co_occrence = defaultdict(int)    
for index, row in df.iterrows(): 
    for index2, row2 in df.iloc[index + 1:].iterrows():
        for row_index, feature in enumerate(row):
            for feature2 in row2[row_index + 1:]:
              co_occrence[feature, feature2] += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...