【Educoder数据挖掘实训】相似度与相异度

2024-03-13 17:52

本文主要是介绍【Educoder数据挖掘实训】相似度与相异度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【Educoder数据挖掘实训】相似度与相异度

开挖!!!!!!

T1 用相关系数计算直线之间的相似度

这关分为没啥关系的三部分,分别是欧几里得相关系数、余弦相关系数和泊松相关系数。
他们的公式都比较直观:
欧几里得相关系数的计算方式是按照对应点的相对距离来算的,也就是 d ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 d(x,y) = \sqrt{\sum\limits_{i = 1}^{n}(x_i - y_i)^2} d(x,y)=i=1n(xiyi)2 .
余弦相关系数则将两个数据看做两个 n n n维向量,计算方式为: c o s ( θ ) = ∑ i = 1 n ( x i × y i ) ∑ i = 1 n x i 2 ∑ i = 1 n y i 2 cos(\theta) = \frac{\sum\limits_{i = 1}^n (x_i\times y_i)}{\sum\limits_{i = 1}^{n}x_i^2\sum\limits_{i = 1}^{n}y_i^2} cos(θ)=i=1nxi2i=1nyi2i=1n(xi×yi)
泊松相关系数将两个数据看成是数据集,计算方式为: ρ X Y = E ( ( X − E X ) ( Y − E Y ) ) D X D Y \rho_{XY} = \frac{E((X - EX)(Y - EY))}{\sqrt{DX}\sqrt{DY}} ρXY=DX DY E((XEX)(YEY))

其中第一部分代码只需要按照公式复刻一遍即可。
泊松部分的代码需要认真看一眼实训,实训给出的样例中提及了日期,只需要复制另一个人的日期即可。
代码如下:

# 欧几里得相关系数
def euclidean(p, q):# 如果两数据集数目不同,计算两者之间都对应有的数same = 0for i in p:if i in q:same += 1# 计算欧几里德距离,并将其标准化# ***********Begin**********e = sum([(p[i] - q[i]) ** 2 for i in range(same)])# ************End***********   return 1 / (1 + e ** 0.5)
print("欧几里得计算出的相似度为",euclidean([1, 2, 3, 4, 5], [2, 4, 6,8, 10]))
# 余弦相似度
def cosine_similarity(x, y):xx = 0.0yy = 0.0xy = 0.0for i in range(len(x)):xx += x[i] * x[i]yy += y[i] * y[i]xy += x[i] * y[i]xx_sqrt = xx ** 0.5yy_sqrt = yy ** 0.5cos = xy/(xx_sqrt*yy_sqrt)return cos
print('余弦相关系数计算出的相似度为',cosine_similarity([5,3],[5,8]))
#泊松相关系数
import scipy
import numpy
from scipy.stats import pearsonr
########## Begin ##########
x =numpy.array([0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1])
########## End ##########
y =numpy.array([1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,3])
r_row, p_value = pearsonr(x, y)
print ("用户(UID)84001033与用户(UID)84001003从2004/1/20到4/20/20这段日期的相似度为",r_row)

T2 基于相似度度量的商品推荐

这一关主要提及了 J a c c a r d Jaccard Jaccard 公式和余弦相似度,并在代码里要求复现余弦相似度的过程。

这个过程的核心思想是,将用户的喜欢商品列表转换成:每个商品被哪些用户喜欢。
我们将喜欢列表成为表 1 1 1,被喜欢列表成为表 2 2 2
在构造系数的时候,对于两个不同的用户取二者表 1 1 1的交集计算数量加到一个横纵元素都为全体用户的表中,例如用户 A A A和用户 B B B共同喜欢三个商品 a , b , c a,b,c a,b,c,那么空表中 ( A , B ) , ( B , A ) (A,B),(B,A) (A,B),(B,A)都为 3 3 3
然后我们用余弦计算公式把该表中所有整数都计算为余弦相似度。

