机器学习的敲门砖:kNN算法(下

工程师必看:如何用功率谱密度搞定随机振动测试(附Grms计算实例) 本文为工程师详解如何通过功率谱密度(PSD)曲线计算Grms(总均方根加速度),从而量化随机振动测试的强度。文章拆解了平直谱、斜谱的计算公式,提供了完整的Grms计算实例,并指出了单位换算、对数坐标等常见工程陷阱,帮助工程师精准完成测试准备与设备推力评估。 阅读详情

plt.scatter(X2[:,0],X2[:,1])

plt.show()

640?wx_fmt=jpeg

计算其均值/方差

np.mean(X2[:,0])

np.std(X2[:,1])

1.4 Sklearn中的归一化

首先我们来看一个在实际使用归一化时的一个小陷阱。

我们在建模时要将数据集划分为训练数据集&测试数据集。

训练数据集进行归一化处理,需要计算出训练数据集的均值mean_train和方差std_train。

问题是:我们在对测试数据集进行归一化时,要计算测试数据的均值和方差么?

答案是否定的。在对测试数据集进行归一化时,仍然要使用训练数据集的均值train_mean和方差std_train。这是因为测试数据是模拟的真实环境,真实环境中可能无法得到均值和方差,对数据进行归一化。只能够使用公式(x_test - mean_train) / std_train

因此我们要保存训练数据集中得到的均值和方差。

在sklearn中专门的用来数据归一化的方法:StandardScaler。

下面我们加载鸢尾花数据集

import numpy as npfrom sklearn import datasetsfrom sklearn.model_selection import train_test_split

iris = datasets.load_iris()

X = iris.data

y = iris.target

X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=666)

使用数据归一化的方法:

from sklearn.preprocessing import StandardScaler

standardScaler = StandardScaler()# 归一化的过程跟训练模型一样standardScaler.fit(X_train)

standardScaler.mean_

standardScaler.scale_ # 表述数据分布范围的变量,替代std_# 使用transformX_train_standard = standardScaler.transform(X_train)

X_test_standard = standardScaler.transform(X_test)

如此就能输出归一化后的数据了。

1.5 自己实现均值方差归一化

同样地,我们仿照sklearn的风格,可以自己实现一下均值方差归一化的方法。

我们在之前的工程中创建processing.py:

import numpy as npclass StandardScaler:

def init(self):

self.mean_ = None

self.scale_ = None

def fit(self, X):

“”“根据训练数据集X获得数据的均值和方差”“”

assert X.ndim == 2, “The dimension of X must be 2”

求出每个列的均值

self.mean_ = np.array([np.mean(X[:,i] for i in range(X.shape[1]))])

self.scale_ = np.array([np.std(X[:, i] for i in range(X.shape[1]))]) return self def tranform(self, X):

“”“将X根据StandardScaler进行均值方差归一化处理”“”

assert X.ndim == 2, “The dimension of X must be 2”

assert self.mean_ is not None and self.scale_ is not None, \ “must fit before transform”

assert X.shape[1] == len(self.mean_), \ “the feature number of X must be equal to mean_ and std_”

创建一个空的浮点型矩阵,大小和X相同

resX = np.empty(shape=X.shape, dtype=float) # 对于每一列(维度)都计算

for col in range(X.shape[1]):

resX[:,col] = (X[:,col] - self.mean_[col]) / self.scale_[col] return resX

0x02 kNN优缺点


KNN的主要优点有:

  1. 理论成熟,思想简单,既可以用来做分类也可以用来做回归

  2. 天然解决多分类问题,也可用于回归问题

  3. 和朴素贝叶斯之类的算法比, 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 对数据没有假设,准确度高,对异常点不敏感

  4. 由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合

KNN的主要缺点有:

  1. 计算量大,效率低。

即使优化算法,效率也不高。

  1. 高度数据相关,样本不平衡的时候,对稀有类别的预测准确率低

  2. 相比决策树模型,KNN模型可解释性不强

  3. 维数灾难:

随着维度的增加,“看似相近”的两个点之间的距离越来越大,而knn非常依赖距离

| 维数 | 点到点 | 距离 |

| — | — | — |

| 1维 | 0到1的距离 | 1 |

