KNN 的 “距离度量” 选择:欧氏距离 vs 曼哈顿距离,如何适配不同数据分布?(附高维数据降维后 KNN 优化)

维度灾难--通过Python理解高维空间欧氏距离与余弦相似度失效 代码链接:github代码 维度灾难 维数灾难(Curse of Dimensionality):通常是指在涉及到向量的计算的问题中,随着维数的增加,计算量呈指数倍增长的一种现象。维数灾难涉及数字分析、抽样、组合、机器学习、数据挖掘和数据库等诸多领域。 此处讨论高维情况下,距离函数的计算是否具有意义。 欧氏距离与余弦相似度区别 欧氏距离衡量的是空间各点的绝对距离,跟各个点所在的位置坐标直接相关;而余弦距离衡量的是空间向量的夹角,更加体现在方向上的差异,而不是位置。 欧氏距离能够体现个体数值特征的绝对差异,所 阅读详情

KNN 的 “距离度量” 选择:欧氏距离 vs 曼哈顿距离,如何适配不同数据分布?(附高维数据降维后 KNN 优化)

如果你对机器学习充满好奇,那么 K-最近邻(K-Nearest Neighbors, KNN)算法很可能是你最先接触到的几个算法之一。它的核心思想简单得就像一句我们从小就听熟的话:“物以类聚,人以群分”。没错,KNN 就是这么直观——一个未知样本的类别,由它在特征空间里最亲密的 K 个邻居来决定。

然而,正是这份“简单”,让许多初学者陷入了一个误区:认为 KNN 不需要太多思考就能用好。但现实往往是,当我们将一个基础的 KNN 模型应用到真实数据上时,效果却不尽如人意。问题出在哪里?

答案藏在细节里。比如,我们如何定义“邻居”的“远近”?是两点之间的直线距离,还是像在城市街区里开车那样,只能沿着横竖街道走?这背后是两种不同的“距离度量”:欧氏距离和曼哈顿距离。选择哪一个,完全取决于你的数据长什么样。

更进一步,如果你的数据特征非常多(比如成百上千个维度),KNN 还会遭遇一个著名的难题——“维度诅咒”。在高维空间里,所有的数据点都互相离得很远,KNN 赖以生存的“近邻”概念几乎失效。

本篇文章,就将带你深入 KNN 的“心脏地带”,解决这两个核心问题。我们将一起:

  1. 动手实践:从零开始搭建一个 Python 实验环境。
  2. 深入对比:通过代码和可视化,直观感受欧氏距离和曼哈顿距离在不同数据分布下的表现差异。
  3. 学习优化:引入强大的 PCA 降维技术,看它如何“拯救”陷入维度诅咒的 KNN 算法。

准备好了吗?让我们一起揭开 KNN 算法简单外表下的深刻内涵。

实验准备:搭建一个干净的 Python 环境

在开始任何编程项目之前,一个良好且隔离的开发环境是成功的关键。这可以确保我们项目中使用的库版本不会与你电脑上其他项目的库发生冲突。我们将使用 Python 自带的 venv 工具来创建一个虚拟环境。

第一步:创建项目文件夹

首先,打开你的终端(在 macOS 或 Linux 上是 Terminal,在 Windows 上是 PowerShell 或命令提示符),为我们的项目创建一个专属的“房间”。

# 创建一个名为 knn-distance-project 的文件夹
mkdir knn-distance-project

# 进入这个新创建的文件夹
cd knn-distance-project

这个操作很简单,mkdir (make directory) 用于创建文件夹,cd (change directory) 用于切换当前工作目录。

第二步:创建并激活虚拟环境

在项目文件夹内,我们来创建一个名为 venv 的虚拟环境。

# 使用 python3 的 venv 模块创建一个名为 venv 的虚拟环境
python3 -m venv venv

执行完毕后,你会看到项目文件夹下多了一个 venv 子文件夹,这里面包含了 Python 解释器的一个独立副本和相关的管理脚本。

接下来,我们需要“激活”这个环境,让终端后续的命令都在这个隔离的环境中执行。

对于 macOS 或 Linux 用户:

# 激活虚拟环境
source venv/bin/activate

对于 Windows 用户:

# 激活虚拟环境
.\venv\Scripts\Activate.ps1

激活成功后,你通常会在终端提示符的前面看到 (venv) 的字样,这表示你已经成功进入了我们为项目准备的“无尘室”。

第三步:安装核心库

