许多机器学习算法期望数据被一致地缩放。

在为机器学习扩展数据时,你应该考虑两种常用的方法。

在这个教程中,您将了解如何为机器学习重新缩放您的数据。阅读完这个教程后,您将知道:

  • 如何从头开始对您的数据进行标准化。
  • 如何从头开始标准化您的数据。
  • 何时归一化数据而不是标准化数据。

描述

许多机器学习算法期望输入和输出数据的规模是相当的。

它可以帮助在加权输入以进行预测的方法中,例如线性回归和逻辑回归。

在结合加权输入以复杂方式的方法中(如人工神经网络和深度学习)实际上需要这样做。

在这个教程中,我们将练习对一个标准的机器学习数据集进行重新缩放,该数据集以CSV格式提供。

具体来说,是皮马印第安人数据集。它包含768行和9列。文件中的所有值都是数值,特别是浮点数。我们将首先学习如何加载文件,然后稍后学习如何将加载的字符串转换为数值。

  • 数据集文件.
  • 数据集详情.

教程

本教程分为3个部分:

  1. 标准化数据。
  2. 标准化数据。
  3. 何时进行归一化和标准化。

这些步骤将为你处理扩展自己的数据提供必要的基础。

1. 数据归一化

正则化可以根据上下文指代不同的技术。

在这里,我们将归一化定义为将输入变量重新缩放至0到1的范围内。

归一化要求你知道每个属性的最小值和最大值。

这可以通过训练数据进行估算,或者如果你对问题领域有深入的了解,可以直接指定。

您可以通过枚举数据集中的值来轻松估计每个属性的最小和最大值。

下面的代码片段定义了dataset_minmax() 函数,该函数计算数据集中每个属性的最小值和最大值,然后返回这些最小值和最大值的数组。

# Find the min and max values for each column
def dataset_minmax(dataset):minmax = list()for i in range(len(dataset[0])):col_values = [row[i] for row in dataset]value_min = min(col_values)value_max = max(col_values)minmax.append([value_min, value_max])return minmax

我们可以构造一个用于测试的小数据集如下:

x1 x2

50 30

20 90

使用这个人为的数据集,我们可以测试我们的函数,以计算每列的最小值和最大值。

# Find the min and max values for each column
def dataset_minmax(dataset):minmax = list()for i in range(len(dataset[0])):col_values = [row[i] for row in dataset]value_min = min(col_values)value_max = max(col_values)minmax.append([value_min, value_max])return minmax# Contrive small dataset
dataset = [[50, 30], [20, 90]]
print(dataset)
# Calculate min and max for each column
minmax = dataset_minmax(dataset)
print(minmax)

运行示例将产生以下输出。

首先,数据集以列表的形式打印,然后以格式打印每列的最小值和最大值列1: 最小值,最大值 和 列2: 最小值,最大值

例如:

[[50, 30], [20, 90]]
[[20, 50], [30, 90]]

一旦我们得到了每列允许的最大值和最小值的估计,我们现在就可以将原始数据归一化到0到1的范围内。

将单个值归一化的计算方法是:

scaled_value = (value - min) / (max - min)

下面是一个在名为normalize_dataset()的函数中的实现,该函数对提供的数据集中的每一列进行值的标准化。

# Rescale dataset columns to the range 0-1
def normalize_dataset(dataset, minmax):for row in dataset:for i in range(len(row)):row[i] = (row[i] - minmax[i][0]) / (minmax[i][1] - minmax[i][0])

我们可以将这个函数与dataset_minmax()函数结合,并对人为数据集进行归一化。

# Find the min and max values for each column
def dataset_minmax(dataset):minmax = list()for i in range(len(dataset[0])):col_values = [row[i] for row in dataset]value_min = min(col_values)value_max = max(col_values)minmax.append([value_min, value_max])return minmax# Rescale dataset columns to the range 0-1
def normalize_dataset(dataset, minmax):for row in dataset:for i in range(len(row)):row[i] = (row[i] - minmax[i][0]) / (minmax[i][1] - minmax[i][0])# Contrive small dataset
dataset = [[50, 30], [20, 90]]
print(dataset)
# Calculate min and max for each column
minmax = dataset_minmax(dataset)
print(minmax)
# Normalize columns
normalize_dataset(dataset, minmax)
print(dataset)

运行此示例将打印以下输出,包括标准化的数据集。

