Вы можете сделать это прямым способом, используя OneHotEncoder()
и np.dot()
- Превратите каждый элемент в кадре данных в строку
- Используйте однократный кодировщик для преобразования фрейма данных в одноразовые по уникальному словарю категориальных элементов
- Возьмите скалярное произведение с собой, чтобы получить количество совпадений
- Воссоздать фрейм данных с использованием матрицы совпадения и
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, и большая часть обработки происходит в разреженных матрицах до последнего шага создания фрейма данных, чтобы его память была эффективной.