在这个干净的环境里,我们可以安装本次实验所需要的“兵器”了。我们将安装三个非常流行的 Python 库。

# 使用 pip 安装 numpy, scikit-learn, 和 matplotlib
pip install numpy scikit-learn matplotlib

让我们来解释一下这三个库各自的角色:

  • numpy:是 Python 科学计算的基石。它提供了强大的多维数组对象和丰富的数学函数,是处理数据的基础。
  • scikit-learn:机器学习领域的“瑞士军刀”。它内置了包括 KNN 在内的大量机器学习算法、预处理工具、数据集等,极大地方便了我们的实验。
  • matplotlib:一个强大的数据可视化库。它能帮助我们将抽象的数据和算法结果“画”出来,让理解变得直观和简单。

至此,我们的实验环境已经准备就绪。接下来,让我们深入核心概念。

核心概念:用“距离”丈量数据的相似度

KNN 算法的决策过程可以用下面这幅流程图来概括:

graph TD
    A[未知样本 X] --> B{计算 X 与所有训练样本的距离};
    B --> C{找到距离最近的 K 个邻居};
    C --> D{K 个邻居进行“投票”};
    D --> E[根据投票结果<br/>(少数服从多数)<br/>决定 X 的类别];

这个流程中最关键的一步,就是 “计算距离”。所谓距离,本质上是一种将两个样本在特征空间中差异“数值化”的方式。这个数值,就代表了它们的相似程度。我们主要探讨两种最常用的距离度量。

欧氏距离 (Euclidean Distance)

这是我们最熟悉、最直观的距离概念。在二维或三维空间中,它就是两点之间的直线距离。

其数学公式为:
[ d_{euclidean}(A, B) = \sqrt{\sum_{i=1}^{n}(A_i - B_i)^2} ]
其中,( A ) 和 ( B ) 是两个样本,( n ) 是特征维度,( A_i ) 和 ( B_i ) 分别是它们在第 ( i ) 个维度上的坐标。

  • 直观理解:勾股定理在多维空间中的推广。
  • 适用场景:当数据的各个特征维度都是同一尺度(或者已经经过标准化处理),并且数据分布在空间中呈现“团状”或球形时,欧氏距离通常能很好地度量样本间的真实相似度。

曼哈顿距离 (Manhattan Distance)

想象一下你在一个像曼哈顿那样的城市里,街道都是横平竖直的。你不能斜着穿过大楼,只能沿着街道走。从一个十字路口到另一个十字路口的距离,就是你在各个坐标轴上移动距离的总和。

其数学公式为:
[ d_{manhattan}(A, B) = \sum_{i=1}^{n}|A_i - B_i| ]

  • 直观理解:城市街区距离,计算各个坐标轴上的距离差之和。
  • 适用场景:当数据特征的尺度不一致时,曼哈顿距离会比欧氏距离更加鲁棒。此外,在一些具有明显“网格”或“路径”结构的数据中,或者在高维数据中,它有时会表现出比欧氏距离更优的性能,因为它对单个维度的巨大差异(异常值)不如欧氏距离敏感(欧氏距离有平方操作,会放大差异)。

理论已经铺垫完毕,是时候通过代码来亲眼见证实战效果了。

实战对比:距离度量如何影响分类结果?

我们将设计一个实验,在两种形态完全不同的数据集上,分别使用欧氏距离和曼哈顿距离的 KNN 算法,并通过可视化的决策边界来观察它们的差异。

第一步:创建 Python 脚本

在你的 knn-distance-project 文件夹中,创建一个名为 knn_distance_comparison.py 的文件。

第二步:编写代码

将以下代码完整地复制到你的 knn_distance_comparison.py 文件中。代码中包含了详细的注释,解释了每一步的作用。

# 导入所需的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import make_blobs
from matplotlib.colors import ListedColormap

def run_knn_and_plot(X, y, distance_metric, title):
    """
    一个封装了 KNN 训练、预测和决策边界可视化过程的函数。
    
    参数:
    X (np.array): 特征数据
    y (np.array): 标签数据
    distance_metric (str): 'euclidean' 或 'manhattan'
    title (str): 图表的标题
    """
    # 将数据划分为训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
    
    # 初始化 KNN 分类器,设置 K=5,并指定距离度量
    # 这里的 metric 参数是关键,我们通过它来选择使用哪种距离
    knn = KNeighborsClassifier(n_neighbors=5, metric=distance_metric)
    
    # 训练模型
    knn.fit(X_train, y_train)
    
    # 在测试集上评估模型
    accuracy = knn.score(X_test, y_test)
    print(f"数据集: '{title}', 距离度量: {distance_metric}, 准确率: {accuracy:.2f}")
    
    # --- 决策边界可视化 ---
    
    # 设置网格的步长和边界
    h = .02
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    
    # 创建网格点
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))
    
    # 使用训练好的模型对网格上每个点进行预测
    Z = knn.predict(np.c_[xx.ravel(), yy.ravel()])
    
    # 将预测结果重塑为网格形状
    Z = Z.reshape(xx.shape)
    
    # 绘制决策边界和数据点
    plt.figure(figsize=(8, 6))
    cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA'])
    cmap_bold = ListedColormap(['#FF0000', '#00FF00'])
    
    plt.contourf(xx, yy, Z, cmap=cmap_light)
    
    # 绘制训练数据点
    plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cmap_bold, edgecolor='k', s=20)
    plt.title(f"{title}\nMetric: {distance_metric}, Accuracy: {accuracy:.2f}")
    plt.xlabel("Feature 1")
    plt.ylabel("Feature 2")


# --- 实验一:在标准球形分布的数据集上进行测试 ---

# 生成球形分布的数据
X1, y1 = make_blobs(n_samples=200, centers=2, random_state=42, cluster_std=1.2)

# 使用欧氏距离
run_knn_and_plot(X1, y1, 'euclidean', '球形分布数据 (Blobs)')

# 使用曼哈顿距离
run_knn_and_plot(X1, y1, 'manhattan', '球形分布数据 (Blobs)')


# --- 实验二:在轴向分布的数据集上进行测试 ---

# 手动创建沿坐标轴分布的数据
np.random.seed(42)
# 第一类数据,主要沿 x 轴分布
class1_x = np.random.uniform(-5, 5, 50)
class1_y = np.random.normal(0, 0.5, 50)
# 第二类数据,主要沿 y 轴分布
class2_x = np.random.normal(0, 0.5, 50)
class2_y = np.random.uniform(-5, 5, 50)

# 合并数据
X2 = np.vstack((np.c_[class1_x, class1_y], np.c_[class2_x, class2_y]))
y2 = np.array([0] * 50 + [1] * 50)


# 使用欧氏距离
run_knn_and_plot(X2, y2, 'euclidean', '轴向分布数据 (Axial)')

# 使用曼哈顿距离
run_knn_and_plot(X2, y2, 'manhattan', '轴向分布数据 (Axial)')

# 显示所有图表
plt.show()

第三步:运行脚本并分析结果

在激活了虚拟环境的终端中,运行这个 Python 脚本:

python knn_distance_comparison.py

程序会输出四个准确率,并弹出四张图。让我们来仔细分析这些结果。

结果分析:

  1. 对于球形分布的数据:

    • 你会看到欧氏距离和曼哈顿距离的准确率非常接近,可能完全相同。
    • 观察决策边界图,欧氏距离画出的分界线通常是一条平滑的曲线,非常符合我们对“中分线”的直观感觉。曼哈顿距离的边界则可能呈现出一些“阶梯状”的棱角。
    • 结论:在特征均衡、分布规整的数据上,两种距离度量表现相当,欧氏距离因其平滑性而更符合直觉。
  2. 对于轴向分布的数据:

    • 在这里,你很可能会看到曼哈顿距离的准确率高于欧氏距离。
    • 观察决策边界图,你会发现一个有趣的现象:欧氏距离试图用一条平滑的斜线来分割数据,但这显然不符合数据的真实分布,导致了一些错误分类。而曼哈顿距离的决策边界呈现出明显的“十字”或阶梯形状,完美地适应了数据沿着坐标轴分布的特性。
    • 结论:当数据的内在结构与坐标轴高度相关时,曼哈顿距离能够更好地捕捉这种结构,从而获得更好的分类效果。

这个实验清晰地证明了:没有绝对最好的距离度量,只有最适合你的数据形态的度量。

挑战升级:当 KNN 遭遇“维度诅咒”

我们刚才的实验都是在二维空间中进行的,所以可以很方便地可视化。但在真实世界中,数据往往有几十、几百甚至上千个特征维度。当维度急剧增加时,KNN 算法会面临一个巨大的挑战——维度诅咒 (Curse of Dimensionality)。