[[50, 30], [20, 90]]
[[20, 50], [30, 90]]
[[1, 0], [0, 1]]

我们可以将此代码与加载CSV数据集的代码结合起来,加载并标准化皮马印第安人糖尿病数据集。

下载皮马印第安人数据集,并将其放置在当前目录中,文件名pima-indians-diabetes.csv

  • 数据集文件.

打开文件并删除底部的任何空行。

该示例首先加载数据集,并将每列的值从字符串转换为浮点数。从数据集中估计每列的最小值和最大值,最后对数据集中的值进行归一化。

from csv import reader# Load a CSV file
def load_csv(filename):file = open(filename, "rb")lines = reader(file)dataset = list(lines)return dataset# Convert string column to float
def str_column_to_float(dataset, column):for row in dataset:row[column] = float(row[column].strip())# Find the min and max values for each column
def dataset_minmax(dataset):minmax = list()for i in range(len(dataset[0])):col_values = [row[i] for row in dataset]value_min = min(col_values)value_max = max(col_values)minmax.append([value_min, value_max])return minmax# Rescale dataset columns to the range 0-1
def normalize_dataset(dataset, minmax):for row in dataset:for i in range(len(row)):row[i] = (row[i] - minmax[i][0]) / (minmax[i][1] - minmax[i][0])# Load pima-indians-diabetes dataset
filename = 'pima-indians-diabetes.csv'
dataset = load_csv(filename)
print('Loaded data file {0} with {1} rows and {2} columns').format(filename, len(dataset), len(dataset[0]))
# convert string columns to float
for i in range(len(dataset[0])):str_column_to_float(dataset, i)
print(dataset[0])
# Calculate min and max for each column
minmax = dataset_minmax(dataset)
# Normalize columns
normalize_dataset(dataset, minmax)
print(dataset[0])

运行示例会生成以下输出。

从数据集中打印出第一条评论,在标准化之前和之后,显示了缩放的效果。

Loaded data file pima-indians-diabetes.csv with 768 rows and 9 columns

[6.0, 148.0, 72.0, 35.0, 0.0, 33.6, 0.627, 50.0, 1.0]

[0.35294117647058826, 0.7437185929648241, 0.5901639344262295, 0.35353535353535354, 0.0, 0.5007451564828614, 0.23441502988898377, 0.48333333333333334, 1.0]

2. 标准化数据

标准化是一种重新缩放技术,指的是将数据的分布以0为中心,并将标准差调整到1。

平均值和标准差可以一起用来总结正态分布,也称为高斯分布或钟形曲线。

它要求在缩放之前已知每列值的均值和标准差。与上面的归一化类似,我们可以从训练数据中估计这些值,或者使用领域知识来指定它们的值。

让我们从创建函数开始,以从数据集中估计每列的均值和标准差统计数据。

均值描述了一组数字的中间或集中趋势。列的均值是通过将列的所有值相加并除以总值数量来计算的。

mean = sum(values) / total_values

下面的函数 column_means() 用于计算数据集中每列的平均值。

# calculate column means
def column_means(dataset):means = [0 for i in range(len(dataset[0]))]for i in range(len(dataset[0])):col_values = [row[i] for row in dataset]means[i] = sum(col_values) / float(len(dataset))return means

标准差描述了值从平均值的平均偏差。它可以通过将每个值与平均值的差值平方后求和,然后除以值的数量减去1,再开方来计算。

standard deviation = sqrt( (value_i - mean)^2 / (total_values-1))

下面的函数 column_stdevs() 计算数据集中每列的值的标准差,并假定已经计算出均值。

# calculate column standard deviations
def column_stdevs(dataset, means):stdevs = [0 for i in range(len(dataset[0]))]for i in range(len(dataset[0])):variance = [pow(row[i]-means[i], 2) for row in dataset]stdevs[i] = sum(variance)stdevs = [sqrt(x/(float(len(dataset)-1))) for x in stdevs]return stdevs

再次,我们可以构造一个小型数据集来演示从数据集中估计均值和标准差。

x1 x2

50 30

20 90

30 50

使用Excel电子表格,我们可以估算出每列的均值和标准差如下:

x1 x2

mean 33.3 56.6

stdev 15.27 30.55

使用人为构造的数据集,我们可以估计总结统计量。

