java normalize

2024-08-21 10:36
文章标签 java normalize

本文主要是介绍java normalize,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

上期回顾

在上期文章中,我们深入探讨了如何在 Java 中使用流和 Collectors 工具类处理集合中的相同字段对象。通过分组、聚合和去重操作,我们展示了如何有效地处理数据集。本期文章将基于这些基础知识,进一步研究在 Java 中如何进行数据归一化 (Normalization)。

前言

在数据处理和机器学习中,归一化是一个非常重要的步骤。归一化(Normalization)通常指的是将数据按比例缩放到一定的范围内,常见的范围包括 [0,1] 和 [-1,1]。通过归一化,数据的不同量级可以被统一处理,这对于优化算法的性能和模型的训练效果至关重要。本文将详细介绍在 Java 中如何进行数据归一化,并通过具体的代码示例和案例分析,帮助你在实际项目中应用这些技术。

摘要

本文旨在探讨 Java 中数据归一化的技术。我们将介绍几种常见的归一化方法,包括 Min-Max 归一化和 Z-score 标准化,并通过代码示例展示这些方法的实现。本文还将分析不同方法的优缺点,并提供测试用例验证代码的正确性。最后,我们将讨论归一化在机器学习和数据处理中的使用场景。

正文

知识点源码分析

在数据处理领域,归一化是将不同量级的数据按比例缩放到一个相对一致的范围。常见的归一化方法包括:

  1. Min-Max 归一化: 将数据缩放到 [0,1] 的范围。
  2. Z-score 标准化: 使数据的均值为 0,标准差为 1。
Min-Max 归一化

Min-Max 归一化的公式如下:

[
X’ = \frac{X - X_{\text{min}}}{X_{\text{max}} - X_{\text{min}}}
]

其中,( X ) 是原始数据,( X_{\text{min}} ) 和 ( X_{\text{max}} ) 分别是数据集的最小值和最大值,( X’ ) 是归一化后的数据。

Z-score 标准化

Z-score 标准化的公式如下:

[
Z = \frac{X - \mu}{\sigma}
]

其中,( \mu ) 是数据的均值,( \sigma ) 是标准差,( Z ) 是标准化后的数据。

案例Demo

Min-Max 归一化的实现

以下是一个简单的 Java 代码示例,演示如何进行 Min-Max 归一化:

import java.util.Arrays;public class NormalizationExample {public static double[] minMaxNormalize(double[] data) {double min = Arrays.stream(data).min().orElseThrow(IllegalArgumentException::new);double max = Arrays.stream(data).max().orElseThrow(IllegalArgumentException::new);return Arrays.stream(data).map(x -> (x - min) / (max - min)).toArray();}public static void main(String[] args) {double[] data = {10, 20, 30, 40, 50};double[] normalizedData = minMaxNormalize(data);System.out.println("Normalized Data: " + Arrays.toString(normalizedData));}
}
Z-score 标准化的实现

同样地,我们可以实现 Z-score 标准化:

import java.util.Arrays;public class NormalizationExample {public static double[] zScoreNormalize(double[] data) {double mean = Arrays.stream(data).average().orElseThrow(IllegalArgumentException::new);double std = Math.sqrt(Arrays.stream(data).map(x -> Math.pow(x - mean, 2)).average().orElseThrow(IllegalArgumentException::new));return Arrays.stream(data).map(x -> (x - mean) / std).toArray();}public static void main(String[] args) {double[] data = {10, 20, 30, 40, 50};double[] normalizedData = zScoreNormalize(data);System.out.println("Z-score Normalized Data: " + Arrays.toString(normalizedData));}
}

相关内容拓展及延伸

在实际项目中,归一化处理不仅限于数值数据,还可以应用于文本数据的向量化表示。对于多维数据集,可以对每一维进行独立的归一化。此外,还可以根据具体需求对归一化进行自定义调整。例如,针对带有异常值的数据,可能需要对数据进行修正或使用鲁棒的标准化方法,如中位数绝对偏差 (MAD)。

优缺点对比

Min-Max 归一化
  • 优点: 简单直接,适用于数据范围已知且没有异常值的情况。
  • 缺点: 对异常值敏感,容易受到极值的影响。
Z-score 标准化
  • 优点: 适用于数据分布未知或有异常值的情况,较为稳健。
  • 缺点: 计算较复杂,依赖于数据的均值和标准差。

测试用例

为了验证归一化的实现,我们可以编写以下测试用例:

import org.junit.Assert;
import org.junit.Test;public class NormalizationTest {@Testpublic void testMinMaxNormalize() {double[] data = {10, 20, 30, 40, 50};double[] expected = {0.0, 0.25, 0.5, 0.75, 1.0};double[] normalizedData = NormalizationExample.minMaxNormalize(data);Assert.assertArrayEquals(expected, normalizedData, 0.0001);}@Testpublic void testZScoreNormalize() {double[] data = {10, 20, 30, 40, 50};double[] expected = {-1.4142, -0.7071, 0.0, 0.7071, 1.4142};double[] normalizedData = NormalizationExample.zScoreNormalize(data);Assert.assertArrayEquals(expected, normalizedData, 0.0001);}
}

代码解析

上述测试用例使用了 JUnit 进行测试,验证了 Min-Max 归一化和 Z-score 标准化的正确性。我们通过比较预期结果和实际结果,确保了归一化方法的准确性。

使用场景

数据归一化在以下场景中尤为重要:

  1. 机器学习: 在训练模型前,数据归一化有助于加快收敛速度和提高模型的精度。
  2. 数据可视化: 为了更好地展示数据,归一化可以避免不同量级数据的影响,使得图表更加直观。
  3. 数据处理: 在对数据进行聚类或降维时,归一化可以确保各个维度的影响力相等。

全文总结

在本文中,我们详细介绍了 Java 中数据归一化的几种常用方法,包括 Min-Max 归一化和 Z-score 标准化。通过代码示例和测试用例,我们展示了这些方法的实现和应用场景。数据归一化是数据处理中的一个重要步骤,正确的归一化可以显著提升后续数据分析和建模的效果。

下期内容预告

在下一期文章中,我们将继续探讨数据处理的高级主题,特别是如何在 Java 中进行特征选择和工程,以优化机器学习模型的性能。敬请期待!

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

这篇关于java normalize的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092917

相关文章

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

springboot filter实现请求响应全链路拦截

《springbootfilter实现请求响应全链路拦截》这篇文章主要为大家详细介绍了SpringBoot如何结合Filter同时拦截请求和响应,从而实现​​日志采集自动化,感兴趣的小伙伴可以跟随小... 目录一、为什么你需要这个过滤器?​​​二、核心实现:一个Filter搞定双向数据流​​​​三、完整代码

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3

Java Predicate接口定义详解

《JavaPredicate接口定义详解》Predicate是Java中的一个函数式接口,它代表一个判断逻辑,接收一个输入参数,返回一个布尔值,:本文主要介绍JavaPredicate接口的定义... 目录Java Predicate接口Java lamda表达式 Predicate<T>、BiFuncti

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++