什么是维度诅咒?

这听起来很玄乎,但可以用一个简单的比喻来理解。

  • 一维空间:想象一条 100 米的线段,你想找离你 10 米内的人,这很容易,覆盖了线段的 20%。
  • 二维空间:现在是一个 100x100 米的正方形广场,你想覆盖 20% 的面积,你需要一个半径约 25 米的圈。
  • 三维空间:在一个 100x100x100 米的立方体中,要覆盖 20% 的体积,你需要一个半径约 37 米的球。

发现了吗?为了覆盖同样比例的空间,你需要的“半径”随着维度的增加而急剧增大。换句话说,在高维空间中,数据点会变得极其稀疏,任意两个点之间的距离都倾向于变得很大且彼此相等。

graph LR
    subgraph 低维空间 (特征少)
        A((点A)) -- 近 --> B((邻居B));
        A -- 远 --> C((远点C));
    end
    subgraph 高维空间 (特征多)
        D((点D)) -- 都很远 --> E((点E));
        D -- 都很远 --> F((点F));
    end
    低维空间 --> |维度增加| 高维空间;

这对 KNN 是致命的,因为它的决策完全依赖于“近邻”这个概念。如果所有邻居都离你很“远”,那么“最近的 K 个邻居”也就失去了意义,算法的性能会急剧下降。

破局之法:数据降维

如何打破这个诅咒?答案是:降维。我们尝试将数据从高维空间投影到低维空间,同时尽可能地保留其原始的主要信息。

最常用的一种线性降维方法叫做 主成分分析 (Principal Component Analysis, PCA)。PCA 的核心思想是,在数据中找到一组新的坐标轴(称为主成分),第一个主成分指向数据方差最大的方向,第二个主成分指向与第一个正交且方差次大的方向,以此类推。我们只保留前几个最重要的主成分,从而在丢失最少信息的前提下,大幅减少数据维度。

终极优化:PCA 降维与 KNN 的强强联合

现在,我们将通过一个实战案例,在一个真实的高维数据集上,对比“直接使用 KNN”和“先 PCA 降维再用 KNN”的效果差异。

第一步:创建新脚本

在你的项目文件夹中,创建第二个脚本文件 knn_pca_optimization.py。

第二步:编写代码

我们将使用 scikit-learn 中内置的手写数字数据集。这个数据集包含了大量 8x8 像素的数字灰度图,每个图像有 64 个特征(像素点),是一个典型的高维数据。

# 导入所需的库
import time
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.neighbors import KNeighborsClassifier
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score

# 加载手写数字数据集 (64 维)
digits = load_digits()
X, y = digits.data, digits.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# --- 实验组 A: 直接在高维数据上应用 KNN ---
print("--- 实验组 A: 直接在 64 维数据上使用 KNN ---")

# 标准化数据
scaler_A = StandardScaler()
X_train_scaled_A = scaler_A.fit_transform(X_train)
X_test_scaled_A = scaler_A.transform(X_test)

# 初始化并训练 KNN
knn_A = KNeighborsClassifier(n_neighbors=5, metric='euclidean')

start_time_A = time.time()
knn_A.fit(X_train_scaled_A, y_train)
y_pred_A = knn_A.predict(X_test_scaled_A)
end_time_A = time.time()

accuracy_A = accuracy_score(y_test, y_pred_A)
duration_A = end_time_A - start_time_A

print(f"准确率: {accuracy_A:.4f}")
print(f"运行时间: {duration_A:.4f} 秒")
print("-" * 40)


# --- 实验组 B: 先 PCA 降维,再应用 KNN ---
print("--- 实验组 B: PCA 降维 (至 10 维) + KNN ---")

# 使用 Pipeline 将标准化、PCA 和 KNN 串联起来
# 这是 scikit-learn 中一个非常强大的工具,可以简化工作流
pipeline_B = Pipeline([
    ('scaler', StandardScaler()),              # 第一步:标准化
    ('pca', PCA(n_components=10)),             # 第二步:PCA降维,从64维降到10维
    ('knn', KNeighborsClassifier(n_neighbors=5, metric='euclidean')) # 第三步:KNN分类
])

start_time_B = time.time()
pipeline_B.fit(X_train, y_train)
y_pred_B = pipeline_B.predict(X_test)
end_time_B = time.time()

accuracy_B = accuracy_score(y_test, y_pred_B)
duration_B = end_time_B - start_time_B

