您的位置:首页 > 编程语言 > Python开发

python实现机器学习中的各种距离计算及文本相似度算法

2017-04-03 22:45 896 查看
在自然语言处理以及机器学习的分类或者聚类中会涉及到很多距离的使用,各种距离的概念以及适用范围请自行百度或者参考各种距离

import numpy as np
import math

# 依赖包numpy、python-Levenshtein、scipy

def Euclidean(vec1, vec2):
npvec1, npvec2 = np.array(vec1), np.array(vec2)
return math.sqrt(((npvec1-npvec2)**2).sum())
# euclidean,欧式距离算法,传入参数为两个向量,返回值为欧式距离

def Manhattan(vec1, vec2):
npvec1, npvec2 = np.array(vec1), np.array(vec2)
return np.abs(npvec1-npvec2).sum()
# Manhattan_Distance,曼哈顿距离

def Chebyshev(vec1, vec2):
npvec1, npvec2 = np.array(vec1), np.array(vec2)
return max(np.abs(npvec1-npvec2))
# Chebyshev_Distance,切比雪夫距离

def Minkowski(vec1, vec2, params):
pass
# MinkowskiDistance 闵可夫斯基距离,其实就是上面三种距离的集合,这里就不重复了。

# def Standardized_Euclidean(vec1, vec2, v):
#     from scipy import spatial
#     npvec = np.array([np.array(vec1), np.array(vec2)])
#     return spatial.distance.pdist(npvec, 'seuclidean', V=None)
# Standardized Euclidean distance,标准化欧氏距离
# 在对长方体区域进行聚类的时候,普通的距离无法满足要求。
# 按照普通的距离聚类出的大多是圆形的区域,这时候要采用标准的欧式距离。
# 参考  标准化欧式距离:http://blog.csdn.net/jinzhichaoshuiping/article/details/51019473

def Mahalanobis(vec1, vec2):
npvec1, npvec2 = np.array(vec1), np.array(vec2)
npvec = np.array([npvec1, npvec2])
sub = npvec.T[0]-npvec.T[1]
inv_sub = np.linalg.inv(np.cov(npvec1, npvec2))
return math.sqrt(np.dot(inv_sub, sub).dot(sub.T))
# MahalanobisDistance,马氏距离

def Edit_distance_str(str1, str2):
import Levenshtein
edit_distance_distance = Levenshtein.distance(str1, str2)
similarity = 1-(edit_distance_distance/max(len(str1), len(str2)))
return {'Distance': edit_distance_distance, 'Similarity': similarity}
# Levenshtein distance,编辑距离,用于计算两个字符串之间的编辑距离,传入参数为两个字符串

def Edit_distance_array(str_ary1, str_ary2):
len_str_ary1 = len(str_ary1) + 1
len_str_ary2 = len(str_ary2) + 1
matrix = [0 for n in range(len_str_ary1 * len_str_ary2)]
for i in range(len_str_ary1):
matrix[i] = i
for j in range(0, len(matrix), len_str_ary1):
if j % len_str_ary1 == 0:
matrix[j] = j // len_str_ary1
for i in range(1, len_str_ary1):
for j in range(1, len_str_ary2):
if str_ary1[i-1] == str_ary2[j-1]:
cost = 0
else:
cost = 1
matrix[j*len_str_ary1+i] = min(matrix[(j-1)*len_str_ary1+i]+1, matrix[j*len_str_ary1+(i-1)]+1, matrix[(j-1)*len_str_ary1+(i-1)] + cost)
distance = int(matrix[-1])
similarity = 1-int(matrix[-1])/max(len(str_ary1), len(str_ary2))
return {'Distance': distance, 'Similarity': similarity}
# 针对列表改写的编辑距离,在NLP领域中,计算两个文本的相似度,是基于句子中词和词之间的差异。
# 如果使用传统的编辑距离算法,则计算的为文本中字与字之间的编辑次数。这里根据编辑距离的思维,
# 将编辑距离中的处理字符串中的字符对象,变成处理list中每个元素

def Cosine(vec1, vec2):
npvec1, npvec2 = np.array(vec1), np.array(vec2)
return npvec1.dot(npvec2)/(math.sqrt((npvec1**2).sum()) * math.sqrt((npvec2**2).sum()))
# Cosine,余弦夹角
# 机器学习中借用这一概念来衡量样本向量之间的差异。
# 也可以使用在余弦相似度算法中


参考:

1.各种距离

2.【Python】Python实现马氏距离计算

3.Python numpy函数hstack() vstack() stack() dstack() vsplit() concatenate()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: