几个常用的程序块,整理一下:
计算余弦相似度
主要就是计算二范数,以及两个向量内积。
''' 计算余弦相似度 ''' 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)