print(f"准确率: {accuracy_B:.4f}")
print(f"运行时间: {duration_B:.4f} 秒")
print("-" * 40)

# --- 结果对比 ---
print("\n--- 性能对比 ---")
print(f"直接 KNN (64维)   -> 准确率: {accuracy_A:.4f}, 耗时: {duration_A:.4f}s")
print(f"PCA + KNN (10维) -> 准确率: {accuracy_B:.4f}, 耗时: {duration_B:.4f}s")

第三步:运行并解读结果

在终端中运行这个新脚本:

python knn_pca_optimization.py

你会得到类似下面这样的输出(具体数值可能因机器性能略有差异):

--- 实验组 A: 直接在 64 维数据上使用 KNN ---
准确率: 0.9833
运行时间: 0.0150 秒
----------------------------------------
--- 实验组 B: PCA 降维 (至 10 维) + KNN ---
准确率: 0.9852
运行时间: 0.0050 秒
----------------------------------------

--- 性能对比 ---
直接 KNN (64维)   -> 准确率: 0.9833, 耗时: 0.0150s
PCA + KNN (10维) -> 准确率: 0.9852, 耗时: 0.0050s

结果解读:

从这个对比中,我们可以清晰地看到:

  1. 运行效率:经过 PCA 降维后,KNN 的训练和预测时间大幅缩短(在这个例子中可能快了 2-3 倍)。这是因为计算样本间距离的复杂度与维度成正比,维度越低,计算越快。
  2. 分类准确率:令人惊喜的是,降维后的模型的准确率甚至略有提升!这可能是因为 PCA 在降维的同时,也帮助去除了原始数据中的一些噪声,使得 KNN 能够更好地抓住数据的主要模式。

这个实验有力地证明了,PCA 降维是应对维度诅咒、优化高维数据下 KNN 性能的强大武器。

KNN算法原理与实战:从鸢尾花分类到手写数字识别 KNN(K-最近邻)算法是机器学习中最直观的分类方法之一,其核心思想是通过计算样本间的距离来实现分类决策。该算法基于特征空间中的距离度量(如欧氏距离、曼哈顿距离等),通过寻找最近的K个邻居进行投票预测。KNN在工程实践中广泛应用于图像识别、推荐系统和异常检测等领域,特别适合处理非线性模式的数据集。本文通过鸢尾花分类和MNIST手写数字识别两个经典案例,详细解析了KNN的实现过程与优化技巧,包括特征缩放、K值选择和距离度量优化等关键技术点。对于高维数据,还介绍了PCA降维和近似最近邻算法等实用解决方案。 阅读详情

相关推荐

KNN实战指南:从原理到生产部署的完整流程

KNN(K近邻算法)是一种基于实例的监督学习方法,其核心原理是通过计算新样本与训练样本间的距离,依据最近K个邻居的类别进行投票决策。该算法无需显式训练过程,具备强可解释性、低实现门槛和天然的小样本适应性,特别适用于需要快速验证、业务可审计及冷启动场景。技术价值体现在工程可控性强——每一步距离计算、邻居选择和投票结果均可追溯;应用场景覆盖客户分群、设备状态监测、医学初筛等对决策透明度要求高的领域。本文聚焦真实项目落地,深入解析标准化必要性、K值业务权衡逻辑、维度灾难应对及模型监控机制。

388

欧氏距离_机器学习中的分类距离

作者 | 我的智慧生活来源 | 咪付生活中,距离通常是用于形容两个地方或两个物体之间的远近。在人工智能机器学习领域,常使用距离来衡量两个样本之间的相似度。“物以类聚”我们知道“物以类聚”通常用于比喻同类的东西经常聚在一起。机器学习中,距离就是遵循物以类聚的思想。通过两个样本特征数据进行距离计算后,得到的距离值越小,代表两者的相似度越高,属于同一类的可能性就越高。换句话说,距离能够决定样本的归属。例...

weixin_42351362的博客 3022

KNN实战手册:从数据诊断到生产部署的完整链路

KNN(K近邻算法)是一种基于局部相似性的懒惰学习方法,其核心原理是通过距离度量识别最近邻居并聚合其标签或目标值,从而实现分类或回归。它不构建显式模型,因而具备零训练开销、天然增量学习和完全可追溯等独特技术价值。在电商用户流失预警、工业设备故障筛查、二手房价格预测等真实场景中,KNN常作为数据质量的‘X光机’——效果波动往往直指特征缩放缺失、高维距离失效或类别不平衡等底层问题。本文聚焦scikit-learn工程实践,覆盖RobustScaler特征预处理、ball_tree高效搜索、distance加权回

