zoukankan      html  css  js  c++  java
  • 机器学习实战

    [comment]: # Machine Learning: 学习心得 - 14 - 利用SVD简化数据

    前言

    最近在看Peter Harrington写的“机器学习实战”,这是我的学习心得,这次是第14章 - 利用SVD简化数据。
    这里介绍,机器学习中的降维技术,可简化样品数据。

    基本概念

    • 降维(dimensionality reduction)。
      如果样本数据的特征维度很大,会使得难以分析和理解。我们可以通过降维技术减少维度。
      降维技术并不是将影响少的特征去掉,而是将样本数据集转换成一个低维度的数据集。

    降维技术的用途

    • 使得数据集更易使用;
    • 降低很多算法的计算开销;
    • 去除噪声;
    • 使得结果易懂。

    问题:如何向用户推荐他喜欢的商品

    推荐系统的应用场景

    一个系统里有很多商品,也有用户信息,以及用户对商品的打分情况。例如:

    表1

    用户 商品1 商品2 商品3 商品4 商品5 ... 商品d
    user 1 0 0 2 5 3 ... 0
    user 2 0 0 3 4 2 ... 0
    user 3 0 0 2 5 4 ... 0
    user 4 5 4 0 0 0 ... 0
    user 5 3 5 0 0 0 ... 0
    ... ... ... ... ... ... ... ...
    user n 0 0 4 5 3 ... 0

    这些数据有以下特点:

    1. 商品很多
    2. 用户很多,一般情况下比商品多。
    3. 用户不会对所有商品打分,没有打分的记为0,打分的记为1~5。

    解决问题的思路

    如果要对一个用户U推荐一个U没有买过的商品:

    对于当前用户U的每个没有买过的商品A:
        对于系统中每个商品B,并且U给B打过分:
            根据A和B的打分数据,获取一个降维数据集。*1
            在降维数据集上,计算A和B的相似度Similarity。*2
            Rating = U给B的打分
            TotalSimilarity += Similarity
            TotalRating += Similarity * Rating
        A.Rating = TotalRating / TotalSimilarity
    按照A.Rating从大到小排序。
    打分高的商品作为推荐商品。
    

    注:比如电影,一般用户不会看已经看过的电影,所以"没有买过的商品"在这是有特殊的意义。
    也可以将这个条件根据实际的情况换成其它过滤条件。

    根据上面的思路,我们还需要解决2个关键问题:

    1. 如何降维。
    2. 如何计算两个矢量(也可以看成2个点)的相似度。

    如何计算2个矢量的相似度(Similarity)

    先解决简单的问题。相似度是一个0到1的值。可以选择下面的方法来计算。

    方法1:计算欧氏距离相似度。

    两个点离得越近,越相似。

    求两个点的距离D
    Similarity = 1 / (1 + D)
    

    方法2:计算皮尔逊相关系数(Pearson correlation)的相似度。

    统计方法中求两组数据的相关度,

    这两个点的correlationValue
    Similarity = correlationValue / 2 + 0.5
    

    方法3:计算角度的相似度。

    计算两个点的角度,求余弦值([-1, 1]), 角度越接近0,越相似。

    求两个点的角度的余弦值cosineValue.
    Similarity = cosineValue / 2 + 0.5
    

    如何降维

    方法1: 只看对商品A和商品B都有打分的数据。

    对于商品A和商品B,可以看作为两列数据,我们在这两列中,找出两个数据都不为0的行。
    比如:表1中商品1和商品2,只要看4,5两行数据就可以。

    • 这个方法的问题是
      • 每次计算都需要寻找相关数据。对性能的优化不够。

    方法2: 奇异值分解(Singular Value Decomposition,SVD)

    矩阵(Data_{{m} imes {n}}),假设m < n。
    奇异性分解可以将一个矩阵(Data_{{m} imes {n}})分解成3个矩阵(U_{{m} imes {m}}), (Sigma_{{m} imes {n}}), (V^T_{{n} imes {n}})
    (U),(V^T)都是单式矩阵(unitary matrix),(Sigma)是一个对角矩阵(rectangular diagonal matrix),也就是说只有在对角线上才有值。
    比如:

    [egin{bmatrix} 15 & 0 & 0 \ 0 & 11 & 0 \ 0 & 0 & 0.2 \ 0 & 0 & 0 \ end{bmatrix} ]

    这里主要介绍(Sigma),我们只关心它的对角线上的数据。
    首先这个对角线上的数据最多有m个(假设m < n)。
    而且这个数组是按照从大到小的顺序排列的。
    (Sigma)的对角线上的数据被称为奇异数(Singular Values)。
    奇异数的一个特点是可以用来计算一个降维的(SmallData_{{m} imes {k} (k < m)})来代替原数据集(Data_{{m} imes {n}})
    一个计算(k)的方法是:

    (Sigma)中找到前(k)的数据,使得其( extstyle sum_{i=1}^k s_i^2) 刚好大于 (0.9 imes extstyle sum_{i=1}^m s_i^2)

    这时:

    [SmallData_{{m} imes {k}} = Data^T U_{{m} imes {k}} Sigma_{{k} imes {k}}^I \ where \ qquad k < m \ qquad W^I : 矩阵W的逆矩阵 ]

    总结

    • 我们可以使用(SmallData_{{m} imes {k}})作为降维后的数据集。
    • SVD降维技术的应用可以是离线的。(也就是说可以事先做好。)

    将SVD降维技术应用到数据近似压缩上

    求近似数据集:

    [NewData_{{m} imes {n}} = U_{{m} imes {k}} Sigma_{{k} imes {k}} V^T_{{k} imes {n}} \ where \ qquad NewData_{{m} imes {n}} approx Data_{{m} imes {n}} \ qquad k < m ]

    由于(NewData_{{m} imes {n}})是计算出来的,
    所以可以只保存(U_{{m} imes {k}}), (Sigma_{{k} imes {k}})的奇异值, (V^T_{{k} imes {n}})做为压缩数据。

    核心公式

    • 相似度计算 - 欧氏距离
    from numpy import *
    def distanceSimilarity(A, B):
        return 1.0 / (1.0 + linalg.norm(A - B))
    

    [frac{1}{1 + lVert A - B Vert} \ where \ qquad lVert w Vert = sqrt { extstyle sum_{i=1}^n w_i^2} ]

    • 相似度计算 - 皮尔逊相关系数(Pearson correlation)
    from numpy import *
    def correlationSimilarity(A, B):
        if len(A) < 3 : return 1.0
        return 0.5 + 0.5 * corrcoef(A, B, rowvar = 0)[0][1]
    
    • 相似度计算 - 余弦相似度

    [cos heta = frac{A^TB}{lVert A Vert lVert B Vert} \ f(A, B) = 0.5 + 0.5 * cos heta \ where \ qquad lVert w Vert = sqrt { extstyle sum_{i=1}^n w_i^2} ]

    参考

  • 相关阅读:
    C#截取字符串的方法小结
    使用苏飞httphelper开发自动更新发布文章程序
    公务员“上班睡觉”为何会被强势围观?
    透明代理和匿名代理的区别
    Linux基础命令---ipcalc计算IP
    Linux基础命令---apwatch
    Linux基础命令---arping
    Linux基础命令---arp
    Linux基础命令---ifdown、ifup
    Linux基础命令---ifconfig
  • 原文地址:https://www.cnblogs.com/steven-yang/p/5818162.html
Copyright © 2011-2022 走看看