关于归一化算法的简单实践

这篇具有很好参考价值的文章主要介绍了关于归一化算法的简单实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求来源

前段时间有个需求要对矩阵数据做归一化处理,之后在对数据做一致性校验,并获取数据对应的权重。

需求分析

1、了解归一化算法
2、通过数据构建矩阵信息
3、数据处理
4、获取权重

实现方案

1、简单说一下概念:
归一化是一种数据处理方式,能将数据经过处理后限制在某个固定范围内。当前的需求是将数据处理为[0,1]之间的小数。

2、计算方法
2.1、归一化算法公式:
矩阵归一化,java,归一化算法,一致性校验
2.2、权重算法公式:
矩阵归一化,java,归一化算法,一致性校验
2.3、一致性校验公式:
矩阵归一化,java,归一化算法,一致性校验
2.4、一致性比例计算:
矩阵归一化,java,归一化算法,一致性校验
注:当CR<0.1时,具有一致性;否则不具有一致性。

代码实现

代码如下,做个记录:文章来源地址https://www.toymoban.com/news/detail-737553.html

package com.***.***.**;

import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;

import java.text.DecimalFormat;
import java.util.HashMap;

public class MatrixSet {

    /**
     * 矩阵横向编码
     */
    private static final String MATRIX_X = "X";

    /**
     * 矩阵纵向编码
     */
    private static final String MATRIX_Y = "Y";

    /**
     * 对应的平均随机一致性指标 RI,目前存放15阶
     */
    private static final HashMap<Integer, Double> RI_MAP = new HashMap<>();

    private static final DecimalFormat DF = new DecimalFormat("######0.00");

    static {
        RI_MAP.put(1, 0d);
        RI_MAP.put(2, 0d);
        RI_MAP.put(3, 0.52d);
        RI_MAP.put(4, 0.89d);
        RI_MAP.put(5, 1.12d);
        RI_MAP.put(6, 1.26d);
        RI_MAP.put(7, 1.36d);
        RI_MAP.put(8, 1.41d);
        RI_MAP.put(9, 1.46d);
        RI_MAP.put(10, 1.49d);
        RI_MAP.put(11, 1.52d);
        RI_MAP.put(12, 1.54d);
        RI_MAP.put(13, 1.56d);
        RI_MAP.put(14, 1.58d);
        RI_MAP.put(15, 1.59d);
    }

    public static void main(String[] args) {
        try {
            // 存放权重
            HashMap<String, String> weightMap = new HashMap<>();
            // 矩阵信息
            String matrixData = "[[\"A\",\"1\",\"2\",\"3\"],[\"B\",\"1\",\"5\",\"1/3\"],[\"C\",\"1/5\",\"1\",\"1/7\"],[\"D\",\"3\",\"7\",\"1\"]]";
            // 获取矩阵数据
            String[][] data = JSON.parseObject(matrixData, String[][].class);

            if (data.length > 0) {
                // 获取double精度的二维数组
                // 原数据数组
                double[][] arr = getDoubleArrData(data);

                // 数据校验(可对数据做其他逻辑处理)
                boolean flag = dataCheck(arr);

                // sumColumn值计算
                // parameter="X"--横向
                // parameter="Y"--纵向
                double[] sumColumn = getSumData(arr, "Y");

                // 归一化矩阵
                double[][] normalizationArr = getNormalizationArrData(arr, sumColumn);

                // sumRowColumn值计算
                double[] sumRowColumn = getSumData(normalizationArr, "X");

                // ω(权重)
                double[] weightColumn = getWeightData(sumRowColumn, arr.length);
                System.out.println("权重为:" + JSON.toJSON(weightColumn));

                // 𝛼ω
                double[] aWeightColumn = getAWeightdata(arr, weightColumn);

                // λmax = sum(每个𝛼ω/每个ω)
                double λmax = getAmax(aWeightColumn, weightColumn);

                // CI=(λmax-n)/(n-1)
                double ci = (λmax - arr.length) / (arr.length - 1);

                // RI
                double ri = RI_MAP.get(arr.length);

                // CR=CI/RI
                double cr = ci / ri;

                if (cr >= 0.1) {
                    System.out.println("当前矩阵不具有一致性");
                }
                else {
                    // 存放指标权重
                    for (int i = 0; i < weightColumn.length; i++) {
                        // 可根据需要做数据处理
                        weightMap.put(i + "", DF.format(weightColumn[i]));
                    }
                }
            }
            else {
                System.out.println("当前矩阵值为空");
            }
        }
        catch (Exception e) {
            System.out.println("矩阵数据处理异常,consistencyCheck:" + e.getMessage());
        }
    }

