首页 > 编程语言 >Python 机器学习 K-近邻算法 常用距离度量方法

Python 机器学习 K-近邻算法 常用距离度量方法

时间:2024-01-31 21:34:49浏览次数:25  
标签:p2 distance p1 Python 近邻 距离 point1 np 度量

K-近邻(K-Nearest Neighbors,KNN)算法中,选择合适的距离度量是非常重要的,因为它决定了如何计算数据点之间的“相似性”。不同的距离度量可能会导致不同的KNN模型性能。选择哪种距离度量取决于数据的类型和问题的性质。可以通过交叉验证来比较不同距离度量对模型性能的影响,以选择最合适的一种。

1、欧几里得距离(Euclidean Distance)

距离的度量最常用的距离度量方法,适用于连续型数据。它是在多维空间中两点间的“直线”距离。它表示两个点在n维空间中的实际距离。

Python中,可以使用多种方法来计算两个点之间的欧几里得距离。代码如下,

1)使用math模块

import math

def euclidean_distance(point1, point2):
    return math.sqrt(sum((p1 - p2) ** 2 for p1, p2 in zip(point1, point2)))

# 测试
point1 = (1, 2, 3)
point2 = (4, 5, 6)
print(euclidean_distance(point1, point2))

2)使用NumPy

import numpy as np

def euclidean_distance_np(point1, point2):
    return np.sqrt(np.sum((np.array(point1) - np.array(point2)) ** 2))

# 测试
point1 = (1, 2, 3)
point2 = (4, 5, 6)
print(euclidean_distance_np(point1, point2))

2、曼哈顿距离(Manhattan Distance)

KNN算法的关键之一是距离度量,它决定了如何计算特征空间中两点之间的距离。曼哈顿距离(Manhattan Distance)是KNN中常用的距离度量之一。曼哈顿距离,也称为城市街区距离,是通过计算两个点在标准坐标系上的绝对轴距总和来衡量的。

1)使用math模块

import math

def manhattan_distance(point1, point2):
    return sum(abs(p1 - p2) for p1, p2 in zip(point1, point2))

# 示例点
point1 = (1, 2, 3)
point2 = (4, 5, 6)

# 计算曼哈顿距离
distance = manhattan_distance(point1, point2)
print(distance)

2)使用NumPy

import numpy as np

def manhattan_distance_numpy(point1, point2):
    return np.sum(np.abs(np.array(point1) - np.array(point2)))

# 示例点
point1 = np.array([1, 2, 3])
point2 = np.array([4, 5, 6])

# 计算曼哈顿距离
distance = manhattan_distance_numpy(point1, point2)
print(distance)

3、切比雪夫距离(Chebyshev Distance)

切比雪夫距离(Chebyshev Distance)是一种度量两个点之间距离的方法,在机器学习的K-近邻(KNN)算法中经常被使用作为距离度量的一种方式。切比雪夫距离特别适用于那些各个维度之间相对重要性相同的情况。切比雪夫距离在机器学习中可以用于KNN算法,特别是在那些最大差异最重要的场景中。

1)使用math模块

def chebyshev_distance(p1, p2):
  # 确保输入数据有效
  if len(p1) != len(p2):
    raise ValueError("两个点的坐标数目不一致")

  # 计算每个坐标的差的绝对值
  max_diff = 0
  for i in range(len(p1)):
    diff = abs(p1[i] - p2[i])
    if diff > max_diff:
      max_diff = diff

  # 返回最大差值
  return max_diff

# 示例
p1 = [1, 2, 3]
p2 = [4, 5, 6]

distance = chebyshev_distance(p1, p2)

print(f"切比雪夫距离:{distance}")

2)使用NumPy

import numpy as np

p = np.array([1, 2, 3])
q = np.array([4, 6, 9])

chebyshev_dist = np.max(np.abs(p - q))
print(chebyshev_dist)

4、闵可夫斯基距离(Minkowski Distance)

使用K-近邻算法(KNN)时,距离度量是一个核心概念。闵可夫斯基距离(Minkowski Distance)是一种广泛应用的距离度量,它是欧几里得距离和曼哈顿距离的一种推广。

通常建议对数据进行标准化或归一化处理,特别是当使用基于距离的算法时,因为距离度量对尺度非常敏感。

1)使用math模块

def minkowski_distance(p1, p2, p):

  # 确保输入数据有效
  if len(p1) != len(p2):
    raise ValueError("两个点的坐标数目不一致")

  # 计算每个坐标的差的绝对值的 p 次方
  sum_diff = 0
  for i in range(len(p1)):
    diff = abs(p1[i] - p2[i])
    sum_diff += diff ** p

  # 返回距离的 p 次方根
  return np.power(sum_diff, 1 / p)

# 示例
p1 = [1, 2, 3]
p2 = [4, 5, 6]
p = 2

distance = minkowski_distance(p1, p2, p)

print(f"闵可夫斯基距离:{distance}")

2)使用NumPy

import numpy as np

def minkowski_distance(p1, p2, p):


  # 将列表转换为 NumPy 数组
  p1 = np.array(p1)
  p2 = np.array(p2)

  # 计算每个坐标的差的绝对值的 p 次方
  diff = np.abs(p1 - p2) ** p

  # 返回距离的 p 次方根
  return np.power(np.sum(diff), 1 / p)

# 示例
p1 = [1, 2, 3]
p2 = [4, 5, 6]
p = 2

distance = minkowski_distance(p1, p2, p)

print(f"闵可夫斯基距离:{distance}")

5、汉明距离(Hamming Distance)

