tensorflow实现FM算法
FM算法 Tensorflow实现
Contens
- FM算法 Tensorflow实现
- FM 算法原理
- Tensorflow 实现
本节通过实现FM 算法熟悉tensorflow的使用
FM 算法原理
FM (factor machine)算法是有监督的机器学习算法,可以用来分类和回归,一般用来做CTR预估。FM算法的亮点是提出了一种特征组合的方式。
y=w0+∑i=1nwi∗xi+∑i<jwi,j∗xi∗xjy=w_{0}+\sum_{i=1}^{n}{w_{i}*x_{i}}+\sum_{i<j}{w_{i,j}*x_{i}*x_{j}} y=w0+i=1∑nwi∗xi+i<j∑wi,j∗xi∗xj
W=V∗VTW=V*V^T W=V∗VT
VT=(V1T,V2T,⋯,VnT)V^T=(V_{1}^{T},V_{2}^{T},\cdots,V_{n}^T) VT=(V1T,V2T,⋯,VnT)
如上面公式所示,FM 算法在逻辑回归的基础上加入了特征交叉项。如过给每个交叉项单独指定一个权重,参数的个数是n的二次方,容易过拟合。为了减少参数的个数,每个特征对应一个维度为K隐因子向量,特征交叉项的系数是两个交叉特征的隐因子的点乘。采用矩阵表示,最后一项写成
∑i<jwi,j∗xi∗xj=12(∑i,j<Vi,Vj>∗xi∗xj−∑i∣∣xi∗Vi∣∣2)\sum_{i<j}{w_{i,j}*x_{i}*x_{j}}=\frac{1}{2}(\sum_{i,j}<V_{i},V_{j}>*x_{i}*x_{j}-\sum_{i}||x_{i}*V_{i}||^2) i<j∑wi,j∗xi∗xj=21(i,j∑<Vi,Vj>∗xi∗xj−i∑∣∣xi∗Vi∣∣2)
=12{X∗V∗VT∗XT−(X⋅X)∗(V⋅V).sum(axis=1)}=\frac{1}{2}\{X*V*V^T*X^T-(X\cdot{X})*(V\cdot{V}).sum(axis=1)\} =21{X∗V∗VT∗XT−(X⋅X)∗(V⋅V).sum(axis=1)}
以X表示某个m 个样本构成的数据集m*n 矩阵,样本有n个特征,Y的预测值可以按下面公式表示
YP=b+X∗w⃗+12{[(X∗V)2−(X⋅X)∗(V⋅V)].sum(axis=1)}Y^P=b+X*\vec{w}+\frac{1}{2}\{[(X*V)^2-(X\cdot{X})*(V\cdot{V})].sum(axis=1)\} YP=b+X∗w+21{[(X∗V)2−(X⋅X)∗(V⋅V)].sum(axis=1)}
Tensorflow 实现
本小节基于tensorflow 实现FM算法,代码如下:
import tensorflow as tf
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_svmlight_filelearning_rate = 0.1
training_epoches = 500
batch_size =100
display_step = 1X_total,Y_total=load_svmlight_file("libsvmfinal_8_2")
shape=X_total.shapeY_total=Y_total.reshape(-1, 1)
X_train, X_test, y_train, y_test = train_test_split(X_total, Y_total, test_size = 0.1, random_state = 42)n_samples = X_train.shape[0]
n_features =shape[1]
k=2#placeholder
x = tf.sparse_placeholder(tf.float64)
y = tf.placeholder(tf.float64, [None, 1])#parametor to train
V = tf.Variable(tf.zeros([n_features, k],dtype=tf.float64),dtype=tf.float64,name="vk")
b = tf.Variable(tf.zeros([1],dtype=tf.float64),dtype=tf.float64,name="b")
w = tf.Variable(tf.random_normal((n_features,1),dtype=tf.float64),dtype=tf.float64,name="w")
#model logic
vx=tf.sparse_tensor_dense_matmul(x,V)
vx_sq=tf.multiply(vx,vx)
xx=tf.square(x)
vsq_xsq=tf.sparse_tensor_dense_matmul(xx,V*V)
biterm=vx_sq-vsq_xsq
preds=tf.nn.sigmoid(tf.sparse_tensor_dense_matmul(x,w)+0.5*tf.reduce_sum(biterm,reduction_indices=1)+b)
cost=tf.reduce_mean(-y*tf.log(tf.clip_by_value(preds,1e-10,1.0))-(1-y)*tf.log(tf.clip_by_value(1-preds,1e-10,1.0)))
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)
threshold=tf.constant(0.5,dtype=tf.float64)
plabel=tf.cast(threshold<preds,tf.float64)
accuracy=tf.metrics.accuracy(y,plabel)
#auc=tf.metrics.auc(y,preds)
#accuracy=tf.reduce_mean(tf.cast(tf.equal(plabel,y),tf.float32))
init = tf.global_variables_initializer()
saver=tf.train.Saver()with tf.Session() as sess:#sess.run(init)sess.run(tf.initialize_local_variables())saver.restore(sess,"my_model3.ckpt198")for epoch in range(training_epoches):avg_cost = 0total_batch = int(n_samples / batch_size)batch=0for i in range(total_batch):xcsr=X_train[i*batch_size:(i+1)*batch_size]coo=xcsr.tocoo() indices=np.mat([coo.row,coo.col]).transpose() _, c = sess.run([optimizer, cost], feed_dict={x:tf.SparseTensorValue(indices,coo.data,coo.shape) ,y: y_train[i * batch_size : (i+1) * batch_size]})avg_cost += c / total_batchbatch +=1if batch%2000 ==1999:print "epoch",epoch,"batch",batchprint "b", b.eval()if epoch%100 ==99:save_path=saver.save(sess,"./my_model3.ckpt"+str(epoch))if (epoch+1) % display_step == 0:print("Epoch:", "%04d" % (epoch+1), "cost=", avg_cost) xcsr=X_testcoo=xcsr.tocoo() indices=np.mat([coo.row,coo.col]).transpose()act=sess.run([accuracy],feed_dict={x:tf.SparseTensorValue(indices,coo.data,coo.shape),y: y_test})print "accuracy" ,actprint("Optimization Finished!")
tensorflow 程序脚本分为两步。第一步,使用tensorflow 定义的算子定义好模型,输入用placeholder 标识,变量使用variable定义。第二步,打开一个session,把输入放到placeholder 标识的dict 里,指定要执行的操作或要获取的输出,然后执行。在正式执行之前,要先初始化变量。
在第一步和第二步之间我们没看到的是,tensorflow 维护了一张默认的tfgraph。第一步定义的算子被编码在这张图里,第二步的run 执行的是这张图中的逻辑。tensorflow 可以看作一门编程语言。第一步是编译器前端,把运算逻辑解析成中间表达形式(实际上,tfgraph 非常像抽象语法树);第二步第一次运行计算图之前会对做一些中间代码优化,比如公共子表达式消除,图枝剪,常量折叠等,然后tensorflow 运行时对计算图解释执行。
tensorflow实现FM算法相关推荐
- TensorFlow反向传播算法实现
TensorFlow反向传播算法实现 反向传播(BPN)算法是神经网络中研究最多.使用最多的算法之一,用于将输出层中的误差传播到隐藏层的神经元,然后用于更新权重. 学习 BPN 算法可以分成以下两个过 ...
- TensorFlow深度学习算法原理与编程实战 人工智能机器学习技术丛书
作者:蒋子阳 著 出版社:中国水利水电出版社 品牌:智博尚书 出版时间:2019-01-01 TensorFlow深度学习算法原理与编程实战 人工智能机器学习技术丛书 ISBN:97875170682 ...
- DL之SSD:基于tensorflow利用SSD算法实现目标检测(21类)
DL之SSD:基于tensorflow利用SSD算法实现目标检测(21类) 目录 输出结果 SSD代码 输出结果 VOC_LABELS = {'none': (0, 'Background'),'ae ...
- 一文读懂FM算法优势,并用python实现
介绍 我仍然记得第一次遇到点击率预测问题时的情形,在那之前,我一直在学习数据科学,对自己取得的进展很满意,在机器学习黑客马拉松活动中也开始建立了自信,并决定好好迎接不同的挑战. 为了做得更好,我购买了 ...
- FM算法及FFM算法
转自:http://tech.meituan.com/deep-understanding-of-ffm-principles-and-practices.html http://blog.csdn. ...
- fm算法 c语言,推荐算法之—FM
1.什么是FM算法 FM即Factor Machine,因子分解机 2.为什么需要FM 1).特征组合是许多机器学习建模过程中遇到的问题,如果对特征直接建模,很有可能忽略掉特征与特征之间的关联信息,一 ...
- 因子分解机FM算法(Factorization Machine)
背景 数据输入 以一个广告分类的问题为例,根据用户画像.广告位以及一些其他的特征,来预测用户是否会点击广告(二分类问题).数据如下: Clicked Country Sex Ad_type 1 USA ...
- fm算法详解_Python实现FM算法解析
1. 什么是FM? FM即Factor Machine,因子分解机. 2. 为什么需要FM? 1.特征组合是许多机器学习建模过程中遇到的问题,如果对特征直接建模,很有可能会忽略掉特征与特征之间的关联信 ...
- fm算法详解_FM算法解析及Python实现
1. 什么是FM? FM即Factor Machine,因子分解机. 2. 为什么需要FM? 1.特征组合是许多机器学习建模过程中遇到的问题,如果对特征直接建模,很有可能会忽略掉特征与特征之间的关联信 ...
最新文章
- poj 1821(单调队列优化dp)
- C语言面试高频问题:自己代码实现字符串相关的常用API
- 基于android的智能风扇,新锡德尔对基于Android的静电式智能空气净化器系统设计...
- 高校讲师年终奖,能有多少?
- mysql查看服务器版本sql_云服务器Windows系统查看mysql版本
- 字母c语言定义为什么变量,C语言为什么要规定对所用到的变量要“先定义,后使用”...
- 二、Sql Server 基础培训《进度2-关于主键(知识点学习)》
- atx和matx机箱_【技嘉Z87评测】强迫症的执拗 同价位ATX与MATX到底咋选(全文)_技嘉 G1.Sniper M5_主板评测-中关村在线...
- 降本增效,粮食加工产线自动化控制系统方案
- 文件模式为 rw-r r linux,linux中-rw-rw-r-- l 是什么意思啊,linux 里命令ls -l 后,文件类型权...
- matlab海洋数值模拟,海洋数值模拟课程教学大纲.PDF
- Python-元祖-字典
- 六、Prometheus+Grafana搭建监控系统
- oracle 汉字显示问号
- MATLAB三维绘图(四)绘制特殊的三维图
- asp毕业设计——基于asp+access的校园网物品交易平台设计与实现(毕业论文+程序源码)——校园网物品交易平台
- idea git rebase ---- 合并多个提交到某个分支(实用)
- 天气预报-微信小程序-源码
- 超弹性材料大变形分析不收敛怎么办?你需要了解体积自锁
- 服务器 分辨率问题 显示器不显示不出来,Win10分辨率显示不正常怎么办_Win10分辨率显示不正常的解决方法...