对于每个用户 P P P在推荐商品的时候,对于一个商品 x x x x x x的表 2 2 2中每一个用户除去 P P P的余弦值加在一起,成为 x x x的推荐度。取所有 P P P的表 1 1 1里没有的商品中推荐值最大的商品推荐给 P P P即可。

# (一):找到与目标用户兴趣相似的用户集合
########## Begin ##########
# 目标用户(A用户喜欢a、b、d商品)
target_user = {'A':['a','b','d']}
print(f'目标用户:{target_user}')
# 相似用户用户()
alike_user = {'B': ['a','c'],'C': ['b','e'],'D':['c','d','e']}
print(f'相似用户:{alike_user}')
########## End ##########
# 倒排表
"""
a A B C
"""
# 总共商品类型
key_value = []
value1 = target_user.values()
for item in value1:for good in item:# 如果不再就添加到键值if good not in key_value:key_value.append(good)
value2 = alike_user.values()
########## Begin ##########
for item in value2:for good in item:if good not in key_value:key_value.append(good)
print(f'总共商品类型:{key_value}')
########## End ##########
new_table = []
for good in key_value:new_dict = {}user_list = []# 目标用户key_value_list = target_user.items()# print(key_value_list)for key_value in key_value_list:key = key_value[0]value = key_value[1]if (good in value) & (key not in user_list):user_list.append(key)# new_dict[good] = user_list# new_table.append(new_dict)# 相似用户key_value_list = alike_user.items()# print(key_value_list)for key_value in key_value_list:key = key_value[0]value = key_value[1]if (good in value) & (key not in user_list):user_list.append(key)new_dict[good] = user_listnew_table.append(new_dict)
print(new_table)
########## Begin ##########
# 计算余弦相似度
import pandas as pd
import numpy as np
df = pd.DataFrame(data=np.zeros((4,4)), columns=['A','B','C','D'],index=['A','B','C','D'])
print(df)
# 统计交集
for item in new_table:print(list(item.values())[0])label = list(item.values())[0]x = label[0]y = label[1]df.loc[x,y] = df.loc[x,y] + 1df.loc[y,x] = df.loc[y,x] + 1
print(df)
########## End ##########
# 计算两两之间的相似度
count_list = {}
for i in ['A','B','C','D']:count = df.loc[i,:].sum()count_list[i] = count
print(count_list)
# 计算余弦相似度
########## Begin ##########
for i in ['A','B','C','D']:for j in ['A', 'B', 'C', 'D']:df.loc[i,j] = df.loc[i,j] / np.sqrt(count_list[i] * count_list[j])
########## End ##########
print(df)
########## Begin ##########
# 计算p(A,c)和p(A,e)
p_Ac = df.loc['A','B'] + df.loc['A','D']
print(f'p(A,c):{p_Ac}')
p_Ae = df.loc['A','C'] + df.loc['A','D']
print(f'p(A,e):{p_Ae}')
########## End ##########
if p_Ac > p_Ae:print("用户A对c商品更感兴趣,将e商品推荐给A")
elif p_Ac < p_Ae:print("用户A对e商品更感兴趣,将e商品推荐给A")
else:print("用户A对c商品和e商品同样感兴趣!")

补充:

  1. 代码里有个明显笔误,无论如何都推荐商品 e e e
  2. 这种推荐方法其实很容易有两个商品的值都一样的情况,当然在本题本题中不会出现。一般我们应对这种问题的处理方法就是将两个商品打包或者继续继续观察这两个商品的受众。

这篇关于【Educoder数据挖掘实训】相似度与相异度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/805699

相关文章

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

研一实训总结

说长不长说短不短的一个月,从最开始的激动到期间,要中期要兼顾找实习准备笔试面试的焦虑,再到最后一周的加班加点和总结,收获和感触还是蛮多的。 首先,这一个月让我更加全面的认知了完成一个从无到有项目的过程,激发了我对自己工程师职业生涯的向往和对自己有了更广的除了编码以外的要求。 我一直是一个结果导向和追求效率的人,所以在团队合作过程中我们也经历了最开始的不知所措,到争执,再到主动配合和贡献,这个过

