KNN算法(距离度量、归一化标准化)--day06

一、距离度量

  • 欧氏距离 (Euclidean Distance)

欧氏距离(Euclidean distance)是在几何空间中计算两点之间的距离的一种常见方法。它源于欧几里德空间中点的直线距离的概念,也被广泛用于机器学习和数据挖掘领域中的距离度量。

定义和公式

在二维或三维欧几里德空间中,两点(x1,y1)和(x2,y2)之间的欧氏距离可以通过以下公式计算

更一般地,在n维欧几里德空间中,两点(x1,x2,...,xn)和 (y1,y2,...,yn) 之间的欧氏距离定义为:

特点和用途

  1. 非负性:欧氏距离始终为非负数,即d≥0。
  2. 同一性:当且仅当两点重合时,欧氏距离为零,即d=0当且仅当xi=yi,i
  3. 对称性:欧氏距离与点的顺序无关,即 d(x, y) = d(y, x)d(x,y)=d(y,x)。
  4. 三角不等式:对于任意三个点x,y,zx,y,z,有d(x,z)≤d(x,y)+d(y,z),这一特性使得欧氏距离在几何学和优化问题中具有重要应用。

在机器学习中,欧氏距离常用于聚类分析(如 K-means 算法)和数据挖掘中的特征相似性计算。然而,对于高维稀疏数据或非线性关系密集的数据,欧氏距离可能不是最佳选择,因为它假设各个维度的度量是等价的,这与实际情况不一定符合。

注释:高维稀疏数据是指数据集中包含许多特征(高维度),但每个样本的特征值大部分为零(稀疏性)。这种数据形式在现代数据科学和机器学习中相当常见,特别是在文本处理、推荐系统和生物信息学等领域。

总结

欧氏距离是一种直观且易于理解的距离度量方法,在许多应用中都能提供有效的结果。但在选择距离度量方法时,需要根据具体问题考虑数据的特点和应用的需求,以确保选用最合适的度量方法。

  • 曼哈顿距离(Manhattan Distance)

曼哈顿距离(Manhattan distance),也称为城市街区距离或L1距离,是计算两点之间在网格状平面上的距离的方法。它得名于曼哈顿的街道规划,其中街道布局呈直角交叉的网格状,使得两点之间的行走距离为沿着街道的总长度。

定义和公式

在二维平面上,曼哈顿距离表示点(x1,y1)和点(x2,y2)之间的距离,可以用以下公式表示:

d=\left |x_{_2} -x_{_1} \right | + \left |y_{_2} -y_{_1} \right |

更一般地,在n维空间中,点(x1,x2,...,xn) 和点(y1,y2,...,yn) 之间的曼哈顿距离为:

d = \sum_{i-1}^{n}\left | y_{i}-x_{i} \right |

特点和应用

  1. 非负性:曼哈顿距离始终为非负数,即d≥0。
  2. 对称性:与欧氏距离不同,曼哈顿距离不受点的顺序影响,即d(x,y)=d(y,x)。
  3. 计算简单:由于只涉及绝对值和加法,计算曼哈顿距离相对于欧氏距离而言更加简单和快速。
  4. 特定应用:在计算机视觉中,如目标检测中的边界框匹配、机器人路径规划中的移动代价评估等场景中,曼哈顿距离常被用来衡量实际移动或路径的代价。
  5. 特征选择:曼哈顿距离在特征选择和数据预处理中也有应用,例如在 L1 正则化的线性模型中,它可以促使模型选择性地保留最重要的特征。

总结

曼哈顿距离是一种简单且直观的距离度量方法,特别适合于离散数据或网格状数据空间的应用。在不同的数据分析和机器学习问题中,选择合适的距离度量方法可以显著影响到模型的效果和性能。

  • 切比雪夫距离(Chebyshev Distance)

切比雪夫距离(Chebyshev distance),也称为棋盘距离或无限范数距离,是在几何空间中计算两点之间的距离的一种方法,它使用的度量方式是各坐标数值差的绝对值的最大值。这种距离的名称来源于俄国数学家彼得·切比雪夫。

定义和公式