    /**
     * 获取double精度的二维数组
     *
     * @param orginArr 原始矩阵数据
     * @return 结果
     */
    private static double[][] getDoubleArrData(String[][] orginArr) {
        double[][] data = new double[orginArr.length - 1][orginArr.length - 1];
        for (int i = 1; i < orginArr.length; i++) {
            for (int j = 1; j < orginArr.length; j++) {
                if (orginArr[i][j].indexOf("/") > 0) {
                    if (StringUtils.isNotBlank(orginArr[i][j].split("/")[1])
                        && NumberUtils.toDouble(orginArr[i][j].split("/")[1]) != 0) {
                        double newDoubleData = NumberUtils.toDouble(orginArr[i][j].split("/")[0], 0d)
                            / NumberUtils.toDouble(orginArr[i][j].split("/")[1]);
                        data[i - 1][j - 1] = newDoubleData;
                    }
                    else {
                        System.out.println("填写的数据不能为空!");
                    }
                }
                else {
                    data[i - 1][j - 1] = NumberUtils.toDouble(orginArr[i][j]);
                }
            }
        }
        return data;
    }

    /**
     * 数据校验
     *
     * @param arr 原数组
     * @return 结果
     */
    private static boolean dataCheck(double[][] arr) {
        boolean result = false;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length; j++) {
                if (arr[i][j] == 0) {
                    result = true;
                }
            }
        }
        return result;
    }

    /**
     * 获取矩阵每行或者每列数据之和
     *
     * @param arr 矩阵参数
     * @param arr 矩阵参数
     * @return 结果
     */
    private static double[] getSumData(double[][] arr, String parameter) {
        double[] result = new double[arr.length];

        for (int i = 0; i < arr.length; i++) {
            double column = 0d;
            for (int j = 0; j < arr.length; j++) {
                if (StringUtils.equals(MATRIX_X, parameter)) {
                    column += arr[i][j];
                }
                else if (StringUtils.equals(MATRIX_Y, parameter)) {
                    column += arr[j][i];
                }
            }
            result[i] = column;
        }
        return result;
    }

    /**
     * 获取归一化矩阵
     *
     * @param arr 原数组
     * @param sumColumn 原数组纵向之和数组
     * @return 结果
     */
    private static double[][] getNormalizationArrData(double[][] arr, double[] sumColumn) {

        double[][] normalizationArr = new double[arr.length][arr.length];
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length; j++) {
                normalizationArr[i][j] = arr[i][j] / sumColumn[j];
            }
        }
        return normalizationArr;
    }

    /**
     * 获取权重数组
     *
     * @param sumRowColumn
     * @param length
     * @return
     */
    private static double[] getWeightData(double[] sumRowColumn, int length) {
        double[] weightColumn = new double[sumRowColumn.length];
        for (int i = 0; i < weightColumn.length; i++) {
            weightColumn[i] = sumRowColumn[i] / length;
        }
        return weightColumn;
    }

    /**
     * 获取𝛼ω
     *
     * @param arr 原数组
     * @param weightColumn 权重
     * @return 结果
     */
    private static double[] getAWeightdata(double[][] arr, double[] weightColumn) {
        double[] aWeightColumn = new double[arr.length];
        for (int i = 0; i < arr.length; i++) {
            double temp = 0d;
            for (int j = 0; j < arr.length; j++) {
                temp += arr[i][j] * weightColumn[j];
            }
            aWeightColumn[i] = temp;
        }
        return aWeightColumn;
    }

    /**
     * 获取λmax
     *
     * @param aWeightColumn 𝛼ω列表
     * @param weightColumn ω列表
     * @return 结果
     */
    private static double getAmax(double[] aWeightColumn, double[] weightColumn) {
        double λmax = 0d;
        for (int i = 0; i < weightColumn.length; i++) {
            λmax += aWeightColumn[i] / weightColumn[i];
        }
        return λmax / aWeightColumn.length;
    }
}

