余弦相似度计算代码
### 余弦相似度计算代码解析 #### 一、引言 余弦相似度是一种用于衡量两个非零向量之间角度的度量方法,广泛应用于信息检索、文本挖掘、推荐系统等领域。它通过计算两个向量之间的夹角余弦值来评估它们之间的相似性:值越接近1表示两向量越相似;值越接近0则表示两向量差异越大。 #### 二、代码解读 本节将详细分析给定的Java代码,并从中提取出关键的知识点。 ##### 2.1 类定义及初始化 代码定义了一个名为`ComputerDecision`的类,用于计算两个字符串表示的向量之间的余弦相似度。 ```java public class ComputerDecision { List<Integer> vector1 = new ArrayList<Integer>(); List<Integer> vector2 = new ArrayList<Integer>(); ``` 此处定义了两个`List<Integer>`类型的变量`vector1`和`vector2`,分别用于存储两个向量的数据。 ```java public ComputerDecision(String string1, String string2) { // ַжոΪһ String[] vector1String = string1.trim().replaceAll("\\s+", "").split(""); String[] vector2String = string2.trim().replaceAll("\\s+", "").split(""); for (String string : vector1String) { vector1.add(Integer.parseInt(string)); } for (String string : vector2String) { vector2.add(Integer.parseInt(string)); } } ``` 构造函数接收两个字符串参数,通过`trim()`去除首尾空格,使用`replaceAll("\\s+", "")`移除中间空格,并通过`split("")`将每个字符分割为独立元素。接着,将每个字符转化为整型数字并添加到对应的列表中。 ##### 2.2 余弦相似度计算方法 ```java public double sim() { double result = 0; result = pointMulti(vector1, vector2) / sqrtMulti(vector1, vector2); return result; } ``` 此方法实现了余弦相似度的基本公式: \[ \text{similarity} = \frac{\sum\limits_{i=1}^{n}(x_i y_i)}{\sqrt{\sum\limits_{i=1}^{n}x_i^2} \cdot \sqrt{\sum\limits_{i=1}^{n}y_i^2}} \] 其中,\(x\) 和 \(y\) 分别表示两个向量,\(n\) 表示向量的长度。该公式通过计算点积与模长乘积的比例得到最终的相似度值。 ##### 2.3 辅助方法 为了方便计算,代码还定义了几个辅助方法。 ```java private double sqrtMulti(List<Integer> vector1, List<Integer> vector2) { double result = 0; result = squares(vector1) * squares(vector2); result = Math.sqrt(result); return result; } ``` 此方法计算两个向量模长的乘积。 ```java private double squares(List<Integer> vector) { double result = 0; for (Integer integer : vector) { result += integer * integer; } return result; } ``` 计算单个向量的模长平方。 ```java private double pointMulti(List<Integer> vector1, List<Integer> vector2) { double result = 0; for (int i = 0; i < vector1.size(); i++) { result += vector1.get(i) * vector2.get(i); } return result; } ``` 计算两个向量的点积。 ##### 2.4 主方法 ```java public static void main(String[] args) { String string = "0011111100000000111000"; String string2 = "0011111100000000111000"; ComputerDecision computerDecition = new ComputerDecision(string, string2); System.out.println(computerDecition.sim()); } ``` 主方法创建`ComputerDecision`对象,并传递两个相同的字符串作为输入,计算并打印它们之间的余弦相似度。由于输入相同,预期输出结果应为1.0。 #### 三、应用场景 余弦相似度的应用场景非常广泛,包括但不限于以下几点: 1. **文本分类**:用于判断两篇文档在内容上的相似程度。 2. **推荐系统**:通过计算用户行为数据(如浏览记录、购买记录等)之间的相似度,为用户推荐可能感兴趣的商品或内容。 3. **信息检索**:搜索引擎利用余弦相似度对查询词与文档的相关性进行评分。 4. **自然语言处理**:如语义相似度计算、情感分析等领域。 5. **图像处理**:基于特征向量的图像检索系统中,可以用来比较不同图像的相似性。 #### 四、注意事项 - 在实际应用中,根据具体情况选择合适的向量化方法,例如TF-IDF(Term Frequency-Inverse Document Frequency)、词袋模型等。 - 对于高维稀疏向量,余弦相似度比欧几里得距离更合适。 - 考虑到性能问题,在处理大规模数据集时,可采用近似算法提高计算效率。 余弦相似度是一种简单有效的相似度度量方法,在多个领域都有广泛应用。通过对上述代码的深入分析,我们可以更好地理解其原理及其在具体场景中的实现方式。
import java.util.ArrayList;
import java.util.List;
public class ComputerDecision {
List<Integer> vector1 = new ArrayList<Integer>();
List<Integer> vector2 = new ArrayList<Integer>();
public ComputerDecision(String string1, String string2) {
//把输入字符串中多个空格变为一个
String[] vector1String = string1.trim().replaceAll("\\s+", " ").split(" ");
String[] vector2String = string2.trim().replaceAll("\\s+", " ").split(" ");
for (String string : vector1String) {
vector1.add(Integer.parseInt(string));
}
for (String string : vector2String) {
vector2.add(Integer.parseInt(string));
}
}
// 求余弦相似度
public double sim() {
double result = 0;
result = pointMulti(vector1, vector2) / sqrtMulti(vector1, vector2);
return result;
}
- 粉丝: 5
- 资源: 64
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
- 1
- 2
- 3
- 4
- 5
前往页