在n维空间中,点(x1,x2,...,xn) 和点(y1,y2,...,yn) 之间的切比雪夫距离定义为:

d = \max_{i=1}^{n}\left | y_{i}-x_{i} \right |

这意味着切比雪夫距离是各个坐标之间差值绝对值的最大值。换言之,它是从一个点到另一个点的最短路径,只能沿着网格状的路径(平行于坐标轴的直线路径)。

特点和应用

  1. 非负性:切比雪夫距离始终为非负数,即d≥0。

  1. 对称性:与欧氏距离和曼哈顿距离不同,切比雪夫距离同样不受点的顺序影响,即d(x,y)=d(y,x)。

  1. 计算简单:由于只涉及绝对值和取最大值操作,计算切比雪夫距离相对于其他距离度量而言也比较简单和快速。

  1. 特定应用:切比雪夫距离常用于棋盘走法中的距离衡量,如在棋类游戏中计算棋子的移动代价。

  1. 特征选择:在某些机器学习算法中,如 K-近邻算法中的距离计算,切比雪夫距离可以作为一个选择,特别是当数据具有明显的网格结构或离散的特性时。

总结

切比雪夫距离是一种简单而直观的距离度量方法,适合于网格状数据或者数据在各个维度上变化幅度差异较大的情况。在不同的数据分析和应用场景中,选择合适的距离度量方法是优化模型性能和结果的重要步骤之一。

  • 闵可夫斯基距离(Minkowski Distance)

闵可夫斯基距离(Minkowski distance)是一种通用的距离度量方法,可以统一描述曼哈顿距离和欧氏距离,并且可以根据参数p的不同取值,适应不同类型的数据和问题。

定义和公式

在 n维空间中,点(x1,x2 ,...,xn)和点(y1,y2,...,yn)之间的闵可夫斯基距离定义为:

d=\left ( \sum_{i=1}^{n}\left | y_{i}-x_{i}\right |^{p} \right )^{\frac{1}{p}}

其中p≥1 是闵可夫斯基指数。当p=1时,这一距离度量称为曼哈顿距离(Manhattan distance),当p=2时,称为欧氏距离(Euclidean distance)。对于p>2,闵可夫斯基距离度量则变得越来越偏向于较大的分量。

特点和应用

  1. 灵活性:闵可夫斯基距离通过调整p的值,可以适应不同的数据分布和问题类型。较小的p值(如p=1)更适合于稀疏数据和特征选择,而较大的p值(如p=2)通常更适合于连续型数据。

  1. 适用性:因其能够统一欧氏距离和曼哈顿距离,并能够推广到更多的情况,闵可夫斯基距离在机器学习算法中广泛应用,特别是在K-近邻算法和支持向量机(SVM)等需要距离度量的场景中。

注释:支持向量机(Support Vector Machine,简称SVM)是一种强大的监督学习算法,主要用于分类和回归分析。它的基本原理是通过寻找一个最优的超平面(对于分类问题)或者一个最优的线性回归曲线(对于回归问题),来进行数据的划分或者拟合。

原理(暂做了解,后期详细讲解)

SVM的基本思想是将数据集中的样本视为空间中的点,然后尝试找到一个超平面(对于二维空间是一条线,对于三维空间是一个平面,以此类推),这个超平面能够将不同类别的样本点尽可能地分开。在二维空间中,这个超平面就是一条直线,它的位置和方向由算法优化来确保最大化分类间隔。

  1. 计算复杂度:与欧氏距离和曼哈顿距离相比,闵可夫斯基距离的计算复杂度稍高,因为它涉及到指数p的计算。但在现代计算机环境下,通常不会造成显著的性能问题。

  1. 距离度量的选择:在实际应用中,选择适当的距离度量方法对模型的性能和结果影响重大。闵可夫斯基距离为数据科学家和机器学习从业者提供了一个灵活且有效的工具,能够根据具体问题进行调整和优化。

总结

闵可夫斯基距离是一种重要的距离度量方法,能够根据p的值在曼哈顿距离和欧氏距离之间进行平滑过渡,并且可以适应不同的数据特性和应用需求。理解和选择适当的距离度量方法是优化数据分析和机器学习模型的关键步骤之一。

