人工智能①——矩阵分解知识点集

      目    录

一. 学前准备

    1.矩阵乘法

    2.loss函数的引入

二. 求偏导

三. 梯度下降

四. 正则化

五. 矩阵分解

六. 代码实现

     

      正   文

一. 矩阵乘法        矩阵进行乘法的前提条件是第一个矩阵的列数等于第二个矩阵的行数,且通过乘法所得到的结果矩阵的行数等于第一个矩阵的行数,得到的结果矩阵的列数等于第二个矩阵的列数,矩阵的乘法举例如下:

二. loss函数的引入 

损失函数是用来评价模型的预测值真实值不一样的程度,损失函数越好,通常模型的性能越好。不同的模型用的损失函数一般也不一样。损失函数分为经验风险损失函数结构风险损失函数。经验风险损失函数指预测结果和实际结果的差别,结构风险损失函数是指经验风险损失函数加上正则项。

常用损失函数可以分为以下几种:

    ①绝对值损失函数

        绝对值损失函数是计算预测值与目标值的差的绝对值:

                                            

   ②log对数损失函数(逻辑回归的损失函数

        log对数损失函数的标准形式如下:

③. 平方损失函数

      平方损失函数标准形式如下:

                                         

   各种损失函数图像集:

常见的损失函数(loss function)总结

三.求偏导

   求多元函数对哪个自变量的偏导数,就将其他自变量看作常数,用一元函数求导法则及公式求偏导(非常类似于高等数学中隐函数的求导方式),实例如下:

四. 梯度下降 

     目的:为了最小化损失函数

     原理:比如你在一座山上,当前你只能迈出一步,如何走才能使你的高度下降的最多呢,根据梯度的理论,我们沿着当前梯度的反方向走,会让我们的下降幅度最大。上述例子中,山就是一个函数,在山上的你就是函数中待优化的变量,人的坐标表示变量初始值,我们要 求的是函数最小值即到达山底,人该如何走即如何迭代变量。所以我们只要沿着函数梯度的反方向,就能最快的到达我们要去的地方。梯度下降是一种更新参数的方法,具体如何更新跟原函数的在某点的梯度有关。不会改变要求的最优解。我们可以利用梯度下降法求最大值和最小值,求最大值沿着梯度方向走即可,求最小值则沿着梯度的反方向走。

preview

                                        公式即      θ1=θ0−α▽f(θ0)

注意:

θ 1:x在下个时刻的坐标
θ 0:x在当前时刻的坐标
α :步长,每一步走多远,即学习率
▽ f ( θ 0 ) :目标函数f(x)在θ0点的导数

五. 正则化

       正则化(regularization),是指在线性代数理论中,不适定问题通常是由一组线性代数方程定义的,而且这组方程组通常来源于有着很大的条件数的不适定反问题。大条件数意味着舍入误差或其它误差会严重地影响问题的结果。

六. 矩阵分解全过程

 1. 首先令          

 2. 损失函数:使用最先的评分矩阵     

                    与重新构建的评分矩阵    (预测值矩阵)

 之间的误差的平方作为损失函数(loss函数),即:

       如果R(i,j)已知,则R(i,j)的误差平方和为:

       最终,需要求解所有的非“-”项的损失之和的最小值:

  3. 使用梯度下降法获得修正的p和q分量:

  求解损失函数的负梯度:
     

     根据负梯度的方向更新变量:

    
  4. 不停迭代直到算法最终收敛(直到sum(e^2) <=阈值)

(Plus:为了防止过拟合,增加正则化项)

【加入正则项的损失函数求解】

 1.  首先令

                    

 2.  通常在求解的过程中,为了能够有较好的泛化能力,会在损失函数中加入正则项,以对参数进行约束,加入

 正则的损失函数为:

                       

也即:

                        

 3.  使用梯度下降法获得修正的p和q分量:

  求解损失函数的负梯度:

                    
        根据负梯度的方向更新变量:

                  
    4. 不停迭代直到算法最终收敛(直到sum(e^2) <=阈值)

六.代码实现

    【Python代码实现如下】(基于Python 3.X ;使用正则项)


# !/usr/bin/env python
# encoding: utf-8
__author__ = 'Scarlett'
#矩阵分解在打分预估系统中得到了成熟的发展和应用
# from pylab import *
import matplotlib.pyplot as plt
from math import pow
import numpy
 
 
def matrix_factorization(R,P,Q,K,steps=5000,alpha=0.0002,beta=0.02):
    Q=Q.T  # .T操作表示矩阵的转置
    result=[]
    for step in range(steps):
        for i in range(len(R)):
            for j in range(len(R[i])):
                if R[i][j]>0:
                    eij=R[i][j]-numpy.dot(P[i,:],Q[:,j]) # .dot(P,Q) 表示矩阵内积
                    for k in range(K):
                        P[i][k]=P[i][k]+alpha*(2*eij*Q[k][j]-beta*P[i][k])
                        Q[k][j]=Q[k][j]+alpha*(2*eij*P[i][k]-beta*Q[k][j])
        eR=numpy.dot(P,Q)
        e=0
        for i in range(len(R)):
            for j in range(len(R[i])):
                if R[i][j]>0:
                    e=e+pow(R[i][j]-numpy.dot(P[i,:],Q[:,j]),2)
                    for k in range(K):
                        e=e+(beta/2)*(pow(P[i][k],2)+pow(Q[k][j],2))
        result.append(e)
        if e<0.001:
            break
    return P,Q.T,result
 
if __name__ == '__main__':
    R=[
        [5,3,0,1],
        [4,0,0,1],
        [1,1,0,5],
        [1,0,0,4],
        [0,1,5,4]
    ]
 
    R=numpy.array(R)
 
    N=len(R)
    M=len(R[0])
    K=2
 
    P=numpy.random.rand(N,K) #随机生成一个 N行 K列的矩阵
    Q=numpy.random.rand(M,K) #随机生成一个 M行 K列的矩阵
 
    nP,nQ,result=matrix_factorization(R,P,Q,K)
    print("原始的评分矩阵R为:\n",R)
    R_MF=numpy.dot(nP,nQ.T)
    print("经过MF算法填充0处评分值后的评分矩阵R_MF为:\n",R_MF)
 
#-------------损失函数的收敛曲线图---------------
 
    n=len(result)
    x=range(n)
    plt.plot(x,result,color='r',linewidth=3)
    plt.title("Convergence curve")
    plt.xlabel("generation")
    plt.ylabel("loss")
    plt.show()
运行结果如下:

损失函数的收敛曲线图:

 【代码的GitHub地址】

https://github.com/shenxiaolinZERO/CoolRSer/blob/master/CoolRSer/MatrixFactorization.py

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值