id size numberOfPlants balcony available publicTransport 0 1191 3 0 1 11 3251 2 1 0 02 1641 1 1 1 03 2133 3 0 0 1
我有一个包含多个列值的数据集,每行代表一个对象。我希望计算所有行之间的余弦相似度,并考虑所有因素,包括大小(size)、植物数量(numberOfPlants)、阳台(balcony,布尔值)、可用性(available,布尔值)和公共交通(publicTransport,布尔值),这些因素的权重相同。如果我输入一个id
,我想得到一个id
,它指向最相似的行。我该如何计算余弦相似度呢?
回答:
您可以使用cosine_similarity来自sklearn。其中target
是您想要查找相似行的任何一行。最好将id
排除在比较之外。
from sklearn.metrics.pairwise import cosine_similarityimport numpy as npdef get_similar_row(rows, target): """返回最相似行的索引""" return np.argmax(cosine_similarity(rows, [target]))get_similar_row([[1191, 3, 0, 1, 1], [3251, 2, 1, 0, 0], [1641, 1, 1, 1, 0]], [2133, 3, 0, 0, 1], top_n=2)
输出将是:1
如果您需要获取top n
个相似的行:
def get_top_n_similar_rows(rows, target, top_n=1): """返回最相似行的前n个索引""" return cosine_similarity(rows, [target]).reshape(1, -1)[0].argsort()[::-1][:top_n]