fm 讲解加代码
转自:
博客
http://blog.csdn.net/google19890102/article/details/45532745/
github
https://github.com/zhaozhiyong19890102/Python-Machine-Learning-Algorithm/tree/master/Chapter_3%20Factorization%20Machine
一、因子分解机FM的模型
1、因子分解机FM的优势
2、因子分解机FM的模型
二、因子分解机FM算法
- 回归问题(Regression)
- 二分类问题(Binary Classification)
- 排序(Ranking)
在这里主要介绍回归问题和二分类问题。
1、回归问题(Regression)
2、二分类问题(Binary Classification)
三、因子分解机FM算法的求解过程
1、交叉项系数
2、模型的求解
注:上式中:

,且,倒数第二行中,将 j 换成 i,原式不变,所以能得到倒数第一行的形式。
3、基于随机梯度的方式求解
四、实验(求解二分类问题)
1、实验的代码:
- #coding:UTF-8
- from __future__ import division
- from math import exp
- from numpy import *
- from random import normalvariate#正态分布
- from datetime import datetime
- trainData = 'E://data//diabetes_train.txt'
- testData = 'E://data//diabetes_test.txt'
- featureNum = 8
- def loadDataSet(data):
- dataMat = []
- labelMat = []
- fr = open(data)#打开文件
- for line in fr.readlines():
- currLine = line.strip().split()
- #lineArr = [1.0]
- lineArr = []
- for i in xrange(featureNum):
- lineArr.append(float(currLine[i + 1]))
- dataMat.append(lineArr)
- labelMat.append(float(currLine[0]) * 2 - 1)
- return dataMat, labelMat
- def sigmoid(inx):
- return 1.0 / (1 + exp(-inx))
- def stocGradAscent(dataMatrix, classLabels, k, iter):
- #dataMatrix用的是mat, classLabels是列表
- m, n = shape(dataMatrix)
- alpha = 0.01
- #初始化参数
- w = zeros((n, 1))#其中n是特征的个数
- w_0 = 0. #截距项
- v = normalvariate(0, 0.2) * ones((n, k)) #交叉项
- for it in xrange(iter):
- print it
- for x in xrange(m):#随机优化,对每一个样本而言的
- inter_1 = dataMatrix[x] * v
- inter_2 = multiply(dataMatrix[x], dataMatrix[x]) * multiply(v, v)#multiply对应元素相乘
- #完成交叉项
- interaction = sum(multiply(inter_1, inter_1) - inter_2) / 2.
- p = w_0 + dataMatrix[x] * w + interaction#计算预测的输出
- loss = sigmoid(classLabels[x] * p[0, 0]) - 1
- print loss
- w_0 = w_0 - alpha * loss * classLabels[x]
- for i in xrange(n):
- if dataMatrix[x, i] != 0:
- w[i, 0] = w[i, 0] - alpha * loss * classLabels[x] * dataMatrix[x, i]
- for j in xrange(k):
- v[i, j] = v[i, j] - alpha * loss * classLabels[x] * (dataMatrix[x, i] * inter_1[0, j] - v[i, j] * dataMatrix[x, i] * dataMatrix[x, i])
- return w_0, w, v
- def getAccuracy(dataMatrix, classLabels, w_0, w, v):
- m, n = shape(dataMatrix)
- allItem = 0
- error = 0
- result = []
- for x in xrange(m):
- allItem += 1
- inter_1 = dataMatrix[x] * v
- inter_2 = multiply(dataMatrix[x], dataMatrix[x]) * multiply(v, v)#multiply对应元素相乘
- #完成交叉项
- interaction = sum(multiply(inter_1, inter_1) - inter_2) / 2.
- p = w_0 + dataMatrix[x] * w + interaction#计算预测的输出
- pre = sigmoid(p[0, 0])
- result.append(pre)
- if pre < 0.5 and classLabels[x] == 1.0:
- error += 1
- elif pre >= 0.5 and classLabels[x] == -1.0:
- error += 1
- else:
- continue
- print result
- return float(error) / allItem
- if __name__ == '__main__':
- dataTrain, labelTrain = loadDataSet(trainData)
- dataTest, labelTest = loadDataSet(testData)
- date_startTrain = datetime.now()
- print "开始训练"
- w_0, w, v = stocGradAscent(mat(dataTrain), labelTrain, 20, 200)
- print "训练准确性为:%f" % (1 - getAccuracy(mat(dataTrain), labelTrain, w_0, w, v))
- date_endTrain = datetime.now()
- print "训练时间为:%s" % (date_endTrain - date_startTrain)
- print "开始测试"
- print "测试准确性为:%f" % (1 - getAccuracy(mat(dataTest), labelTest, w_0, w, v))
2、实验结果:
五、几点疑问
- def sigmoid(inx):
- #return 1.0 / (1 + exp(-inx))
- return 1. / (1. + exp(-max(min(inx, 15.), -15.)))
六 图片