xpmwgcwm的博客 440

n维空间的欧氏距离公式_距离的总结(欧氏距离)

首先要感谢各种距离 - 我只想做一个努力的人 - 博客频道 - youkuaiyun.comhttp://blog.youkuaiyun.com/shiwei408/article/details/7602324在做分类时常常需要估算不同样本之间的相似性度量(SimilarityMeasurement),这时通常采用的方法就是计算样本间的“距离”(Distance)。采用什么样的方法计算距离是很讲究,甚至关系到分类的正确...

weixin_39914938的博客 6298

用Python实现KNN图像分类:从距离度量到特征提取的完整指南

机器学习中,图像分类是经典问题,而K近邻(KNN)作为最直观的监督学习算法,常被用于快速建立分类基线。其核心原理是:将图像视为高维空间中的点,通过距离度量(如欧氏距离)找到最近的K个样本进行投票决策。KNN训练成本低,易于理解特征工程对结果的影响,适合小规模数据集和算法入门。在实际应用中,常与特征提取(如颜色直方图、PCA降维)及交叉验证结合,以提升准确率。本文以Python实现手写KNN分类器,完整演示从数据加载、距离计算到模型评估的流程,并对比sklearn实现,帮助读者理解图像分类技术的基础范式。

weixin_33801856的博客 326

2021电子科技大学分布式系统期末考点精析与实战解析

本文深入解析2021年电子科技大学分布式系统期末考试核心考点,包括分布式事务、时钟同步、GFS架构等高频内容。基于回忆版试题,提供实战解析与应试技巧,帮助考生高效复习。重点涵盖两阶段提交、Cristian算法等关键技术,适合计算机专业学生备考参考。

weixin_29251131的博客 540

欧氏距离(Euclidean distance)

