Python教程

机器学习有关距离及python实现

本文主要是介绍机器学习有关距离及python实现,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Machine Learning 中的距离和相似性计算

 

欧式距离

也称欧几里得距离,指在m维空间中两个点之间的真实距离。

两个n维向量与间的欧式距离表示为:

 

 

用python实现为
from math import sqrt

def distance(a,b):

    """

    求a,b之间的欧式距离

    :return:距离

    """

    dis = 0.0

    for i in range(len(a)):

        dis+=(a[i]-b[i])**2

    return sqrt(dis)
 

曼哈顿距离

也称为城市街区距离,用来表示两点之间各垂直线之间的长度。

 

用python实现为

 
def Manhattan(a,b):

    # 求a,b之间的曼哈顿距离

    dis=0.0

    for i in range(len(a)):

        dis+=abs(a[i]-a[b])

    return dis

 

 

 

切比雪夫距离

定义为:,数据维度要在三维及以上

 

Python代码如下
def maxDistance(a,b):

    # 求两个向量之间的切比雪夫距离

    maxDis = 0.0

    for i in range(len(a)):

        if abs(a[i]-b[i])>maxDis:

            maxDis=abs(a[i]-b[i])

    return maxDis

闵可夫斯基距离

 

其中p是一个可变参数:

当p=1时,就是曼哈顿距离;

当p=2时,就是欧式距离;

当p=3时,就是切比雪夫距离

 

 

马氏距离

马氏距离是基于样本分布的一种距离。它是一种有效的计算两个未知样本集的相似度的方法。

公式为

 

其中X为样本向量,为均值,为协方差矩阵

 
def Mahalanobis(x,i,j):

    """

    求样本i到样本j的马氏距离

    当j取-1时表示第i个点到样本中心的马氏距离

    :param x: m个样本向量,为矩阵

    :param i:第i个点

    :param j: 第j个点

    :return: 马氏距离

    """

    import numpy as np

    xT = x.T # 矩阵的转置

    D = np.cov(xT) # 矩阵a的协方差

    invD = np.linalg.inv(D) # 协方差矩阵的逆

    x_a = x[i]

    x_b = x.mean(axis=0) if j==-1 else x[j]

    temp = x_a-x_b

    return np.sqrt(np.dot(np.dot(invD,temp),temp.T))

汉明距离

两个字符串之间的汉明距离定义为将其中一个变为另一个所需要作的最小替换次数

 
def hanmingDis(a,b):

    # 计算ab字符串之间的汉明距离

    num = 0

    for i in range(len(a)):

        if a[i]!=b[i]:

            num+=1

    return num

 

 

 

杰卡德距离 & 杰卡德相似系数

用两个集合中不同元素占有元素的比例来衡量两个集合的区分度

  

def jiekadeDis(a,b):

    # 计算ab两个集合的杰卡德距离

    set_a = set(a)

    set_b = set(b)

    dis = float(len((set_a|set_b)-(set_a & set_b)))/len(set_a|set_b)

    return dis

杰卡德相似系数

  

def jiekadeDis(a,b):

    # 计算ab两个集合的杰卡德相似系数

    set_a = set(a)

    set_b = set(b)

    dis = float(len((set_a & set_b)))/len(set_a|set_b)

    return dis

 

夹角余弦

  

def cosDis(a,b):

    # 计算ab之间的夹角余弦值

    sum1 = 0.0

    sum21,sum22=0.0,0.0

    for i in range(len(a)):

        sum1+=a[i]*b[i]

        sum21+=a[i]**2

        sum22+=b[i]**2

    return sum1/(np.sqrt(sum21)*np.sqrt(sum22))

相关距离和相关系数

相对应计算就行

 

 

信息熵

用来表示数据的混乱程度或分散程度的度量

 

 
def calc_shang(dataset):  # 计算信息熵
# dataset为数据集

    labelcount = {}  # 列表数量

    for data in dataset:

        if data[-1] not in labelcount.keys():

            labelcount[data[-1]] = 1  # 每行最后一列为标签值

        labelcount[data[-1]] += 1  # 发现一次就加一

    n = len(dataset)

    shang = 0.0  # 初始为0.0

    for key in labelcount:

        p = float(labelcount[key] / n)  # 计算概率,等于标签的数据除总比例

        shang -= p * log(p, 2)

    return shang

 

这篇关于机器学习有关距离及python实现的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!