`
googya
  • 浏览: 143374 次
  • 性别: 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): 弦...

    图像特征提取比较相似性

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

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

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

    matlab_2D图像计算骰子相似系数

    函数的输出则是一个DSC值,表示了两个图像之间的相似程度。 `license.txt`文件通常包含软件的使用许可协议,确保在使用`dicesimilarity.m`函数时遵循相关的版权规定。 通过以上描述,我们可以看出,MATLAB中的2D...

    基于GPU加速的图像双向相似性计算.pdf

    双向相似性计算的关键在于计算原图像与缩放图像之间Patch(图像块)的距离,以衡量两者的相似程度。每个Patch由多个像素点组成,完整性要求缩放图像尽可能包含原图像的所有Patch,而一致性则要求缩放图像的每个Patch...

Global site tag (gtag.js) - Google Analytics