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∑n​wi​∗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算法相关推荐

  1. TensorFlow反向传播算法实现

    TensorFlow反向传播算法实现 反向传播(BPN)算法是神经网络中研究最多.使用最多的算法之一,用于将输出层中的误差传播到隐藏层的神经元,然后用于更新权重. 学习 BPN 算法可以分成以下两个过 ...

  2. TensorFlow深度学习算法原理与编程实战 人工智能机器学习技术丛书

    作者:蒋子阳 著 出版社:中国水利水电出版社 品牌:智博尚书 出版时间:2019-01-01 TensorFlow深度学习算法原理与编程实战 人工智能机器学习技术丛书 ISBN:97875170682 ...

  3. DL之SSD:基于tensorflow利用SSD算法实现目标检测(21类)

    DL之SSD:基于tensorflow利用SSD算法实现目标检测(21类) 目录 输出结果 SSD代码 输出结果 VOC_LABELS = {'none': (0, 'Background'),'ae ...

  4. 一文读懂FM算法优势,并用python实现

    介绍 我仍然记得第一次遇到点击率预测问题时的情形,在那之前,我一直在学习数据科学,对自己取得的进展很满意,在机器学习黑客马拉松活动中也开始建立了自信,并决定好好迎接不同的挑战. 为了做得更好,我购买了 ...

  5. FM算法及FFM算法

    转自:http://tech.meituan.com/deep-understanding-of-ffm-principles-and-practices.html http://blog.csdn. ...

  6. fm算法 c语言,推荐算法之—FM

    1.什么是FM算法 FM即Factor Machine,因子分解机 2.为什么需要FM 1).特征组合是许多机器学习建模过程中遇到的问题,如果对特征直接建模,很有可能忽略掉特征与特征之间的关联信息,一 ...

  7. 因子分解机FM算法(Factorization Machine)

    背景 数据输入 以一个广告分类的问题为例,根据用户画像.广告位以及一些其他的特征,来预测用户是否会点击广告(二分类问题).数据如下: Clicked Country Sex Ad_type 1 USA ...

  8. fm算法详解_Python实现FM算法解析

    1. 什么是FM? FM即Factor Machine,因子分解机. 2. 为什么需要FM? 1.特征组合是许多机器学习建模过程中遇到的问题,如果对特征直接建模,很有可能会忽略掉特征与特征之间的关联信 ...

  9. fm算法详解_FM算法解析及Python实现

    1. 什么是FM? FM即Factor Machine,因子分解机. 2. 为什么需要FM? 1.特征组合是许多机器学习建模过程中遇到的问题,如果对特征直接建模,很有可能会忽略掉特征与特征之间的关联信 ...

最新文章

  1. poj 1821(单调队列优化dp)
  2. C语言面试高频问题:自己代码实现字符串相关的常用API
  3. 基于android的智能风扇,新锡德尔对基于Android的静电式智能空气净化器系统设计...
  4. 高校讲师年终奖,能有多少?
  5. mysql查看服务器版本sql_云服务器Windows系统查看mysql版本
  6. 字母c语言定义为什么变量,C语言为什么要规定对所用到的变量要“先定义,后使用”...
  7. 二、Sql Server 基础培训《进度2-关于主键(知识点学习)》
  8. atx和matx机箱_【技嘉Z87评测】强迫症的执拗 同价位ATX与MATX到底咋选(全文)_技嘉 G1.Sniper M5_主板评测-中关村在线...
  9. 降本增效,粮食加工产线自动化控制系统方案
  10. 文件模式为 rw-r r linux,linux中-rw-rw-r-- l 是什么意思啊,linux 里命令ls -l 后,文件类型权...
  11. matlab海洋数值模拟,海洋数值模拟课程教学大纲.PDF
  12. Python-元祖-字典
  13. 六、Prometheus+Grafana搭建监控系统
  14. oracle 汉字显示问号
  15. MATLAB三维绘图(四)绘制特殊的三维图
  16. asp毕业设计——基于asp+access的校园网物品交易平台设计与实现(毕业论文+程序源码)——校园网物品交易平台
  17. idea git rebase ---- 合并多个提交到某个分支(实用)
  18. 天气预报-微信小程序-源码
  19. 超弹性材料大变形分析不收敛怎么办?你需要了解体积自锁
  20. 服务器 分辨率问题 显示器不显示不出来,Win10分辨率显示不正常怎么办_Win10分辨率显示不正常的解决方法...

热门文章

  1. 极值理论(三):POT模型
  2. 白杨SEO:2021到2022年做自媒体在哪个平台上更有前途?公众号、百家号、头条号、抖音、微博、B站、知乎、小红书、视频号
  3. js图片编辑器插件Filerobot
  4. cesium实现高亮动态楼栋路线效果
  5. ENIGMA的兴亡(一)
  6. 这个世界没好过-虚拟采访鲁迅先生
  7. linux从入门到精通十:高级文件系统管理
  8. matlab计算结果小数点后两位,matlab保留小数点后两位.
  9. vr计算机组装,VR技术在计算机组装与维护中的应用研究
  10. 顶级程序员招聘必会技术