| 2维 | (0,0)到(1,1)的距离 | 1.414 |

| 3维 | (0,0,0)到(1,1,1)的距离 | 1.73 |

| 64维 | (0,0,…0)到(1,1,…1) | 8 |

| 10000维 | (0,0,…0)到(1,1,…1) | 100 |

大家感觉一万维貌似很多,但实际上就是100*100像素的黑白灰图片。

以上就是关于kNN算法的总结。

你是不是以为这一篇就两节内容就结束了?没想到吧!下面还有一波干货:kNN优化之KD树。

3 KD树


K近邻法的重要步骤是对所有的实例点进行快速k近邻搜索。如果采用线性扫描(linear scan),要计算输入点与每一个点的距离,时间复杂度非常高。因此在查询操作是,使用kd树。

3.1 kd树的原理

kd树是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构,且kd树是一种二叉树,表示对k维空间的一个划分。

k-d tree是每个节点均为k维样本点的二叉树,其上的每个样本点代表一个超平面,该超平面垂直于当前划分维度的坐标轴,并在该维度上将空间划分为两部分,一部分在其左子树,另一部分在其右子树。即若当前节点的划分维度为d,其左子树上所有点在d维的坐标值均小于当前值,右子树上所有点在d维的坐标值均大于等于当前值,本定义对其任意子节点均成立。

3.2 kd树的构建

常规的k-d tree的构建过程为:

  1. 循环依序取数据点的各维度来作为切分维度,

  2. 取数据点在该维度的中值作为切分超平面,

  3. 将中值左侧的数据点挂在其左子树,将中值右侧的数据点挂在其右子树,

  4. 递归处理其子树,直至所有数据点挂载完毕。

对于构建过程,有两个优化点:

  • 选择切分维度:根据数据点在各维度上的分布情况,方差越大,分布越分散,从方差大的维度开始切分,有较好的切分效果和平衡性。

  • 确定中值点:预先对原始数据点在所有维度进行一次排序,存储下来,然后在后续的中值选择中,无须每次都对其子集进行排序,提升了性能。也可以从原始数据点中随机选择固定数目的点,然后对其进行排序,每次从这些样本点中取中值,来作为分割超平面。该方式在实践中被证明可以取得很好性能及很好的平衡性。

例子:

  1. 构建根节点时,此时的切分维度为x,如上点集合在x维从小到大排序为(2,3),(4,7),(5,4),(7,2),(8,1),(9,6);

其中值为(7,2)。