from math import sqrt# calculate column means
def column_means(dataset):means = [0 for i in range(len(dataset[0]))]for i in range(len(dataset[0])):col_values = [row[i] for row in dataset]means[i] = sum(col_values) / float(len(dataset))return means# calculate column standard deviations
def column_stdevs(dataset, means):stdevs = [0 for i in range(len(dataset[0]))]for i in range(len(dataset[0])):variance = [pow(row[i]-means[i], 2) for row in dataset]stdevs[i] = sum(variance)stdevs = [sqrt(x/(float(len(dataset)-1))) for x in stdevs]return stdevs# Standardize dataset
dataset = [[50, 30], [20, 90], [30, 50]]
print(dataset)
# Estimate mean and standard deviation
means = column_means(dataset)
stdevs = column_stdevs(dataset, means)
print(means)
print(stdevs)

执行此示例将产生以下输出,与电子表格中计算的数字匹配。

[[50, 30], [20, 90], [30, 50]]
[33.333333333333336, 56.666666666666664]
[15.275252316519467, 30.550504633038933]

一旦计算了汇总统计数据,我们就可以轻松地对每列中的值进行标准化。

将给定值标准化的计算方法如下:

standardized_value = (value - mean) / stdev

下面是一个名为standardize_dataset()的函数,实现了这个方程

# standardize dataset
def standardize_dataset(dataset, means, stdevs):for row in dataset:for i in range(len(row)):row[i] = (row[i] - means[i]) / stdevs[i]

将这些函数与用于估计均值和标准差的汇总统计数据结合起来,我们可以对我们的虚构数据集进行标准化。

from math import sqrt# calculate column means
def column_means(dataset):means = [0 for i in range(len(dataset[0]))]for i in range(len(dataset[0])):col_values = [row[i] for row in dataset]means[i] = sum(col_values) / float(len(dataset))return means# calculate column standard deviations
def column_stdevs(dataset, means):stdevs = [0 for i in range(len(dataset[0]))]for i in range(len(dataset[0])):variance = [pow(row[i]-means[i], 2) for row in dataset]stdevs[i] = sum(variance)stdevs = [sqrt(x/(float(len(dataset)-1))) for x in stdevs]return stdevs# standardize dataset
def standardize_dataset(dataset, means, stdevs):for row in dataset:for i in range(len(row)):row[i] = (row[i] - means[i]) / stdevs[i]# Standardize dataset
dataset = [[50, 30], [20, 90], [30, 50]]
print(dataset)
# Estimate mean and standard deviation
means = column_means(dataset)
stdevs = column_stdevs(dataset, means)
print(means)
print(stdevs)
# standardize dataset
standardize_dataset(dataset, means, stdevs)
print(dataset)

执行此示例将生成以下输出,显示人为数据集的标准化值。

[[50, 30], [20, 90], [30, 50]]
[33.333333333333336, 56.666666666666664]
[15.275252316519467, 30.550504633038933]
[[1.0910894511799618, -0.8728715609439694], [-0.8728715609439697, 1.091089451179962], [-0.21821789023599253, -0.2182178902359923]]

再次强调,我们可以展示机器学习数据集的标准化。

下面的示例展示了如何加载和标准化Pima Indians糖尿病数据集,假设该数据集位于当前工作目录,如之前的标准化示例所示。

from csv import reader
from math import sqrt# Load a CSV file
def load_csv(filename):file = open(filename, "rb")lines = reader(file)dataset = list(lines)return dataset# Convert string column to float
def str_column_to_float(dataset, column):for row in dataset:row[column] = float(row[column].strip())# calculate column means
def column_means(dataset):means = [0 for i in range(len(dataset[0]))]for i in range(len(dataset[0])):col_values = [row[i] for row in dataset]means[i] = sum(col_values) / float(len(dataset))return means# calculate column standard deviations
def column_stdevs(dataset, means):stdevs = [0 for i in range(len(dataset[0]))]for i in range(len(dataset[0])):variance = [pow(row[i]-means[i], 2) for row in dataset]stdevs[i] = sum(variance)stdevs = [sqrt(x/(float(len(dataset)-1))) for x in stdevs]return stdevs# standardize dataset
def standardize_dataset(dataset, means, stdevs):for row in dataset:for i in range(len(row)):row[i] = (row[i] - means[i]) / stdevs[i]# Load pima-indians-diabetes dataset
filename = 'pima-indians-diabetes.csv'
dataset = load_csv(filename)
print('Loaded data file {0} with {1} rows and {2} columns').format(filename, len(dataset), len(dataset[0]))
# convert string columns to float
for i in range(len(dataset[0])):str_column_to_float(dataset, i)
print(dataset[0])
# Estimate mean and standard deviation
means = column_means(dataset)
stdevs = column_stdevs(dataset, means)
# standardize dataset
standardize_dataset(dataset, means, stdevs)
print(dataset[0])