欧氏距离定义: 欧氏距离( Euclidean distance)是一个通常采用的距离定义,它是在m维空间中两个点之间的真实距离。在二维和三维空间中的欧式距离的就是两点之间的距离,二维的公式是 d = sqrt((x1-x2)^+(y1-y2)^) 三维的公式是 d=sqrt(x1-x2)^+(y1-y2)^+(z1-z2)^) 推广到n维空间,欧式距离的公式是 d=sqrt( ∑(xi1-xi2

代码如诗 1万+

机器人控制入门

机器人控制入门 对于工科领域来说,脱离实践的学习都是肤浅的,对于控制这种强调经验的技术更是如此。如果去问一个程序员怎么学习一块技术,他必然让你去多编程。机器人领域也是。如果想把基本功打扎实,那么实践更是必不可少了。 机器人控制有三个元素:控制器(算法),执行器(电机),传感器; 控制的本质就是将规划系统的指令作为输入信息,将传感器探测得到的状态信息和导航系统的定位

彼岸花 1万+

KNN算法中的距离计算:深入理解数据间的“亲密程度“

距离计算公式

ai学习博客 1265

TMC5160 StallGuard2调参避坑指南:从SG_RESULT飘忽不定到稳定检测堵转

本文详细解析了TMC5160的StallGuard2功能在堵转测试中的调参技巧,从SG_RESULT波动问题到稳定检测的完整解决方案。通过电流环与反电动势分析、电源噪声处理及低速校准法等实用方法,帮助工程师实现工业级可靠的堵转检测,避免误触发和检测失效问题。

weixin_28727975的博客 379

机器人控制入门:用SAC算法让机械臂学会抓取(PyBullet仿真教程)

本文详细介绍了如何使用SAC算法在PyBullet仿真环境中训练机械臂完成抓取任务。通过强化学习中的软Actor-Critic(SAC)算法,结合熵最大化机制和双Q网络架构,有效解决了机械臂控制中的探索难题。教程包含环境搭建、算法原理、状态空间设计、奖励函数优化等核心内容,并提供了实用的训练技巧和参数调优指南。

weixin_29091105的博客 361

KNN算法优化:距离度量与权重策略的实战指南

K近邻算法是机器学习中的基础分类与回归方法,其核心思想是通过计算样本间的距离来寻找最近邻,并基于邻居的标签进行预测。算法的性能很大程度上取决于两个关键环节:距离度量和邻居权重分配。距离度量定义了数据点之间的相似性,常见的方法包括欧氏距离、曼哈顿距离和马氏距离等,它们分别适用于不同的数据分布和尺度。权重优化则决定了不同距离邻居对最终决策的影响程度,例如采用距离倒数或高斯核函数进行加权,可以使模型更关注近邻信息,提升决策的合理性。在工程实践中,通过网格搜索等超参数优化技术,可以自动寻找最优的距离与权重组合,从而

weixin_33843947的博客 436

ROS入门(一)——ROS安装(vmware16+ubuntu20.04+ROS-Noetic)

嵌套:ROS可以在Ubuntu上运行,Ubuntu在虚拟机Vmware中安装。 从 虚拟机vmware安装→ubuntu安装→ros安装,逐步介绍安装ROS环境的过程。整个过程是我一步步跟着各种博客安装实现的,亲测可行。 版本: Vmware :Vmware Workstation16 Ubuntu :20.04 ROS :Noetic 其中vmware直接载当前最新版本就好,而ubuntu的版本要注意一下。 在ROS官网(cn - ROS Wiki),我们进入到ROS安装的步骤界面,可以看..

Netceor的博客 9740

机器学习算法-K近邻算法-KNN

摘要: K近邻(KNN)是一种基于实例的懒惰学习算法,通过计算样本间的距离(如欧氏距离)找到目标点的K个最近邻居,根据多数投票(分类)或平均值(回归)进行预测。其核心优势在于简单性、无需数据分布假设,但计算成本高,适合小规模低维数据(如推荐系统、医疗诊断)。生产中需优化计算效率(如KD树、近似近邻)和处理类别不平衡。相比逻辑回归,KNN更适应非线性模式但可解释性差,适用于快速验证或复杂局部特征场景,但在高维大数据或实时系统中表现受限。

--Joern的物联领域-- 1051

硬件工程师笔记——三极管Multisim电路仿真实验汇总

NPN型三极管:由N型半导体、P型半导体和N型半导体组成,即NPN结构。 PNP型三极管:由P型半导体、N型半导体和P型半导体组成,即PNP结构。 三极管的工作原理基于电流的控制和放大,其核心是基区对电流的控制作用。 将三极管等效为两个串联的二极管进行等效分析

XU157303764的博客 2635

让 ABAP 开发者也能做出高质量 SAP Fiori:到底需要掌握多少前端知识?

文章摘要: 随着SAP技术演进,ABAP开发者的角色边界正在重构。传统SAP GUI时代的全栈开发模式逐渐转向RAP+Fiori Elements的新范式,其中关键技术变化包括: 开发模式转变:从前后端耦合转向RAP模型驱动开发,通过CDS注解实现UI意图表达 分工优化:Fiori Elements模板处理80%标准UI需求,Flexible Programming Model解决20%差异化需求 效率提升:注解驱动开发可在RAP建模阶段同步定义UI结构,大幅缩短交付周期 工具整合:SAP提供从建模到部署的

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 349

KNN 分类器实战:鸢尾花数据集 3 种距离度量对比,准确率差异达 5%

本文深入探讨了KNN分类器在鸢尾花数据集上三种距离度量(欧氏距离、曼哈顿距离、闵可夫斯基距离)的性能差异。实验结果显示,曼哈顿距离以98%的准确率表现最佳,比欧氏距离高出0.7个百分点。文章详细分析了不同距离度量的数学本质和适用场景,并提供了KNN实战中的优化策略和参数选择建议。

weixin_33782386的博客 376

极智芯 | 解读国产CPU之海光

大家好,我是极智视界,本文分享一下 解读国产CPU之海光。希望我的分享能对你的学习有一点帮助。

极智视界 3318

KNN实战手册:距离度量、K值选择与特征缩放工程指南

K近邻(KNN)是一种基于实例的非参数化机器学习算法,其核心原理是通过计算样本间距离实现局部决策。由于不依赖数据分布假设且推理过程可解释,KNN在金融风控、工业质检和医疗预测等需审计留痕的场景中具备独特价值。但其性能高度依赖距离度量选择、K值鲁棒性及特征缩放策略——欧氏距离易受量纲干扰,马氏距离可消除特征相关性,而Robust Scaling能有效应对传感器异常值。实际应用中,K值需兼顾偏差-方差权衡与业务延迟约束,加权机制则可缓解类别不平衡问题。本文聚焦KNN在小样本、高噪声、非结构化数据中的落地难点,提

weixin_34372728的博客 375

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

KNN算法原理与实战:从距离度量到生产部署

K最近邻(KNN)是一种基于实例的非参数化机器学习算法,其核心原理是通过计算新样本与训练样本间的距离(如欧氏距离、曼哈顿距离或余弦相似度),在特征空间中寻找K个最近邻并据此进行分类投票或回归预测。该算法无需显式模型训练,但对特征尺度极度敏感,标准化或归一化是保障性能的前提;K值选择直接影响偏差-方差权衡,而维度灾难则在高维场景下导致距离失效。KNN因其可解释性强、支持增量学习、天然适配小样本与实时推理,在信用评分、手写识别、客户分群等场景中持续发挥独特价值。

weixin_30263073的博客 392

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

K-近邻算法实战指南:从原理到Python实现

本文详细介绍了K-近邻算法(KNN)从原理到Python实现的完整指南,包括算法工作原理、核心三要素(距离度量、k值选择、分类决策规则)、距离度量的艺术与科学、K值选择的策略与技巧,以及基于scikit-learn的完整实现和实战案例。通过丰富的代码示例和实战经验,帮助读者快速掌握这一直观的分类算法,并应用于实际项目中。

weixin_42552315的博客 356

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

别再只用欧氏距离了!用Python手写曼哈顿距离,搞定KNN和聚类中的特征选择难题

本文深入探讨了曼哈顿距离在机器学习中的应用,特别是在KNN和聚类算法中的优势。通过Python实现曼哈顿距离的多种方法,并结合Scikit-learn进行实战演示,展示了其在处理高维数据和异常值时的卓越性能。文章还提供了优化策略,如混合距离度量和特征加权,帮助开发者提升模型效果。

weixin_42680139的博客 214

KNN算法原理与实战:从距离度量到可解释性建模

KNN(K近邻)是一种基于实例的监督学习算法,其核心在于利用特征空间中的距离度量来识别相似样本。它不依赖参数拟合,而是通过邻居投票(分类)或加权平均(回归)完成预测,天然具备强可解释性与低实现门槛。该方法对特征尺度敏感,需标准化/归一化预处理;K值选择直接影响偏差-方差权衡,须借助交叉验证调优;距离函数(如欧氏距离、余弦相似度)和邻居搜索策略(KD树、Ball树)共同决定模型效率与鲁棒性。广泛应用于推荐系统、异常检测、小样本分类等需透明决策的工程场景。

weixin_33851429的博客 627

曼哈顿距离详解:从数学原理到Python/SQL/Java工程实战

在机器学习与数据分析中,距离度量是衡量样本相似度的基石。常见度量包括欧氏距离与曼哈顿距离,后者又称L1距离或城市街区距离,它基于绝对差之和计算,无需平方与开方,因此计算成本更低,且对异常值更鲁棒。在推荐系统、路径规划、KNN分类等场景中,曼哈顿距离往往比欧氏距离更能贴合业务直觉。为什么在高维数据中它更稳定?如何在Python、SQL和Java中高效实现?从基础公式到NumPy向量化、scikit-learn的pairwise_distances,再到数据库查询与分布式计算,本文结合实战案例,系统梳理曼哈顿距

chuannaoxuan4674的博客 363

K近邻算法:从原理到实战,掌握机器学习最直观的分类与回归方法

在机器学习领域,分类与回归是两大核心任务,而距离度量则是许多算法的基础。K近邻算法通过计算样本间的距离,依据“物以类聚”的原理,为新数据点找到最近的K个邻居,并通过投票或平均进行预测。这种基于实例的学习方法无需复杂训练,直观易懂,在特征工程和参数调优得当的情况下,能有效处理小规模、低维度的数据问题。其技术价值在于为复杂模型提供了一个可靠的性能基准,并广泛应用于推荐系统、异常检测等场景。本文深入探讨了KNN算法中特征标准化和K值选择这两个关键环节,通过优化距离计算与平衡模型复杂度,帮助读者在实践中更好地运用这

weixin_30591551的博客 349
上一篇: 异常检测的 “孤立森林”:二叉树分裂逻辑与工业设备故障检测落地
下一篇: 线性回归的 “最小二乘法”:从矩阵求导到数值稳定性优化(附 Python 手动实现)
THMAIL
博客等级 码龄10年 2434粉丝 432原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

THMAIL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值