到了这里,关于关于归一化算法的简单实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据归一化常见算法

    数据归一化的几种方法 Min-Max归一化是一种线性的归一化方法。该方法将数据进行一次线性变换,将数据映射到[0,1]区间。Min-Max归一化不改变数据的分布。其缺点为,过度依赖最大最小数,且容易受到离群点、异常数据的影响。其公式为: x ′ = x − M i n M a x − M i n x^prime

    2024年02月12日
    浏览(26)
  • 计算机视觉中各种归一化算法

    归一化算法是对激活函数的输入进行归一化 将feature map shape设为[N,C,H,W],其中N表示batch size,C表示通道数,H、W分别表示特征图的高度、宽度 在batch上,对N、H、W做归一化,保留通道C的维度。对较小的batch size效果不好,BN适用于固定深度的前向神经网络,如CNN,不适用于RNN;

    2024年04月16日
    浏览(47)
  • OpenCV的函数normalize()的两个作用:调整矩阵的值范围(归一化处理)、规范化矩阵的范数为某个值

    OpenCV的函数normalize()的两个作用:调整矩阵的值范围(归一化处理)、规范化矩阵的范数为某个值 函数normalize()有两个原型: 原型一: 原型二: 原型一的适用对象是密集矩阵,通常我们的矩阵都是密集矩阵。 原型二的适用对象是稀疏矩阵,在这篇博文中暂不作介绍。 在介绍各参

    2024年02月06日
    浏览(31)
  • 【Pytorch基础知识】数据的归一化和反归一化

    一张正常的图,或者说是人眼习惯的图是这样的: 但是,为了 神经网络更快收敛 ,我们在深度学习网络过程中 通常需要将读取的图片转为tensor并归一化 (此处的归一化指 transforms .Normalize()操作)输入到网络中进行系列操作。 如果将转成的tensor再直接转为图片,就会变成下

    2023年04月09日
    浏览(73)
  • 深度学习基本理论下篇:(梯度下降/卷积/池化/归一化/AlexNet/归一化/Dropout/卷积核)、深度学习面试

    深度学习面试必备 1:(MLP/激活函数/softmax/损失函数/梯度/梯度下降/学习率/反向传播/深度学习面试 深度学习面试必备 2:(梯度下降/卷积/池化/归一化/AlexNet/归一化/Dropout/卷积核/深度学习面试 深度学习面试必备 3 :物体检测(Anchor base/NMS/softmax/损失函数/BCE/CE/zip) Momentum、

    2024年02月12日
    浏览(34)
  • 不要再搞混标准化与归一化啦,数据标准化与数据归一化的区别!!

    数据的标准化是将数据按照一定的 数学规则进行转换 ,使得数据满足特定的标准,通常是使数据满足正态分布或标准差为1的标准。 标准化的常见方法包括 最小-最大标准化 和 Z-score标准化 。最小-最大标准化将数据映射到 [0,1 ]的范围内,最小-最大标准化将数据映射到0-1区间

    2024年01月21日
    浏览(43)
  • 归一化(Normalization)

    归一化是一种数据处理方式,能将数据经过处理后限制在某个固定范围内。 归一化存在两种形式,一种是在通常情况下,将数处理为 [0, 1] 之间的小数,其目的是为了在随后的数据处理过程中更便捷。例如,在图像处理中,就会将图像从 [0, 255] 归一化到 [0, 1]之间,这样既不

    2024年02月07日
    浏览(83)
  • 批量归一化

    目录 1.批量归一化 2.代码 2.1从零开始实现 2.2简洁实现 正向是forward函数(从底向上),算backward的时候是从上往下。出现的问题就是梯度在上面的时候比较大,在下面就比较小,上面就会很快收敛,下面收敛很慢,每次更新下面的靠近数据的东西,这些东西会尝试去抽取那些

    2024年01月16日
    浏览(46)
  • 对复数数据实现归一化

    1、主要思路: 1)最大最小归一化,对模值进行 2)利用幅角转换为复数数据 实现代码 测试原理代码(基于numpy)

    2024年02月14日
    浏览(29)
  • 标准化归一化方法

    分别是0-1标准化(Max-Min Normalization)和Z-Score标准化。 1.1 0-1标准化方法 每一列中的 元素减去当前列的最小值 , 再除以该列的极差 。 不过在深度学习领域,我们更希望输入模型的数据是Zero-Centered Data,此时 Z-Score标准化会更加合适。 1.2 Z-Score标准化 Z-Score标准化并不会将数据

    2023年04月12日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包