fm 讲解加代码的更多相关文章
- 简单的自动化使用--使用selenium实现学习通网站的刷慕课程序。注释空格加代码大概200行不到
简单的自动化使用--使用selenium实现学习通网站的刷慕课程序.注释空格加代码大概200行不到 相见恨晚啊 github地址 环境Python3.6 + pycharm + chrom浏览器 + ...
- [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码
[洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起 ...
- [CodeIgniter4]讲解-加载静态页
讲解 本教程旨在向您介绍CodeIgniter框架和MVC体系结构的基本原理.它将向您展示如何以逐步的方式构造基本的CodeIgniter应用程序. 在本教程中,您将创建一个基本的新闻应用程序.您将从 ...
- Java核心技术及面试指南的视频讲解和代码下载位置
都是百度云盘,均无密码 代码下载位置: https://pan.baidu.com/s/1I44ob0vygMxvmj2BoNioAQ 视频讲解位置: https://pan.baidu.com/s/ ...
- 扩展欧几里得(ex_gcd),中国剩余定理(CRT)讲解 有代码
扩展欧几里得算法 求逆元就不说了. ax+by=c 这个怎么求,很好推. 设d=gcd(a,b) 满足d|c方程有解,否则无解. 扩展欧几里得求出来的解是 x是 ax+by=gcd(a,b)的解. 对 ...
- 傻瓜式的go modules的讲解和代码,及gomod能不能引入另一个gomod和gomod的use of internal package xxxx not allowed
一 国内关于gomod的文章,哪怕是使用了百度 -csdn,依然全是理论,虽然golang的使用者大多是大神但是也有像我这样的的弱鸡是不是? 所以,我就写个傻瓜式教程了. github地址:https ...
- Rainbond 对接 Istio 原理讲解和代码实现分析
一.背景 现有的 ServiceMesh 框架有很多,如 Istio.linkerd等.对于用户而言,在测试环境下,需要达到的效果是快.开箱即用.但在生产环境下,可能又有熔断.延时注入等需求.那么单一 ...
- C++工厂方法模式讲解和代码示例
在C++中使用模式 使用示例: 工厂方法模式在 C++ 代码中得到了广泛使用. 当你需要在代码中提供高层次的灵活性时, 该模式会非常实用. 识别方法: 工厂方法可通过构建方法来识别, 它会创建具体类的 ...
- Vue学习之--------组件嵌套以及VueComponent的讲解(代码实现)(2022/7/23)
欢迎加入刚建立的社区:http://t.csdn.cn/Q52km 加入社区的好处: 1.专栏更加明确.便于学习 2.覆盖的知识点更多.便于发散学习 3.大家共同学习进步 3.不定时的发现金红包(不多 ...
随机推荐
- SpringCloud初体验:七、gateway 网关服务如何做token验证
说说背景:假如有一个用户服在用户登录后,生成一个token给到客户端,用户每次请求时都需要这个token,于是每次都会在网关 gateway 校验,校验通过后网关从token中解析出userId,然后 ...
- php中二维数组排序问题方法详解
PHP中二维数组排序,可以使用PHP内置函数uasort() 示例一: 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 回调函数如下:注意回调函数的返回值是负数或者是false的时候,表示 ...
- DataSet和DataTable有用的方法
每一个DataSet都是一个或多个DataTable 对象的集合(DataTable相当于数据库中的表),这些对象由数据行(DataRow).数据列(DataColumn).字段名(Column Na ...
- OpenGL chapter4 基础变换
math3d库有两个数据类型,能够表示一个三维或四维向量: M3DVector3f M3DVector4f 4.3 理解投影 正投影 : 正交变换 透视投影 : 透视变换 表4.1 OpenGL变换术 ...
- CSS border边框属性教程(color style)
CSS 边框即CSS border-border边框样式颜色.边框样式.边框宽度的语法结构与应用案例教程篇 一.CSS 边框基础知识 CSS 边框即CSS border是控制对象的边框边线宽度.颜色. ...
- 基于Linux的Samba开源共享解决方案测试(一)
转自http://blog.csdn.net/u013394982/article/details/17914429 Linux操作系统 Linux是一类Unix计算机操作系统的统称.Linux操作系 ...
- Sublime Text 3 个人使用总结
待更新 Sublime Text 3\Packages\FileHeader\template\header
- Python - Django - ORM 操作数据
查询数据(查询管理员): app01/models.py 中定义的类,也就是创建的表 from django.db import models # 类必须继承 models.Model class A ...
- 并发基础(三) java线程优先级
在不同的JVM中(JVM也算是一个操作系统),有着不同的CPU调度算法,对于大部分的JVM来说,优先级也是调度算法中的一个参数.所以,线程优先级在一定程度上,对线程的调度执行顺序有所影响,但不能用 ...
- mac 安装 nginx
我是用root用户装的 1.先安装PCRE库 可以在这里下载最新版,我这里使用的是8.33的版本然后在终端执行下面的命令. cd ~/Download tar xvzf pcre-8.33.tar.g ...