运行示例会打印数据集的第一行,首先以原始格式加载,然后进行标准化,这样我们可以进行比较以查看差异。

Loaded data file pima-indians-diabetes.csv with 768 rows and 9 columns
[6.0, 148.0, 72.0, 35.0, 0.0, 33.6, 0.627, 50.0, 1.0]
[0.6395304921176576, 0.8477713205896718, 0.14954329852954296, 0.9066790623472505, -0.692439324724129, 0.2038799072674717, 0.468186870229798, 1.4250667195933604, 1.3650063669598067]

3. 归一化和标准化的时机

标准化是一种假设您的数据符合正态分布的缩放技术。

如果给定的数据属性是正常或接近正常,这可能是应该使用的缩放方法。

记录标准化过程中使用的摘要统计数据是良好的实践,这样你可以在将来标准化你可能希望用于模型的数据时应用它们。

归一化是一种不需要假设任何特定分布的缩放技术。

如果您的数据不是正态分布的,请在应用机器学习算法之前考虑将其标准化。

在归一化过程中,记录每个列的最小值和最大值是良好的实践,以便将来在使用您的模型时,可以对新数据进行归一化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93447.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93447.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/93447.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Application-properties 配置大全

SpringBoot - application.properties 配置大全 SpringBoot项目最重要也是最核心的配置文件就是application.properties,所有的框架配置都需要在这个配置文件中说明,以下配置不会的可以进行查阅并修改 #SPRING CONFIG(ConfigFileA…

MXFP4量化:如何在80GB GPU上运行1200亿参数的GPT-OSS模型

大型语言模型(Large Language Models, LLMs)如GPT-OSS、GPT-4、LLaMA和Mixtral的快速发展显著提升了人工智能的能力边界,但同时也带来了严峻的内存资源挑战。以1200亿参数的模型为例,在FP16精度下仅权重存储就需要约240GB的内存空…

Unity进阶--C#补充知识点--【Unity跨平台的原理】了解.Net

来源于唐老狮的视频教学,仅作记录和感悟记录,方便日后复习或者查找一.什么是.Net.Net是指微软一整套技术体系的统称与代号包含的内容有:框架体系:.Net Frameword, .Net Core, Mono开发语言:C#&a…

论文浅尝 | 提高大型语言模型的数学推理能力的学习定理基本原理(AAAI2025)

笔记整理:兰雅榕,浙江大学硕士生,研究方向为知识图谱、大语言模型论文链接:https://ojs.aaai.org/index.php/AAAI/article/view/33662发表会议:AAAI 20251. 动机提高开源大型语言模型(LLM)的数学…

母猪姿态转换行为识别:计算机视觉与行为识别模型调优指南

母猪姿态转换行为识别:计算机视觉与行为识别模型调优指南 1. 引言 1.1 研究背景与意义 母猪姿态转换行为识别是智能养殖领域的重要研究方向,通过计算机视觉技术自动识别母猪的站立、躺卧、行走等姿态变化,对于监测母猪健康状态、评估福利水平…

K8S集群环境搭建(一)

虚拟机镜像 ubuntu 24 虚拟机网络 虚拟网络–配置 nat模式主机ip配置宿主机ip配置 10.0.0.12 master 2c 10.0.0.15 node1 10.0.0.16 node2 10.0.0.17 node3 10.0.0.20 registersudo vi /etc/netplan/00-installer-config.yaml # 替换为实际文件名 sudo netplan applynetwork:v…

css预编译器实现星空背景图

打造梦幻星空背景:用CSS预处理器轻松实现动态效果 星空背景能为网页增添神秘感和视觉吸引力。通过CSS预处理器(如Sass/Less)可以高效实现可定制化的星空效果,避免重复编写纯CSS代码。以下是 Vue3 组件皮肤具体实现方法和代码示例。…

焊接机器人保护气体效率优化

