Scipy是一个开源的python算法库和数据工具包 scipy包含的模块有最优化,线性代数,积分,插值,特殊函数,快速傅里叶变换,信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。

使用距离度量 研究在欧式空间和非欧式空间里的距离向量 欧式空间

  • Lr-Norm距离
  • 余弦距离

非欧式空间

  • Jaccard距离
  • Hamming距离

在Numpy中,array用于表示通用的N维空间,Matrix则特定用于线性代数 使用array时,运算符*用于计算数量积(点乘),函数.dot()计算矢量积


In [1]:
# 使用距离度量
import numpy as np
# 定义欧式距离
def euclidean_distance(x,y):
    if len(x)==len(y):
        return np.sqrt(np.sum(np.power((x-y),2)))
    else:
        print u'应该输入相同的长度'
    return None

In [2]:
# 定义Lr-Norm距离
def lrNorm_distance(x,y,power):
    if len(x)==len(y):
        return np.power(np.sum(np.power((x-y),power)),(1/(1.0*power)))
    else:
        print u'应该输入相同的长度'
    return None

In [3]:
# 定义余弦距离
def cosine_distance(x,y):
    if len(x)==len(y):
        return np.dot(x,y)/np.sqrt(np.dot(x,x)*np.dot(y,y))
    else:
        print u'请输入相同的长度'
    return None

In [4]:
def jaccard_distance(x,y):
    set_x = set(x)
    set_y = set(y)
    return 1 - len(set_x.intersection(set_y))/len(set_x.union(set_y))

In [5]:
# 
def hamming_distance(x,y):
    diff = 0
    if len(x) == len(y):
        for cha1,cha2 in zip(x,y):
            if cha1!=cha2:
                diff +=1
        return diff
    else:
        print u'请输入相同的长度'
    return None

In [7]:
# 主函数调用上述定义的函数
if __name__ == "__main__":
    # 给出样例,给出了两个相同的点
    x = np.asarray([1,2,3])
    y = np.asarray([1,2,3])
    # 打印输出欧式距离
    print euclidean_distance(x,y)
    # r=2,调用lr_Norm计算欧式距离
    print lrNorm_distance(x,y,2)
    # 曼哈顿距离或者街道距离
    print lrNorm_distance(x,y,1)
    
    # 计算余弦距离
    x = [1,1]
    y = [1,0]
    print u'余弦距离'
    print cosine_distance(x,y)
    
    # 计算jaccard距离的样例数据
    x = [1,2,3]
    y = [1,1,1]
    print jaccard_distance(x,y)
    
    # 计算Hamming距离的样例数据
    x = [11001]
    y = [11011]
    print hamming_distance(x,y)


0.0
0.0
0.0
余弦距离
0.707106781187
1
1