基于特征的项目相似度
Items Similarity based on their features
我有一个包含项目但没有用户评分的数据集。
项目具有特征(~400 个特征)。
我想根据特征(行相似度)来衡量项目之间的相似度。
我将项目特征转换为二进制矩阵,如 fowlowing
itemID | feature1 | feature2 | feature3 | feature4 ....
1 | 0 | 1 | 1 | 0
2 | 1 | 0 | 0 | 1
3 | 1 | 1 | 1 | 0
4 | 0 | 0 | 1 | 1
我不知道用什么(以及如何使用)来衡量行相似度。
我想为商品 X 获取前 k 个相似商品。
示例代码将不胜感激
您正在寻找的是相似性度量。快速 google/SO 搜索将揭示获得两个向量之间相似性的各种方法。这是 python2 中用于余弦相似度的一些示例代码:
from math import *
def square_rooted(x):
return round(sqrt(sum([a*a for a in x])),3)
def cosine_similarity(x,y):
numerator = sum(a*b for a,b in zip(x,y))
denominator = square_rooted(x)*square_rooted(y)
return round(numerator/float(denominator),3)
print cosine_similarity([3, 45, 7, 2], [2, 54, 13, 15])
取自:http://dataaspirant.com/2015/04/11/five-most-popular-similarity-measures-implementation-in-python/
我注意到您希望每个项目都有前 k 个相似项目。最好的方法是使用 k 最近邻实现。您可以做的是创建一个 knn 图和 return 图中前 k 个相似项以供查询。
一个很棒的库是 nmslib
. Here is some sample code for a knn query from the library 具有余弦相似度的 HNSW 方法(您可以使用几种可用方法中的一种。HNSW 对于高维数据特别有效):
import nmslib
import numpy
# create a random matrix to index
data = numpy.random.randn(10000, 100).astype(numpy.float32)
# initialize a new index, using a HNSW index on Cosine Similarity
index = nmslib.init(method='hnsw', space='cosinesimil')
index.addDataPointBatch(data)
index.createIndex({'post': 2}, print_progress=True)
# query for the nearest neighbours of the first datapoint
ids, distances = index.knnQuery(data[0], k=10)
# get all nearest neighbours for all the datapoint
# using a pool of 4 threads to compute
neighbours = index.knnQueryBatch(data, k=10, num_threads=4)
在代码的末尾,每个数据点的 k 个顶级邻居将存储在 neighbours
变量中。您可以将其用于您的目的。
我有一个包含项目但没有用户评分的数据集。
项目具有特征(~400 个特征)。
我想根据特征(行相似度)来衡量项目之间的相似度。
我将项目特征转换为二进制矩阵,如 fowlowing
itemID | feature1 | feature2 | feature3 | feature4 ....
1 | 0 | 1 | 1 | 0
2 | 1 | 0 | 0 | 1
3 | 1 | 1 | 1 | 0
4 | 0 | 0 | 1 | 1
我不知道用什么(以及如何使用)来衡量行相似度。
我想为商品 X 获取前 k 个相似商品。
示例代码将不胜感激
您正在寻找的是相似性度量。快速 google/SO 搜索将揭示获得两个向量之间相似性的各种方法。这是 python2 中用于余弦相似度的一些示例代码:
from math import *
def square_rooted(x):
return round(sqrt(sum([a*a for a in x])),3)
def cosine_similarity(x,y):
numerator = sum(a*b for a,b in zip(x,y))
denominator = square_rooted(x)*square_rooted(y)
return round(numerator/float(denominator),3)
print cosine_similarity([3, 45, 7, 2], [2, 54, 13, 15])
取自:http://dataaspirant.com/2015/04/11/five-most-popular-similarity-measures-implementation-in-python/
我注意到您希望每个项目都有前 k 个相似项目。最好的方法是使用 k 最近邻实现。您可以做的是创建一个 knn 图和 return 图中前 k 个相似项以供查询。
一个很棒的库是 nmslib
. Here is some sample code for a knn query from the library 具有余弦相似度的 HNSW 方法(您可以使用几种可用方法中的一种。HNSW 对于高维数据特别有效):
import nmslib
import numpy
# create a random matrix to index
data = numpy.random.randn(10000, 100).astype(numpy.float32)
# initialize a new index, using a HNSW index on Cosine Similarity
index = nmslib.init(method='hnsw', space='cosinesimil')
index.addDataPointBatch(data)
index.createIndex({'post': 2}, print_progress=True)
# query for the nearest neighbours of the first datapoint
ids, distances = index.knnQuery(data[0], k=10)
# get all nearest neighbours for all the datapoint
# using a pool of 4 threads to compute
neighbours = index.knnQueryBatch(data, k=10, num_threads=4)
在代码的末尾,每个数据点的 k 个顶级邻居将存储在 neighbours
变量中。您可以将其用于您的目的。