矩阵数据归一化 java 实现

概念参考:https://blog.csdn.net/zbc1090549839/article/details/44103801

https://blog.iaiot.com/data-normalization.html

线性归一化 公式:X(norm) = (X - min) / (max - min)

    /**
     * 线性归一化 公式:X(norm) = (X - min) / (max - min)
     *
     * @param points 原始数据
     * @return 归一化后的数据
     */
    public static double[][] normalize4Scale(double[][] points) {
        if (points == null || points.length < 1) {
            return points;
        }
        double[][] p = new double[points.length][points[0].length];
        double[] matrixJ;
        double maxV;
        double minV;
        for (int j = 0; j < points[0].length; j++) {
            matrixJ = getMatrixCol(points, j);
            maxV = maxV(matrixJ);
            minV = minV(matrixJ);
            for (int i = 0; i < points.length; i++) {
                p[i][j] = maxV == minV ? minV : (points[i][j] - minV) / (maxV - minV);
            }
        }
        return p;
    }

    /**
     * 获取矩阵的某一列
     *
     * @param points points
     * @param column column
     * @return double[]
     */
    public static double[] getMatrixCol(double[][] points, int column) {
        double[] matrixJ = new double[points.length];
        for (int i = 0; i < points.length; i++) {
            matrixJ[i] = points[i][column];
        }
        return matrixJ;
    }

    /**
     * 获取数组中的最小值
     *
     * @param matrixJ matrixJ
     * @return v
     */
    public static double minV(double[] matrixJ) {
        double v = matrixJ[0];
        for (int i = 0; i < matrixJ.length; i++) {
            if (matrixJ[i] < v) {
                v = matrixJ[i];
            }
        }
        return v;
    }

    /**
     * 获取数组中的最大值
     *
     * @param matrixJ matrixJ
     * @return v
     */
    public static double maxV(double[] matrixJ) {
        double v = matrixJ[0];
        for (int i = 0; i < matrixJ.length; i++) {
            if (matrixJ[i] > v) {
                v = matrixJ[i];
            }
        }
        return v;
    }

 

0均值\标准差归一化 公式:X(norm) = (X - μ) / σ = (X - 均值) / 标准差

    /**
     * 0均值\标准差归一化 公式:X(norm) = (X - μ) / σ
     * X(norm) = (X - 均值) / 标准差
     *
     * @param points 原始数据
     * @return 归一化后的数据
     */
    public static double[][] normalize4ZScore(double[][] points) {
        if (points == null || points.length < 1) {
            return points;
        }
        double[][] p = new double[points.length][points[0].length];
        double[] matrixJ;
        double avg;
        double std;
        for (int j = 0; j < points[0].length; j++) {
            matrixJ = getMatrixCol(points, j);
            avg = average(matrixJ);
            std = standardDeviation(matrixJ);
            for (int i = 0; i < points.length; i++) {
                p[i][j] = std == 0 ? points[i][j] : (points[i][j] - avg) / std;
            }
        }
        return p;
    }

    /**
     * 方差s^2=[(x1-x)^2 +...(xn-x)^2]/n
     *
     * @param x x
     * @return 方差
     */
    public static double variance(double[] x) {
        int m = x.length;
        double sum = 0;
        for (int i = 0; i < m; i++) {//求和
            sum += x[i];
        }
        double dAve = sum / m;//求平均值
        double dVar = 0;
        for (int i = 0; i < m; i++) {//求方差
            dVar += (x[i] - dAve) * (x[i] - dAve);
        }
        return dVar / m;
    }

    /**
     * 标准差σ=sqrt(s^2)
     *
     * @param x x
     * @return 标准差
     */
    public static double standardDeviation(double[] x) {
        return Math.sqrt(variance(x));
    }

    /**
     * 平均值
     *
     * @param x x
     * @return 平均值
     */
    public static double average(double[] x) {
        int m = x.length;
        double sum = 0;
        for (int i = 0; i < m; i++) {
            sum += x[i];
        }
        double dAve = sum / m;
        return dAve;
    }

 

调用:

    public static void main(String[] args) {
        double[][] points = {{2, 5, 7}, {3, 1, 5}, {0, 27, 11}, {109, 6, 1}};
        double[][] p1 = normalize4Scale(points);
        double[][] p2 = normalize4ZScore(points);
    }

广告:水囊 油袋  沼气池  化粪池 https://www.vhxsl.com

### 回答1: 的步骤是什么? 用户协同过滤算法的步骤如下: 1. 收集用户的历史评分数据,并建立用户-物品评分矩阵。 2. 对评分矩阵进行预处理,比如说归一化处理。 3. 计算用户之间的相似度。 4. 根据用户之间的相似度,预测一个用户对某个物品的评分。 5. 根据预测评分,为用户推荐物品。 在java实现这个算法,你需要了解相关的算法原理,并使用java数据结构和算法库。 ### 回答2: 用户协同过滤算法是一种常用的推荐算法,其主要思想是通过分析用户之间的行为模式和兴趣相似度,来为用户推荐他们可能感兴趣的物品。 在Java中,我们可以使用数据结构和算法来实现用户协同过滤算法。具体实现步骤如下: 1. 数据准备:需要收集用户对物品的评分数据。可以使用二维数组或者矩阵来存储用户对物品的评分,其中行表示用户,列表示物品。 2. 相似度计算:计算用户之间的相似度。可以使用余弦相似度或者皮尔逊相关系数等方法来计算用户的相似度。通过比较用户对同一物品的评分来计算相似度。 3. 预测评分:根据用户之间的相似度,预测用户对未评分物品的评分。可以通过加权平均和加权和等方式来计算预测评分。 4. 物品推荐:根据预测评分,为用户推荐可能感兴趣的物品。可以根据预测评分的排名,选择评分高的物品进行推荐。 在Java中,我们可以利用多线程来提高算法的效率,将数据的计算过程并行化。同时,可以使用Java的集合框架来存储和处理数据,如使用List来存储用户评分数据,使用Map来存储用户之间的相似度等。 总结来说,Java实现用户协同过滤算法需要数据准备、相似度计算、预测评分和物品推荐等步骤。通过合理使用Java数据结构和算法,可以高效地实现用户协同过滤算法。 ### 回答3: Java可以通过使用协同过滤算法来实现用户协同过滤推荐系统。用户协同过滤算法是一种基于用户行为数据的推荐算法。 首先,需要收集用户的行为数据,包括用户的评分、购买历史或浏览记录等。这些数据可以通过数据库或者数据文件的方式进行存储和管理。 接下来,可以使用基于用户的协同过滤算法来计算用户之间的相似度。常见的相似度计算方法包括余弦相似度和皮尔逊相关系数。根据用户的行为数据,可以计算出用户之间的相似度矩阵。 然后,通过选择一定数量或相似度最高的用户,建立用于推荐的邻居用户集合。这些邻居用户集合中的用户与目标用户具有相似的兴趣和行为特征。 最后,根据邻居用户集合的行为数据,预测目标用户对未评分的物品的喜好程度。可以使用加权平均或基于相似用户的加权平均等方法进行物品的评分预测。 实现用户协同过滤算法时,还可以结合其他的优化策略,如利用训练和测试数据集进行模型参数调优、使用数据规范化等,以提高推荐的精确度和效率。 Java提供了丰富的工具和库,如使用JDBC连接数据库、使用Apache Mahout或者LensKit等推荐系统框架进行协同过滤算法的实现。通过对用户的行为数据进行处理和计算,可以实现用户协同过滤算法,提供更加准确和个性化的推荐服务。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值