二、归一化(Normalization)

归一化:

归一化主要是将数据按比例缩放,使之落入一个特定的小区间,如 0 到 1 之间。这种方法通常是通过将数据减去最小值,然后再除以最大值与最小值的差来实现的。公式如下:

d=\frac{x-\min(x)}{\max(x)-\min(x)}

归一化Api函数 :

sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )

       1 feature_range 缩放区间

       2 fit_transform(X) 将特征进行归一化缩放







import numpy as np
from sklearn.preprocessing import MinMaxScaler

def dm01_MinMaxScaler():
    data1 = np.array ([[1.70, 67, 1.5, 1],
                       [1.71, 80, 0.8, 2],
                       [1.75, 70, 1.5, 1],
                       [1.76, 68, 1.2, 1],
                       [1.80, 80, 1.8, 1],
                       [1.81, 90, 0.6, 2]])
    # 1 注意: 只对特征值进行归一化
    data2 = data1[:,0:-1]
    print('\n转换前的数据data-->\n', data2)
    # 2 实例化MinMaxScaler对象
    transfer = MinMaxScaler(feature_range=(0, 1))
    # 3 fit训练模型并对数据进行转换
    data = transfer.fit_transform(data2)
    print('\n转换后的数据data-->\n', data)


dm01_MinMaxScaler()

import numpy as np
from sklearn.preprocessing import MinMaxScaler

def dm02_MinMaxScaler():
    data1 = np.array ([[1.70, 67, 1.5, 1],
                     [1.71, 80, 0.8, 2],
                     [1.75, 70, 1.5, 1],
                     [1.76, 68, 1.2, 1],
                     [1.80, 80, 1.8, 1],
                     [1.81, 90, 0.6, 2]])
    # 1 注意: 只对特征值进行归一化
    data2 = data1[:,0:-1]
    print('\n转换前的数据data-->\n', data2)

    # 2 实例化MinMaxScaler对象
    transfer = MinMaxScaler(feature_range=(0, 1))

    # 3 注意 单独fit()求每一列特征的最大值 最小值
    transfer.fit(data2)
    data = transfer.transform(data2)
    print('\n转换后的数据data-->\n', data)

    # data3 采用data2的最大值和最小值进行转换
    data3 = np.array([[1.77, 68, 1.2]])
    data = transfer.transform(data3)
    print('\n转换后的数据data-->\n', data)

dm02_MinMaxScaler()

三、标准化(Standardization)

标准化:

标准化则是将数据的均值调整为0,标准差调整为1,形成标准正态分布(大学数学知识可以检索的,比较简单)。这样处理的数据符合标准正态分布,其处理公式为:

其中,μ 是样本均值, σ是样本标准差(检索,比较简单)。标准化不受数据最小值和最大值的影响,因此对异常值有更好的鲁棒性。

x_{standardized}=\frac{x-\mu }{\sigma}

import numpy as np

from sklearn.preprocessing import StandardScaler
def dm03_StandardScaler():      # 对特征值进行标准化
    data1 = np.array([
                      [1.70,   67,   1.5,   1],
                      [1.71,   80,   0.8,   2],
                      [1.75,   70,   1.5,   1],
                      [1.76,   68,   1.2,   1],
                      [1.80,   80,   1.8,   1],
                      [1.81,   90,   0.6,   2]])
    # 1 注意: 只对特征值进行标准化
    data2 = data1[:, 0:-1]
    print('\n转换前的数据data-->\n', data2)

    # 2 实例化StandardScaler对象
    transfer = StandardScaler()

    # 3 调用fit和transform函数训练模型 转换数据
    data3 = transfer.fit_transform(data2)
    # transfer.fit(data2)      # 单独使用fit函数, transform
    # data3 = transfer.transform(data2)
    print('\n转换后的数据data-->\n', data3)

    # 4 打印每1列数据的均值和标准差
    print('transfer.mean_-->', transfer.mean_)
    print('transfer.var_-->', transfer.var_)


dm03_StandardScaler()

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值