常用代码块

几个常用的程序块,整理一下:

计算余弦相似度

主要就是计算二范数,以及两个向量内积。

'''
计算余弦相似度
'''
from scipy.linalg.misc import norm
def cosineSimilarity(vec1, vec2):
    cosine = sum(vec1 * vec2) / (norm(vec1) * norm(vec2))
    return cosine

用到了scipy.linalg(Linear algebra 线性代数)中的norm方法。我们这里要求两个vector都是array类型的数据。

迭代收敛条件

我们一般会在while循环中写入下面这样的函数,当满足迭代收敛的条件是,flag返回0,则将终止循环。

第一种:

def breakFlag(rPlast, rPcurrent, rAlast, rAcurrent, delta):
    flag = 1
    deltaP = np.sum(np.abs(rPcurrent - rPlast))
    deltaA = np.sum(np.abs(rAcurrent - rAlast))
    
    if np.max((deltaP, deltaA)) < delta:
        flag = 0
    else:
        flag = 1

    return flag

第二种:

def breakFlag(rPlast, rPcurrent, rAlast, rAcurrent, delta):
    flag = 1
    deltaP = np.abs(rPcurrent - rPlast) < delta
    deltaA = np.abs(rAcurrent - rAlast) < delta
    
    if deltaP.all() and deltaA.all():
        flag = 0
    else:
        flag = 1

    return flag

第一种迭代终止条件是当此与上一次的结果之差(向量)的一范数(各元素绝对值之和)小于给定的delta。第二种迭代终止条件是当此与上一次的结果之差(向量)中的每一个元素都小于给定的delta。

构造稀疏矩阵

稀疏矩阵有个很神奇的地方,如果给同一个位置多次指定值,该位置的值是多次指定的值之和。因此我们可能要进行去重。

import numpy
import operator

def calculatWAP(dictA2I, dictAu2Idx, dictId2Idx):
    temp = []
    dim0 = len(dictAu2Idx.keys())
    dim1 = len(dictId2Idx.keys())
    
    for key, values in dictA2I.items():
        for value in values:
            if value in dictId2Idx.keys():
                temp.append((dictAu2Idx[key], dictId2Idx[value]))
    #以元组的形式储存每一对row和col
    
    #利用set特性去重
    temp= list(set(temp))
    #用map函数获取所有元组中的第一个元素(row)或第二个元素(col)
    row = list(map(operator.itemgetter(0), temp))
    row = list(map(operator.itemgetter(1), temp))
    
    row = np.array(row)
    col = np.array(col)
    data = np.ones(len(col), dtype='float16')
    wAP = csr_matrix((data, (row, col)), shape=(dim0, dim1), dtype='float16')
    
    return wAP

关于高级函数map的用法,需要多提一句,python3中如果不在map函数外面加上list函数,返回的是一个'map' object。

map(operator.itemgetter(0), temp)
Out[30]: <map at 0x2174f44ee48>

个人经常使用csr_matrix构造稀疏矩阵,因为其进行加减,矩阵乘法等运算时速度较快。

下面举一个生成随机对角矩阵的例子,如果我们想将矩阵的某一列同时乘上一个系数,我们就需要用到对角阵。(各列同乘,右边乘上对角阵;各行同乘,左边乘上对角阵)因为python无法直接生成随机单位阵,而对角阵必然极其稀疏,考虑用稀疏矩阵来构造。

row = np.array(list(range(0, 100)))
col = np.array(list(range(0, 100)))
#生成100维的随机数组,大小位于区间(0,1)内
data = np.random.random(100)
randeye = csr_matrix((data, (row, col)))

保存读取变量

为了解决某些变量生成时需要十分长的时间,每次运行重新生成变量会浪费宝贵时间,所以选择将比较大型的变量直接预存到pickle里,需要用到时直接load即可。

#dump函数创建并保存pickle
with open('pickle/matrices.pkl', 'wb') as data:
        pickle.dump([wAA, wAP, wPP], data)

#load函数载入pickle
with open('pickle/matrices.pkl', 'rb') as data:
    wAA, wAP, wPP = pickle.load(data)

猜你喜欢

转载自blog.csdn.net/lau_sen/article/details/80601956