Python 二进制值使用哪种距离度量?

Python 二进制值使用哪种距离度量?,python,machine-learning,math,cluster-analysis,k-means,Python,Machine Learning,Math,Cluster Analysis,K Means,我有100个用户喜欢/不喜欢500个项目。 因此,我用二进制值转换了矩阵,也就是说,如果用户u1喜欢一个项目I1,那么该值为1,如果他不喜欢该项目,那么该值为0 矩阵如下所示: 所以,现在我需要对喜欢相似项目的相似用户进行聚类。我使用K模式聚类对它们进行聚类,但我的轮廓分数很低。我不确定应该使用哪种距离度量。 欧几里德距离不是解决这个问题的好方法。如果我的数据集很大,Jaccard距离也不是很有效。为了降低模型的成本,我应该使用哪些其他距离度量可以考虑使用“Hamming距离”来查找距离。有关

我有100个用户喜欢/不喜欢500个项目。 因此,我用二进制值转换了矩阵,也就是说,如果用户u1喜欢一个项目I1,那么该值为1,如果他不喜欢该项目,那么该值为0

矩阵如下所示:

所以,现在我需要对喜欢相似项目的相似用户进行聚类。我使用K模式聚类对它们进行聚类,但我的轮廓分数很低。我不确定应该使用哪种距离度量。

欧几里德距离不是解决这个问题的好方法。如果我的数据集很大,Jaccard距离也不是很有效。为了降低模型的成本,我应该使用哪些其他距离度量 < P>可以考虑使用“Hamming距离”来查找距离。有关在scipy库中实现的方法,请参阅文档。

处理此类数据的常用方法是使用非负矩阵分解(NMF)。粗略地说,这意味着将矩阵分解为n x k和k x m矩阵,将用户映射到因子,并将因子映射到喜好。

处理此类数据的常用方法是使用非负矩阵分解(NMF)。粗略地说,这意味着将矩阵分解为n x k和k x m矩阵,将用户映射到因子,将因子映射到喜好。

严格地回答这个问题,我建议使用
余弦
哈明
距离。但在此之前,我想问一下你是如何建立这个矩阵的?通常在二进制值的地方,你有实数,你通过计算一个“项目”和一个“用户”之间的相似性得分来得到这些数字。我想这是相关的,那里的答案可以用在这里?@Siddhantandon我用过余弦和汉明。数值仍然很差。我不知道如何提高我的轮廓分数。为了构建矩阵,我使用了dataset.pivot\u table()函数。我使用了preprocessing.LabelEncoder()并将其应用于pivot_表。下面是您感兴趣的代码片段<代码>pivot\u table=dataset.pivot\u table(value='Checked',index='USERID',columns='ITEMID')。fillna(0);le=预处理。LabelEncoder();pivot\u table=pivot\u table.apply(le.fit\u transform)@PH,因此如果用户喜欢该项目,您只需获得信息
yes
,如果用户不喜欢,则获得信息
no
。没有关于
项目的其他信息
?如果您有一些文本要处理,通常必须使用
tf-idf
东西构建
item
配置文件。@siddhantandon。没有,没有关于物品的信息。仅存在itemID和itemName。我不需要了解更多关于项目的信息,因为我正在对喜欢类似项目的用户进行聚类。因此,只有“喜欢/不喜欢”的信息才足以对它们进行聚类!而且,没有文本可供使用!很容易将itemID与其itemDescription集成。但是,我不需要知道。因此,我将其从数据帧中删除。严格地回答这个问题,我建议
cosine
hamming
距离。但在此之前,我想问一下你是如何建立这个矩阵的?通常在二进制值的地方,你有实数,你通过计算一个“项目”和一个“用户”之间的相似性得分来得到这些数字。我想这是相关的,那里的答案可以用在这里?@Siddhantandon我用过余弦和汉明。数值仍然很差。我不知道如何提高我的轮廓分数。为了构建矩阵,我使用了dataset.pivot\u table()函数。我使用了preprocessing.LabelEncoder()并将其应用于pivot_表。下面是您感兴趣的代码片段<代码>pivot\u table=dataset.pivot\u table(value='Checked',index='USERID',columns='ITEMID')。fillna(0);le=预处理。LabelEncoder();pivot\u table=pivot\u table.apply(le.fit\u transform)@PH,因此如果用户喜欢该项目,您只需获得信息
yes
,如果用户不喜欢,则获得信息
no
。没有关于
项目的其他信息
?如果您有一些文本要处理,通常必须使用
tf-idf
东西构建
item
配置文件。@siddhantandon。没有,没有关于物品的信息。仅存在itemID和itemName。我不需要了解更多关于项目的信息,因为我正在对喜欢类似项目的用户进行聚类。因此,只有“喜欢/不喜欢”的信息才足以对它们进行聚类!而且,没有文本可供使用!很容易将itemID与其itemDescription集成。但是,我不需要知道。因此,我已将其从数据框中删除。谢谢。但是,无论如何,这并没有改善轮廓分数。如果我们使用正确的距离度量,该模型将工作得最好,即它将形成正确的集群。此外,为10000个用户计算该距离可能需要很多时间。Hamming是最便宜的度量。甚至比欧几里得距离更简单。在二进制数据上,它只是在单个时钟周期内执行的
XOR
POPCNT
指令……但如果数据存储为只包含0和1的整数向量,欧几里德距离几乎相同,精确地说是sqrt(哈明).@HasQUIT——一个不知名的摩丝,但欧几里德距离给了我一个较低的分数,而且没有任何改善。当您在回答中提到“将矩阵分解为n x k和k x m矩阵,将用户映射到因子,将因子映射到喜欢的对象”时,我可以在用户矩阵n x k矩阵上运行k-modes来查找类似的用户吗?谢谢。但是,无论如何,这并没有改善轮廓分数。如果我们使用正确的距离度量,该模型将工作得最好,即它将形成正确的集群。此外,为10000个用户计算该距离可能需要很多时间。Hamming是最便宜的度量。甚至比欧几里得距离更简单。在二进制数据上,它只是在单个c中执行的
XOR
POPCNT
指令