汉明距离(Hamming Distance)是一种用于度量两个相同长度序列之间的差异的方法。在机器学习和特别是在K-近邻算法中,汉明距离常用于处理分类变量或二进制数据。汉明距离是两个字符串相同位置的不同字符的数量。

1)使用math模块

def hamming_distance(seq1, seq2):
    if len(seq1) != len(seq2):
        raise ValueError("Sequences must be of equal length")
    return sum(el1 != el2 for el1, el2 in zip(seq1, seq2))

# 示例
seq1 = [1, 0, 1, 1, 0, 1]
seq2 = [0, 1, 1, 0, 0, 1]
distance = hamming_distance(seq1, seq2)
print(f"Hamming Distance: {distance}")

2)使用NumPy

import numpy as np

def hamming_distance(x, y):

  # 确保两个数组的形状相同
  if x.shape != y.shape:
    raise ValueError("两个数组的形状不一致")

  # 计算不同位的个数
  return np.sum(x != y)

# 示例
x = np.array([1, 0, 1, 1, 1])
y = np.array([1, 0, 0, 1, 1])

distance = hamming_distance(x, y)

print(f"汉明距离:{distance}")

6、scikit-learn中使用

在scikit-learn库中,需要使用不同的距离度量方法,也就是在初始化K-近邻(KNN)模型时设置metric参数。代码如下,

示例代码:Python 机器学习 K-近邻算法 距离度量-CJavaPy

详细文档:Python 机器学习 K-近邻算法

标签:p2,distance,p1,Python,近邻,距离,point1,np,度量
From: https://www.cnblogs.com/tinyblog/p/18000159

相关文章

  • Python命令行参数的解析
    通常,我们运行Python项目或者脚本采用直接执行脚本的方式,但是Python作为一个脚本语言,在Linux中经常会结合Shell脚本使用,这个时候执行的Python脚本多半需要使用命令行参数传入一些变量,以更加灵活、动态地传递一些数据。例如,运行命令: pythonargv.py123其中12......
  • python多版本
    1、分别下载并安装两个版本的python2、去安装的文件夹中将python.exe和pythonw.exe改名加上版本号3、将python.exe文件目录和当前目录下的Scripts目录都加到用户环境变量中去重新安装pip注:若遇到Scripts文件夹中没有pip,则在cmd中运行python39-mensurepip(python39是修改p......
  • Python 语言的类型提示系统
    Python语言的类型提示系统PEP484Python语言的类型提示系统是一种在代码中添加类型信息的机制,它允许开发者在变量、函数参数和返回值等地方添加类型注解。这种类型提示系统是通过PEP484中引入的,从Python3.5版本开始,它提供了以下主要特征:类型注解语法:使用冒号(:)来指定......
  • 详解Python TimedRotatingFileHandler 多进程环境下的问题和解决方法
    详解PythonTimedRotatingFileHandler多进程环境下的问题和解决方法在Python的日志处理模块中,TimedRotatingFileHandler是一个非常有用的类,它可以按时间对日志文件进行轮换。然而,在多进程环境下,TimedRotatingFileHandler可能会出现一些问题。本文将详细介绍这些问题以及可能的解决......
  • 用 Python 实现ChatGPT OpenAI(直接上源码)
    网上一大堆教程,好多讲的很墨迹,你需要折腾半天才能调试通,up这里给大家直接上源码干货。详细教程后面补充,着急使用的可以直接拿走调试说明到openai里面替换你自己的app_keyhttps://platform.openai.com/登录账号登录之后,点击右上角“Personal”,展开菜单,找到“ViewAP......
  • ChatGPT API调用python和脚本实现
    ChatGPT由于其独特、近乎准确且类似人类的响应,如今在互联网上引起了过多的讨论。本文讨论如何通过Python代码连接到ChatGPTAPI。 第1步:获取OpenAIAPI的API密钥要获取OpenAIAPI的API密钥,您需要在OpenAI网站上注册一个OpenAI帐户。拥有帐户后,您可以按......
  • 基于Python开发ChatGPT应用
    ChatGPT是目前非常热门的一种人工智能模型,它是基于深度学习技术的一种针对自然语言处理的算法。ChatGPT的应用非常广泛,可以应用于聊天机器人、文本生成、翻译、自动化等多个领域。本文将介绍如何使用Python开发一个基于ChatGPT模型的聊天机器人应用。 1.ChatGPT简介......
  • python网络编程笔记(一)Socket 编程入门
    一:Socket简介套接字起源于20世纪70年代加利福尼亚大学伯克利分校版本的Unix,即人们所说的BSDUnix。因此,有时人们也把套接字称为“伯克利套接字"或"BSD套接字”。一开始,套接字被设计用在同-台主机上多个应用程序之间的通讯BSDSocket接口是TCP/IP网络的API在Linux,Unix和W......
  • python网络编程(二)模拟ssh远程执行命令
    1、项目需求:要实现一个像ssh远程连接工具一样,在终端输入命令,返回对应的结果。比如window的dos命令:dir:查看目录下的文件ipconfig:查看网卡信息tasklist:查看进程列表linux的命令:ls:查看目录下的文件ifconfig:查看网卡信息ps-aux:查看进程列表2、项目分析:这......
  • python网络编程(三)实现文件下载功能
    一:目标:要实现一个客户端从服务端下载文件的功能,这个在模拟ssh远程执行命令的基础上再做修改就可以了二:分析:1、要规定客户端获取文件的格式:下载文件用get文件名,比如要下载服务端的a.txt,就写成geta.txt2、因为我目前是客户端和服务端都是在一台服务器上,我模拟的时候就把......