各类数据挖掘算法中,经常需要度量数据对象(属性)的距离和相似度,下面是几种常用的连续属性数据的度量方法。 (1)闵可夫斯基(Minkowski)距离 其中r是一个参数,n是属性/维度的数目, pk 和 qk分别是两个数据对象p和q第k个属性的值。 ①当r = 1时,称为:街区(曼哈顿, 出租车, L1 范数) 距离 ②当r = 2时,称为: 欧几里得距离( L2 范数) ③当r , 称为: “上确界” (Lmax , L 范数) 距离. (2)如果 d1 和 d2 是两个向量数据,那么余弦相似度 cos( d1, d2 ) = (d1 d2) / ||d1|| ||d2|| , 其中 表示向量的点积(内积), || d || 是向量的模(长度) (3)马哈拉诺比斯(Mahalanobis)距离 其中 是输入数据X的协方差矩阵 根据上面距离和相似度的定义,在Distance.py中补充相关代码,并调试通过运行获取计算结果。 (1)实现街区距离的计算函数。(5分) (2)实现欧几里得距离的计算函数。(5分) (3)实现“上确界”距离的计算函数。(5分) (4)实现余弦相似度的计算函数。(15分) (5)实现马哈拉诺比斯(Mahalanobis)距离的计算函数,使用给定的两个向量做属性数据计算协方差,仅计算首尾两个点的距离即可。 (5分)
时间: 2024-03-10 09:44:47 浏览: 274
数据挖掘中的距离度量和相似度度量及Python实现
好的,我明白了你的问题,下面是对应的代码实现:
(1)街区距离的计算函数:
```python
def manhattan_distance(x, y):
"""
计算街区距离(曼哈顿距离)
:param x: 向量x
:param y: 向量y
:return: 两个向量的街区距离
"""
distance = 0
for i in range(len(x)):
distance += abs(x[i] - y[i])
return distance
```
(2)欧几里得距离的计算函数:
```python
import math
def euclidean_distance(x, y):
"""
计算欧几里得距离
:param x: 向量x
:param y: 向量y
:return: 两个向量的欧几里得距离
"""
distance = 0
for i in range(len(x)):
distance += math.pow(x[i] - y[i], 2)
return math.sqrt(distance)
```
(3)上确界距离的计算函数:
```python
def lmax_distance(x, y):
"""
计算上确界距离
:param x: 向量x
:param y: 向量y
:return: 两个向量的上确界距离
"""
distance = 0
for i in range(len(x)):
distance = max(distance, abs(x[i] - y[i]))
return distance
```
(4)余弦相似度的计算函数:
```python
import numpy as np
def cosine_similarity(x, y):
"""
计算余弦相似度
:param x: 向量x
:param y: 向量y
:return: 两个向量的余弦相似度
"""
numerator = np.dot(x, y)
denominator = np.linalg.norm(x) * np.linalg.norm(y)
return numerator / denominator
```
(5)马哈拉诺比斯距离的计算函数:
```python
def mahalanobis_distance(x, y, cov):
"""
计算马哈拉诺比斯距离
:param x: 向量x
:param y: 向量y
:param cov: 协方差矩阵
:return: 两个向量的马哈拉诺比斯距离
"""
first_point = np.array([x[0], y[0]])
last_point = np.array([x[-1], y[-1]])
distance = np.sqrt(np.dot(np.dot((first_point - last_point).T, np.linalg.inv(cov)), first_point - last_point))
return distance
```
希望能对你有所帮助!
阅读全文