在数据挖掘中经常会计算相似度,用java实现了欧几里得和皮尔逊算法
1、欧几里得
找出可以作为衡量物品或人的数,作为坐标,最后计算坐标之间的距离L
最后计算: r = 1/(1 + L) r属于[0, 1] 1表示完全相似, 0代表没有共同点
java的实现:
package com.euclid.sosop; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; /** * * @author sosop * euclid approximate 欧几里得距离计算,相似度算法之一 * */ public class EuclidApproximate { /** * Map的key为label,value为坐标值 * 只有相同的label才参与计算 */ public static double distance(Map<String, Double> map1, Map<String, Double> map2) { //平方和 double sum = 0; int common = 0; for (Entry<String, Double> entry : map1.entrySet()) { //判断是否具有共同处 if(map2.containsKey(entry.getKey())) { //(x-y)的平方和 sum += Math.pow(entry.getValue() - map2.get(entry.getKey()), 2); common ++; } } //没有共同处 if(common == 0) return 0; //近似度 [0, 1] 1:完全近似 //较简单的计算相似度,朴素相似度 // double sim = 1 / (Math.sqrt(sum) + 1); //较精确的计算 double sim = Math.sqrt(sum/(double) common); sim = 1.0 - Math.tanh(sim); int max = Math.min(map1.size(), map2.size()); sim = sim * ((double)common / (double)max); return sim; } public static void main(String[] args) { Map<String, Double> map1 = new HashMap<>(); map1.put("a", 10.88); map1.put("b", 2.5); map1.put("c", 0.9); map1.put("d", 20.76); map1.put("e", 6.3); Map<String, Double> map2 = new HashMap<>(); map2.put("a", 10.5); map2.put("b", 2.1); map2.put("c", 0.9); map2.put("d", 20.22); map2.put("e", 6.1); System.out.println(distance(map1, map2)); } }
2、皮尔逊
关键在于一条拟合直线。
将所有作为衡量的数在坐标上标记出来,画一条离所有坐标最近的直线就是拟合直线。
最佳拟合线的优势在于不会受到噪声的影响很小
计算相对于欧几里得较复杂
取值范围:[-1, 1] 小于0, 负相关的 ; 大于0,正相关;取绝对值找相似度 |r|越大, 相似度越高
下面是java实现的算法:
package com.pearson.sosop; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; /** * * @author sosop * pearson approximate 皮尔逊相似度算法 * */ public class Pearson { public static double coefficient(Map<String, Double> map1, Map<String, Double> map2) { //找到共同之处,保存于List List<String> same = new ArrayList<>(); for (Entry<String, Double> entry : map1.entrySet()) { if (map2.containsKey(entry.getKey())) { same.add(entry.getKey()); } } //共同数目 int items = same.size(); if(items == 0) return 0; double sum1 = 0, sum2 = 0, sqrtSum1 = 0, sqrtSum2 = 0, pSum = 0; for (String label : same) { sum1 += map1.get(label); sum2 += map2.get(label); sqrtSum1 += Math.pow(map1.get(label), 2); sqrtSum2 += Math.pow(map2.get(label), 2); pSum += (map1.get(label) * map2.get(label)); } double num, den; num = pSum - (sum1 * sum2 / items); den = Math.sqrt((sqrtSum1 - Math.pow(sum1, 2) / items) * (sqrtSum2 - Math.pow(sum2, 2) / items)); if(den == 0) return 0; return num / den; } public static void main(String[] args) { Map<String, Double> map1 = new HashMap<>(); map1.put("a", 0.5); map1.put("b", 3.1); map1.put("c", 7.9); map1.put("d", 0.22); map1.put("e", 0.1); Map<String, Double> map2 = new HashMap<>(); map2.put("a", 10.88); map2.put("b", 2.5); map2.put("c", 0.9); map2.put("d", 20.76); map2.put("e", 6.3); System.out.println(coefficient(map1, map2)); } }
相关推荐
网络安全期末复习资料最新整理-计算机安全导论_欧几里得求mod逆元_PPT_网络安全_考试要点_问题汇总等.zip 它包含了一些网络安全方面的复习笔记、算法实现以及考试要点等内容。 主要功能点 提供网络安全相关的复习...
在本主题“OpenCV---基于欧几里得距离计算公式的图像二值化实现”中,我们将深入探讨如何利用OpenCV库,结合欧几里得距离的概念,对图像进行二值化处理。 OpenCV(Open Source Computer Vision Library)是一个开源...
在实验中选取了七个红外云图像的维度特征进行分类,这些特征包括均值、标准差、平滑度、三阶矩、一致性、熵和与清晰图像的相关性。这些特征的选择是依据Calbó的方法推荐的。研究人员随机选取了每种类别的50%、60%...
6. **计算近似熵**:ApEn定义为: \[ ApEn = -\log\left(\frac{C(m, r)}{C(m+1, r)}\right) \] 通过对不同m值下的ApEn值进行平均,可以得到最终的近似熵。 7. **结果解释**:较小的ApEn值通常表示系统更有序,更...
先定义欧几里得距离函数;先定义皮尔逊系数函数,利用for循环把皮尔逊系数公式的各个组成部分算出来,计算皮尔逊系数,调用函数计算皮尔逊系数。
这些概念是理解和应用高级算法的基础,特别是当处理非欧几里得数据时,如图像特征、生物信号或者网络结构。让我们详细探讨这些关键知识点。 首先,"欧氏距离"是最基础的距离度量方式,源自欧几里得几何。在二维或更...
这个压缩包文件包含了一些与皮尔逊相关系数计算相关的MATLAB代码,如`distance.m`, `distancee.m`, `Myfloydw.m` 和 `Myfloyd.m`,这些脚本可能用于执行实际的计算。 首先,让我们深入了解皮尔逊相关系数的定义和...
在二维空间中,两个点\( (x_1, y_1) \)和\( (x_2, y_2) \)之间的欧几里得距离计算公式为: \[ d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2} \] 在QAM中,每个信号点代表一对幅度和相位,因此计算的是复数之间的距离。 ...
扩展欧几里得算法是数论中的一个经典算法,它主要用于求解线性同余方程,例如找寻满足\( ax \equiv b \mod m \)的x值。...在编程竞赛和实际项目中,熟练使用扩展欧几里得算法可以提高问题解决的效率和质量。
在计算近似熵时,我们需要将这些数值按照时间顺序排列,形成一个一维的时间序列。 2. **窗口大小**(m): 窗口大小是计算近似熵时的关键参数,它决定了我们比较相邻数据点的子序列长度。通常,选择的m值应该足够...
- 完全多项式近似方案更进一步,计算时间同时与1/ε和n成多项式关系,ε是允许的误差范围。 5. 实际问题的应用举例:欧几里得旅行商问题 - 给定平面上的顶点和它们之间的欧几里得距离,旅行商问题要求找出经过每...
近似熵(Approximate Entropy, ApEn)是一种复杂性度量方法,常用于时间序列分析,特别是医学信号处理和金融数据分析等领域。...通过学习和理解近似熵的计算过程,我们可以更好地理解和处理各种复杂数据集。
在多目标优化问题中,拥挤度计算是一种常用的技术,它被用于评估和比较解空间中的个体,特别是在进化算法如NSGA-II(非支配排序遗传算法第二代)中。"crowding_distance_distance_拥挤度计算_"这个标题暗示我们将...
从最基本的数论问题到复杂的工程和科学计算,欧几里得算法及其拓展版本都在扮演着不可或缺的角色。通过对这一算法的深入理解,我们不仅能更加熟练地掌握数论的基础,也能在众多领域中发现更多创新的解决方案。
在压缩包中的`EuclideanAlgorithm.cpp`和`extend_Eulid.cpp`文件可能分别包含了基本欧几里得算法和扩展欧几里得算法的实现。`.exe`文件则是编译后的可执行程序,用户可以直接运行查看算法的执行结果,这对于初学者...
利用扩展欧几里得方法,进行快速的计算C(n,m)%P;
当a,b,且a互质时,计算ax+by=1的值, 是计算RSA密钥的基本步骤之一。
欧几里得算法,源于古希腊数学家欧几里得的一项发现,是一种高效计算两个正整数最大公约数(Greatest Common Divisor, GCD)的方法,通常被称为辗转相除法。算法的核心在于通过连续的除法步骤,将大数不断除以小数,...
通过这个例子可以看出,欧几里得算法通过不断地替换和计算余数,最终能够高效地找到两个数的最大公约数。 #### 总结 欧几里得算法是一种高效、简洁的方法,用于计算两个正整数的最大公约数。它基于递归性质和分解...