Векторное сходство с несколькими типами dtypes (строка, int, поплавки и т.д.)?

#python-3.x #similarity

Вопрос:

У меня есть следующие 2 строки в моем фрейме данных:

 [1, 1.1, -19, "kuku", "lulu"]
[2.8, 1.1, -20, "kuku", "lilu"]
 

Я хочу вычислить их сходство, сравнивая каждое измерение (равно? 1, в противном случае 0) и получите следующий вектор: [0, 1, 0, 1, 0] , существует ли какая-либо функция, которая принимает вектор и выполняет такое «сходство» по всем строкам и вычисляет среднее значение? В нашем случае так оно и было бы 2/5 = 0.4 .

Комментарии:

1. Если вам нужно решение Pandas, вам, вероятно, следует предоставить минимальный воспроизводимый пример, по крайней мере, для входов и выходов.

2. что-то вроде df.corr() ?

Ответ №1:

Я бы просто использовал простые = массивы NumPy для приведения как int для вектора, так и numpy.mean() для среднего значения вектора:

 import numpy as np


a = [1, 1.1, -19, "kuku", "lulu"] 
b = [2.8, 1.1, -20, "kuku", "lilu"]


res = (np.array(a) == np.array(b)).astype(int)
print(res)                                                                                                                                             
# [0 1 0 1 0]
v = res.mean()
print(v)
# 0.4
 

Если вы не против вычислить все дважды и вы можете позволить себе потенциально большие промежуточные временные объекты:

 import numpy as np


arr = np.array([
    [1, 1.1, -19, "kuku", "lulu"],
    [2.8, 1.1, -20, "kuku", "lilu"],
    [2.8, 1.1, -20, "kuku", "lulu"]])


corr = arr[None, :, :] == arr[:, None, :]
score = corr.mean(-1)
print(score)
# [[1.  0.4 0.6]
#  [0.4 1.  0.8]
#  [0.6 0.8 1. ]]
 

Комментарии:

1. Я использовал точно такой же подход, как и вы, но я думал, что в pandas / sklearn есть функция для этого, как у нас для косинусного сходства.

2. @SteveS Вы, вероятно, можете просто повторить вышесказанное с Пандами (возможно, более эффективно), но вам следует предоставить более подробную информацию о вводе/выводе, который у вас есть/который вы хотите.

3. У меня есть вектор и фрейм данных (одинаковые столбцы), и я хочу вычислить сходство вектора с каждой строкой (вектором) в моем фрейме данных, как я делаю это с косинусом.