`
googya
  • 浏览: 144100 次
  • 性别: Icon_minigender_1
  • 来自: 汉川
社区版块
存档分类
最新评论

计算相似程度、推荐

阅读更多
        在聚类分析中,尤其是文本聚类中通常要进行2对象间的相似性的比较,以便于将相似程度大的归为一组。这样的结果就是,一个组内的对象相似度大,而不同组之间对象的相似性小。这个就是所谓的聚类。以下说说在文本中聚类的实现。为了将文本分组,首先要将文本的相似性计算出来(我用的是22比较)。这时候的相似性就要有一个参照,这个标准通常是2文本中相同或相似字符。如果相同字符的次数与2文本的总长度之和的比较大的话,就认为这2个文本是相似的,否则,不相似。这种方式的效率不高(每2个文本都要进行比较,复杂度是n^2,n为文本的数量),但是比较出来的效果很可观。


   下面是一个与此有关的代码片段:

include Math
#将那本书上的字典数据结构转换成Ruby的hash也不容易啊,要进行替换。先转换成字符串s,把s中的:用=>取代,再把\n去掉,这才成为下面的结果
critics={'Lisa Rose'=> {'Lady in the Water'=> 2.5, 'Snakes on a Plane'=> 3.5, 'Just My Luck'=> 3.0, 'Superman Returns'=> 3.5, 'You, Me and Dupree'=> 2.5, 'The Night Listener'=> 3.0},'Gene Seymour'=> {'Lady in the Water'=> 3.0, 'Snakes on a Plane'=> 3.5, 'Just My Luck'=> 1.5, 'Superman Returns'=> 5.0, 'The Night Listener'=> 3.0, 'You, Me and Dupree'=> 3.5},'Michael Phillips'=> {'Lady in the Water'=> 2.5, 'Snakes on a Plane'=> 3.0, 'Superman Returns'=> 3.5, 'The Night Listener'=> 4.0},'Claudia Puig'=> {'Snakes on a Plane'=> 3.5, 'Just My Luck'=> 3.0, 'The Night Listener'=> 4.5, 'Superman Returns'=> 4.0, 'You, Me and Dupree'=> 2.5},'Mick LaSalle'=> {'Lady in the Water'=> 3.0, 'Snakes on a Plane'=> 4.0, 'Just My Luck'=> 2.0, 'Superman Returns'=> 3.0, 'The Night Listener'=> 3.0, 'You, Me and Dupree'=> 2.0},'Jack Matthews'=> {'Lady in the Water'=> 3.0, 'Snakes on a Plane'=> 4.0, 'The Night Listener'=> 3.0, 'Superman Returns'=> 5.0, 'You, Me and Dupree'=> 3.5},'Toby'=> {'Snakes on a Plane'=>4.5,'You, Me and Dupree'=>1.0,'Superman Returns'=>4.0}}

def sim_distance(prefs,person1,person2)
		si={}
		prefs[person1].each_key do |k1|
			if prefs[person2].include? k1
					si[k1]=1
			end
		end
		
		return 0  if si.size==0
		sum=0
		prefs[person1].each_key do |k1|
					if prefs[person2].include? k1
						sum+=(prefs[person1][k1]-prefs[person2][k1])**2
					end
		end
		1/(1+sum)
end
	
#p sim_distance(critics,'Lisa Rose','Gene Seymour')
#p sim_distance(critics,'Lisa Rose','Michael Phillips')
#p sim_distance(critics,'Lisa Rose','Claudia Puig')
#p sim_distance(critics,'Lisa Rose','Mick LaSalle')
#p sim_distance(critics,'Lisa Rose','Jack Matthews')
#p sim_distance(critics,'Lisa Rose','Toby')
		
	def find_most_similar(lis)#将hash中值最大的那一对找出来
		most={}
		max=0
		#lis=lis.sort
			lis.each_key do |k1|
				lis.each_key do |k2|
					if k1<k2 && k1 && k2						
							most["#{k1}" +" & "+ "#{k2}"]=sim_distance(lis,k1,k2)#这里有个问题,hash中存在重复。如何消除
						
					end
				end
			end
			most.each_key do|k|
				if most[k]>max
					max=most[k]
				end
			end
			#most.sort{|a,b|a[1]<=>b[1]}#这样就变成二维数组了
			most.each_pair do |k,v|
				puts "#{k}"+" "*(35-"#{k}".size)+": "+"#{v}"
			end
			
			[most.index(max),max]			
	end 
	 
	#p find_most_similar(critics)
	#p critics.size
	
	
	def sim_person(prefs,p1,p2)
			si={}
			prefs[p1].each_key do |k1|
				if prefs[p2].include? k1
						si[k1]=1
				end
			end
			n=si.size
		return 0  if n==0
		
		sum1=0
		sum2=0
		sum1Sq=0
		sum2Sq=0
		pSum=0
		si.each_key do |k|
			sum1+=prefs[p1][k]
			sum2+=prefs[p2][k]
			sum1Sq+=prefs[p1][k]**2
			sum2Sq+=prefs[p2][k]**2
			pSum+=prefs[p1][k]*prefs[p2][k]			
		end
		num=pSum-(sum1*sum2/n)
		den=sqrt((sum1Sq-sum1**2/n)*(sum2Sq-sum2**2/n))
		return 0 if den==0
		num/den	
	end
	
	
	#p sim_person(critics,'Lisa Rose','Gene Seymour')
	def topMatcher(prefs,person,n=5)
		scores=[]
		prefs.each_key do |k|
			if person!=k
				scores << [sim_person(prefs,person,k),k]
			end
		end
		scores=scores.sort.reverse
		scores[0...3]
	end
	#p topMatcher(critics,'Toby',n=3)
	
	
	def getRecommendations(prefs,person,t=self.method(:sim_person))
		totals={}
		simSums={}
		prefs.each_key do |other|
			if other==person
				next
			end
			
			sim=t.call(prefs,person,other)
			if sim<=0
				next
			end
			
			prefs[other].each_key do |item|
				if !prefs[person].include?(item)  || prefs[person][item]==0
					totals[item]||=0
					totals[item]+=prefs[other][item]*sim
					simSums[item]||=0
					simSums[item]+=sim
				end
			end
		end
		
		rankings=[]
		totals.each_pair do |item,total|
			rankings<<[total/simSums[item],item]
		end
		rankings.sort
		rankings.reverse
		rankings		
	end
	#t=self.method(:sim_distance)#t=self.method(:sim_person)
	#p t
	#p getRecommendations(critics,'Toby')
	
	
	def transformPrefs(prefs)
		result={}
		prefs.each_key do |person|
			prefs[person].each_key do |item|
				result[item]||={}
				result[item][person]=prefs[person][item]
			end
		end
		result
	end
	
	#p transformPrefs(critics)




      对于文本的话,要对文中出现的字符进行比较(当然还包括去除停用词之类的)。方法与此相似。
0
1
分享到:
评论

相关推荐

    图片质量评价参数FSIM计算代码-图片相似性参数FSIM源码-特征相似性FSIM-图片相似性评价参数FSIM计算

    FSIM(Feature Similarity,特征相似性)这是用于计算图片质量或者对比两张图片相似性的一个评价参数,相比于PSNR(峰值信噪比)、SSIM(结构相似性)这个两个广泛使用的图像质量评价参数,FSIM更能体现图片之间的...

    判断相似程度

    在IT领域,图像处理是一项重要的技术,而计算图像的相似程度是其中的关键环节。本项目以MATLAB编程语言实现,旨在通过投影熵这一指标来衡量两幅图像的相似度。投影熵是一种信息理论中的概念,它能有效地反映出数据...

    python写的文本文件相似度批量对比工具,可以批量计算两组文本或者代码文件之间的相似程度

    指定两组文件所在的文件夹,生成文件的清单默认保存在d盘下,然后可以批量计算两组文本或者代码文件之间的相似程度,计算结果默认保存在d盘,结果给出的是每行两个文件的相似程度根据对比数量生成多行数据,由于计算...

    大规模游戏社交网络节点相似性算法及其应用-4-2 Akulaku 智能计算系统及应用.zip

    1. **个性化推荐**:通过计算玩家之间的相似性,可以推荐他们可能感兴趣的游戏、道具或活动,提高用户黏性和活跃度。 2. **社交网络分析**:识别紧密的玩家群体,理解他们的互动模式,为游戏设计提供依据。 3. **...

    基于纹理的图像相似性计算

    在图像处理和计算机视觉领域,基于纹理的图像相似性计算是一项关键的技术,它涉及到如何量化和比较两张图像中纹理特征的相似程度。本程序是对现有技术的一种改进,旨在提高比较的准确性和效率,同时为学习者提供了一...

    海量文档相似性计算引擎方案

    在本方案中,通过计算文档A与其他文档SimHash值的海明距离,可以快速判断出文档间的相似程度。如果文档间的海明距离小于或等于设定阈值,那么这两个文档就会被判定为相似文档。 再者,中文分词是自然语言处理中的一...

    matlab软件中基于相关系数的计算来检测相似波形.zip

    在波形分析中,我们希望通过计算两个波形的关联程度来判断它们是否相似。 在MATLAB中,可以使用`corrcoef`函数来计算两个向量(即波形)的相关系数。这个函数返回一个二维矩阵,对角线上的元素是每个向量与自身的...

    停车场相似车牌的计算--减少积分

    这些算法可以计算出两个车牌在字符层面的编辑距离或共现特征,从而确定它们的相似程度。 2. **特征提取与匹配**:对车牌进行预处理,提取关键特征,如汉字的形状、字母的大小写等,然后使用机器学习模型进行特征...

    面向相似App推荐的列表式多核相似性学习算法.pdf

    现有的推荐方法通常基于App的元信息,如名称、描述、截图和用户评论等,通过计算这些元信息的相似度来确定App之间的关联程度。 传统的方法可能只关注App的绝对相似性或基于三元组的相似性,但在实际推荐场景中,...

    使用 OpenCV 和 Python 检测两个图像的相似程度(SIFT算法,包括代码和数据)

    在图像处理领域,比较两幅图像的相似程度是一项常见的任务,尤其在计算机视觉、图像识别和内容检索等应用中。本教程将详细讲解如何利用OpenCV库和Python编程语言实现SIFT(Scale-Invariant Feature Transform,尺度...

    机器学习-余弦相似度计算图片相似性

    通过比较图片特征向量之间的夹角余弦值,我们可以判断图片内容的相似程度。这篇博文链接()可能详细介绍了如何利用余弦相似度来分析和比较图像。 首先,我们需要理解余弦相似度的基本概念。在二维或高维空间中,两...

    颜色直方图相似性测试_图像相似度计算_图像_

    直方图相似性测试是一种基于统计的方法,它通过分析图像像素值的分布来评估图像之间的相似程度。这种方法的核心是利用图像的色彩直方图,一种表示图像中不同颜色或灰度等级出现频率的图表。 图像A和图像B的直方图,...

    弦相似算法计算 短文本相似度

    "弦相似算法计算 短文本相似度"这一主题,主要关注如何通过特定的算法来评估两段短文本之间的相似程度。这里我们将详细探讨弦相似性算法以及它在处理短文本时的应用。 1. 弦相似性(Levenshtein Distance): 弦...

    已知子女与父母相似关系的模糊矩阵R和父母与祖父母相似关系的模糊矩阵S分别如下所示,求子女与祖父母的相似关系模糊矩阵

    题目给出的情况是,我们有两个模糊矩阵:R代表子女与父母之间的相似关系,而S代表父母与祖父母之间的相似关系。我们的目标是根据这两个矩阵推导出子女与祖父母之间的相似关系模糊矩阵,可以将其表示为T。 模糊矩阵...

    numpy 计算两个数组重复程度的方法

    最近有个需求,是做两个数组重复程度计算,麻烦就麻烦在单个数组的元素有可能重复,处理思路如下: 1. 找到重复元素 2. 元素个数统计,利用np.bincount转换,即元素个数统计到元素转化的索引 3. 统计相同元素匹配个...

    图像特征提取比较相似性

    在VC6.0环境下,开发者需要编写代码读取图像资源,执行Sobel变换,计算相似性,并可能使用调试工具进行问题定位。程序中提到的"CompareDiffer"可能是一个比较差异的函数或类,用于比较两幅图像的特征差异。 总结来...

    基于 PCA 的运动数据相似性计算

    比较不同运动数据之间相似程度,这种方法基于主成分分析方法,对运动数据进行 PCA 计算,得到表示该运 动数据主轴方向的特征向量和对应的特征值,将运动数据之间的相似性比较转换为对其主轴方向重合程度的 比较,给出了...

Global site tag (gtag.js) - Google Analytics