在现代工业制造领域,焊接机器人的应用日益广泛,而保护气体在焊接过程中起着至关重要的作用。如何优化保护气体的效率,成为焊接技术发展的一个关键考量因素。WGFACS节气装置的出现,为焊接机器人在保护气体效率优化方面带来了显著的…

Portkey-AI gateway 的一次“假压缩头”翻车的完整排障记:由 httpx 解压异常引发的根因分析

笔者最近在本地搭建了Portkey AI Gateway(模型路由网关),然后按照文档中的方式进行测试。结果发现,网关能够接收到请求,但是Python测试的程序却运行报错。Python代码报错信息如下: Traceback (most recent …

什么是Session? PHP编程中Session用法详解

一、Session的基本概念 Session 是 Web 开发中用于在服务器端存储用户临时数据的一种机制,它允许服务器在不同的 HTTP 请求之间识别和跟踪特定用户的状态,本质上是‌服务器为每个用户开辟的临时私有存储空间‌。由于 HTTP 协议本身是无状态的&#xff…

【大模型】AI平台 joyagent 2.0 的部署与测试

github链接:https://github.com/jd-opensource/joyagent-jdgenie 本篇博客记录下自己在配置joyagent的过程,以【手动初始化环境,启动服务】为例,后端调用的deepseek-chat大模型。 前言 JoyAgent是由京东云开源的企业级多智能体系统…

计算机视觉(一):nvidia与cuda介绍

背景与意义 计算机视觉 (Computer Vision, CV) 需要对图像和视频进行处理、特征提取和模型训练,计算量巨大。GPU (图形处理单元) 擅长并行计算,非常适合深度学习、卷积操作、矩阵乘法等场景。NVIDIA 作为 GPU 领域的领导者,推出了 CUDA (Comp…

阿里云杭州 AI 产品法务岗位信息分享(2025 年 8 月)

(注:本岗位信息已获jobleap.cn授权,可在 CSDN 平台发布) 一、基本信息 招聘方:阿里云工作地点:杭州信息收录时间:2025 年 08 月 14 日 二、职位主要职责 为 AI 相关产品全流程提供法务支持&…

医疗智慧大屏系统 - Flask + Vue实现

下面我将实现一个完整的医疗智慧大屏系统,使用Flask作为后端框架,前端使用Vue.js结合ECharts进行医疗数据的可视化展示,文章末尾提交源码下载。 系统设计思路 前端部分: 使用Vue.js构建响应式界面 使用ECharts实现各类医疗数据可…

库制作与原理(下)

库制作与原理 (下) 1. 目标文件 编译和链接这两个步骤,在 Windows 下被我们的 IDE 封装的很完美,我们一般都是一键构建非常方便,但一旦遇到错误的时候呢,尤其是链接相关的错误,很多人就束手无策了。在 Linux 下&#x…

STL 容器

STL是C的核心组成部分,其主要包括了容器、迭代器、算法三大组件。 其中容器负责存储数据,迭代器是容器和算法的桥梁,负责对容器中的元素进行操作。本文重点介绍容器部分内容。 STL主要容器 STL容器根据特性进行分类,可以分为序列式…

微信小程序 拖拽签章

微信小程序 拖拽签章 效果 主要实现的功能点 文件按比例加载图片(宽高设定拖拽范围) 弹层展示印章模板 模板拖拽到文件图片上 实时获取拽拽位置 难点 弹层中的元素如何拖拽到文件图片上 实现历程 版本1.0 以前我们拖拽一个图层到另一个图层上,pc端使用的是mousedown mou…

人工智能加速计算套件

按照甲方要求的技术指标的人工智能加速计算套件1套。每套包含以下内容: 1、显卡 不低于6542Y;容量不低于 48GB GDDR6显存;CUDA核心不低于14080 个 ;第四代Tensor Core不低于440 个;单精度性能不低于69.3 TFLOPS&#x…

端到端测试:复杂系统的终极体检术

当你的应用像多米诺骨牌一样牵一发而动全身,如何确保用户一路畅通无阻?一、为什么我们需要端到端测试? 想象一下:你精心开发的电商应用,用户登录顺利,商品浏览流畅,却在最后支付时卡壳——原因是…

Perf使用详解

Perf 工具深度解析 Perf(Performance Counters for Linux)是 Linux 系统的性能分析工具,基于内核的 perf_event 子系统,通过硬件性能计数器(PMC)、软件事件和跟踪点(tracepoints)实现…