线性代数 第六讲 特征值和特征向量_相似对角化_实对称矩阵_重点题型总结详细解析

文章目录 1.特征值和特征向量1.1 特征值和特征向量的定义1.2 特征值和特征向量的求法1.3 特征值特征向量的主要结论 2.相似2.1 相似的定义2.2 相似的性质2.3 相似的结论 3.相似对角化4.实对称矩阵4.1 实对称矩阵的基本性质4.2 施密特正交化 5.重难点题型总结5.1 判断矩阵能否相似对角化5.2 已知两个矩阵相似,求某个矩阵中的未知参数5.3 相似时,求可逆矩阵P,使

SimD:基于相似度距离的小目标检测标签分配

摘要 https://arxiv.org/pdf/2407.02394 由于物体尺寸有限且信息不足,小物体检测正成为计算机视觉领域最具挑战性的任务之一。标签分配策略是影响物体检测精度的关键因素。尽管已经存在一些针对小物体的有效标签分配策略,但大多数策略都集中在降低对边界框的敏感性以增加正样本数量上,并且需要设置一些固定的超参数。然而,更多的正样本并不一定会带来更好的检测结果,事实上,过多的正样本

Matlab)实现HSV非等间隔量化--相似判断:欧式距离--输出图片-

%************************************************************************** %                                 图像检索——提取颜色特征 %HSV空间颜色直方图(将RGB空间转化为HS

【python 走进NLP】两两求相似度,得到一条文本和其他文本最大的相似度

应用场景: 一个数据框里面文本,两两求相似度,得到一条文本和其他文本最大的相似度。 content source_id0 丰华股份军阀割据发生的故事大概多少w 11 丰华股份军阀割据发生的故事大概多少 22 丰华股份军阀割据发生的故事大概多少 33 丰华股份军阀割据发生的故事大概多少

【java 走进NLP】simhash 算法计算两篇文章相似度

python 计算两篇文章的相似度算法simhash见: https://blog.csdn.net/u013421629/article/details/85052915 对长文本 是比较合适的(超过500字以上) 下面贴上java 版本实现: pom.xml 加入依赖 <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</a

【python 走进NLP】simhash 算法计算两篇文章相似度

互联网网页存在大量的重复内容网页,无论对于搜索引擎的网页去重和过滤、新闻小说等内容网站的内容反盗版和追踪,还是社交媒体等文本去重和聚类,都需要对网页或者文本进行去重和过滤。最简单的文本相似性计算方法可以利用空间向量模型,计算分词后的文本的特征向量的相似性,这种方法存在效率的严重弊端,无法针对海量的文本进行两两的相似性判断。模仿生物学指纹的特点,对每个文本构造一个指纹,来作为该文本的标识,从形式上来

【python 走进NLP】文本相似度各种距离计算

计算文本相似度有什么用? 1、反垃圾文本的捞取 “诚聘淘宝兼职”、“诚聘打字员”…这样的小广告满天飞,作为网站或者APP的运营者,不可能手动将所有的广告文本放入屏蔽名单里,挑几个典型广告文本,与它满足一定相似度就进行屏蔽。 2、推荐系统 在微博和各大BBS上,每一篇文章/帖子的下面都有一个推荐阅读,那就是根据一定算法计算出来的相似文章。 3、冗余过滤 我们每天接触过量的信息,信息之间存在大量

【python 走进NLP】句子相似度计算--余弦相似度

余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值,绘制到向量空间中,如最常见的二维空间。 github 参考链接:https://github.com/ZhanPwBibiBibi/CHlikelihood # -*- coding: utf-8 -*-import jiebaimport numpy as npimpor