(注:

2,4,5,7,8,9在数学中的中值为(5 + 7)/2=6,但因该算法的中值需在点集合之内,所以本文中值计算用的是len(points)//2=3, points[3]=(7,2))

  1. (2,3),(4,7),(5,4)挂在(7,2)节点的左子树,(8,1),(9,6)挂在(7,2)节点的右子树。

  2. 构建(7,2)节点的左子树时,点集合(2,3),(4,7),(5,4)此时的切分维度为y,中值为(5,4)作为分割平面,(2,3)挂在其左子树,(4,7)挂在其右子树。

  3. 构建(7,2)节点的右子树时,点集合(8,1),(9,6)此时的切分维度也为y,中值为(9,6)作为分割平面,(8,1)挂在其左子树。

至此k-d tree构建完成。

640?wx_fmt=jpeg

上述的构建过程结合下图可以看出,构建一个k-d tree即是将一个二维平面逐步划分的过程。

640?wx_fmt=jpeg

需要注意的是,对于每次切分,都是循环顺序选择维度的,二维是:x->y->x…;三维则是:x->y->z->x…。

下面从三维空间来看一下k-d tree的构建及空间划分过程。首先,边框为红色的竖直平面将整个空间划分为两部分,此两部分又分别被边框为绿色的水平平面划分为上下两部分。最后此4个子空间又分别被边框为蓝色的竖直平面分割为两部分,变为8个子空间,此8个子空间即为叶子节点。

640?wx_fmt=jpeg

points为实例点集合,depth深度,为用来确定取维度的参数def kd_tree(points, depth):

if 0 == len(points): return None

指定切分维度,len(points[0])是数据的实际维度,这样计算可以保证循环

cutting_dim = depth % len(points[0]) # 切分点初始化

medium_index = len(points) # 对所有的实例点按照指定维度进行排序,itemgetter用于获取对象哪些维度上的数据,参数为需要获取的数据在对象中的序号

points.sort(key=itemgetter(cutting_dim))

将该维度的中值点作为根节点

node = Node(points[medium_index])

对于左子树,重复构建(depth+1)

node.left = kd_tree(points[:medium_index], depth + 1)

对于右子树,重复构建(depth+1)

node.right = kd_tree(points[medium_index + 1:], depth + 1)

OpenClaw实战系列03:Slack/Telegram国际版接入实战指南 在当今的软件开发和工作流自动化中,将项目管理工具与即时通讯平台集成已成为提高团队协作效率的关键。OpenClaw作为一个开源的自动化工具,通过接入Slack和Telegram国际版,可以实现实时通知、自动化任务触发和团队协作的无缝对接。本文将详细介绍如何实现OpenClaw与这两个主流即时通讯平台的集成。OpenClaw是一个开源的自动化工作流引擎,支持多种触发器和执行器,能够帮助开发团队实现CI/CD流程、任务调度、监控告警等自动化场景。模块化设计:支持插件化扩展多触发器支持。 阅读详情

相关推荐

用FPGA在HDMI上显示自定义字符:从COE文件到OSD叠加的保姆级教程

本文详细介绍了如何在FPGA上实现HDMI视频流的OSD字符叠加技术,从COE文件生成到动态区域控制的完整流程。通过Verilog代码示例和实战技巧,帮助开发者掌握字符ROM设计、像素坐标追踪和动态混合等核心技术,适用于视频监控、系统状态显示等应用场景。

weixin_28720767的博客 231

KNN(K 邻近算法) 相关知识

KNN(K 邻近算法)主要根据特征之间的距离来进行分类的。

专注学习,坚持分享 1586

TCGA之GDC-client工具下载安装与使用

文章主要是对GDC-client工具下载TCGA数据库数据整个过程的一个记录 1.下载GDC-client工具 GDC-client工具网址:GDC Data Transfer Tool | NCI Genomic Data Commons (cancer.gov) 我这里下的是上图中红圈中的版本, 2.解压安装 从网上了解的是不能解压到带中文的路径里,解压后是一个.exe文件,为了能直接在cmd命令行下使用,将其加入系统环境: 点击新建之后,输入将文件解压到的路径,然后...

better_strong的博客 1万+

机器学习(四) 机器学习(四) 分类算法--K近邻算法 KNN (下)

六、网格搜索与 K 邻近算法中更多的超参数 七、数据归一化 Feature Scaling 解决方案:将所有的数据映射到同一尺度 八、scikit-learn 中的 Scaler preprocessing.py import numpy as np class StandardScaler: def __i...

侠道 257

Xilinx FPGA 10G Ethernet Subsystem example

The 10G Ethernet subsystem provides 10 Gb/s Ethernet MAC, Physical Coding Sublayer(PCS) and Physical Medium Attachment (PMA) transmit and receive functionality over anAXI4-Stream interface.

青城扬沙的博客 2379

ubuntu18.04安装Nvidia显卡驱动后黑屏及网络、蓝牙驱动消失的解决方案

ubuntu18.04安装Nvidia显卡驱动后黑屏及网络、蓝牙驱动消失的解决方案

weixin_40735291的博客 6618

python机器学习之数据集(查看数据,划分训练集、测试集)

一、获取数据集 在一些大数据比赛的网站或者sklearn官方的网站可以下载一些数据集 如: scikit-learn: machine learning in Python — scikit-learn 1.0.2 documentationhttps://scikit-learn.org/stable/

luluoluoa的博客 8544

调节桌面图标大小的方法(编程)

如果你对其他操作系统或编程语言有类似的需求,可以根据具体的情况进行相应的调整和搜索相关的库和方法。在编程中,我们可以使用各种桌面应用程序来调节桌面图标的大小。库提供的函数,我们获取了桌面图标的窗口句柄,并使用Windows消息发送方式设置图标的大小。你可以根据自己的需求修改代码中的图标大小值,并在运行代码后观察桌面图标的变化。函数并传入所需的图标大小,这里设置为48x48像素。首先,我们需要使用Python的第三现的方法。首先,我们需要使用Python的第三方库。首先,我们需要使用实现的方法。

CyberFlare的博客 438

K近邻算法及其python实现(KNN)

K近邻是机器学习所有算法中理论最简单,最好理解的一种算法。 步骤: 1.为了判断未知类别以已知类别做参照。 2.选择参数K(K个距离最近的邻居)K一般为奇数(少数服从多是原则) 3.计算未知所有已知实例的距离 注意: 1.K值选取 2.关于距离的衡量 距离: 欧拉距离:真实距离 曼哈顿距离:街区距离 解释一下:可以在棋盘中理解,卒走过的轨迹,就是他和起点的距离。 余弦距离。...

fighting_yifeng的博客 502

从入门到精通|Yalmip+Cplex在电力系统中的应用(Matlab代码实现)

​ 火电成本包括运行成本、碳捕集成本,其中火电运行成本由运行维护成 本和发电煤耗成本构成,发电煤耗与其出力关系: ,F 为机组煤耗量(kg/h),P 为机组出力/MW;运行维护成本按照 0.5 倍煤耗成本考虑,碳捕集成本取决于碳排放量及碳捕集单价,火电机组相关参数如附表 1 所示,电煤价格为 700 元/t ​

weixin_46039719的博客 1552

RK3399平台开发系列讲解(外设篇)交换芯片RTL8306M

网络:交换芯片RTL8306M 电路: make menuconfig 配置: 目录:arch/arm64/configs/rk3399_b201_defconfig CONFIG_FIXED_PHY=y 设备树: arch/arm64/boot/dts/rockchip/rk3399-b201-rev1.dts 时钟: Open之后首先校验网卡mac地址是否正确(stmmac_chec...

内核笔记 2390

机器学习之KNN算法:日撸Java三百行day51-53

一、什么是KNN算法 K近邻(K-Nearest Neighbor, KNN),是一种最简单和最经典的有监督学习算法之一。KNN算法是最简单的分类器,可以应用于分类和回归问题。同时,它也不具备任何显式的学习过程或训练过程,属于懒惰学习(Lazy Learning)。所谓懒惰学习,类似于开卷考试,在已有数据中去找答案。虽然KNN是懒惰学习,但它的算法效果十分出色。 二、KNN算法的基本思想 以iris分类问题为例:将iris的特征数据散布在特征空间中,将每一个分类对象抽象成一个点。找到距离它最近的K

. 2656

企业数字化转型解决方案架构设计:一个五维全景视角

本文系统探讨了企业数字化转型的架构设计框架,提出五维协同模型:企业架构作为战略罗盘,业务架构聚焦价值创造,应用架构实现能力载体,数据架构提供智能燃料,技术架构奠定基础支撑。文章深入分析了各架构域的核心要素、设计原则及相互关系,并指出数字化转型需通过渐进路径,结合战略引领、技术赋能和组织变革,构建有机统一的架构体系。该框架为企业应对数字化复杂性提供了系统性方法论,强调从整体视角实现技术与业务的深度融合。

金牌架构师 1256

机器学习的敲门砖:kNN算法(上)

机器学习的敲门砖:kNN算法(上)本文为数据茶水间群友原创,经授权在本公众号发表。关于作者:Japson。某人工智能公司AI平台研发工程师,专注于AI工程化及场景落地。持...

木东居士 360

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

机器学习的敲门砖:kNN算法(中)

机器学习的敲门砖:kNN算法(中)本文为数据茶水间群友原创,经授权在本公众号发表。关于作者:Japson。某人工智能公司AI平台研发工程师,专注于AI工程化及场景落地。持...

木东居士 588

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

机器学习的敲门砖:kNN算法(下)

机器学习的敲门砖:kNN算法(下)本文为数据茶水间群友原创,经授权在本公众号发表。关于作者:Japson。某人工智能公司AI平台研发工程师,专注于AI工程化及场景落地。持...

木东居士 345

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: 普通用户sftp 无法使用解决方法
下一篇: 架构师:优秀的代码都是如何分层的?
java100001
博客等级 码龄5年 4粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值