先上代码

# coding:UTF-8from __future__ import division
from math import exp
from numpy import *
from random import normalvariate  # 正态分布
from datetime import datetime
import pandas as pd
import numpy as np
from math import log10
trainData = 'data/diabetes_train.txt'   #请换为自己文件的路径
testData = 'data/diabetes_test.txt'def preprocessData(data):feature=np.array(data.iloc[:,:-1])   #取特征label=data.iloc[:,-1].map(lambda x: 1 if x==1 else -1) #取标签并转化为 +1,-1#将数组按行进行归一化zmax, zmin = feature.max(axis=0), feature.min(axis=0)feature = (feature - zmin) / (zmax - zmin)label=np.array(label)return feature,labeldef sigmoid(inx):#return 1. / (1. + exp(-max(min(inx, 15.), -15.)))return 1.0 / (1 + exp(-inx))def SGD_FM(dataMatrix, classLabels, k, iter):''':param dataMatrix:  特征矩阵:param classLabels: 类别矩阵:param k:           辅助向量的大小:param iter:        迭代次数:return:'''# dataMatrix用的是mat, classLabels是列表m, n = shape(dataMatrix)   #矩阵的行列数,即样本数和特征数alpha = 0.01# 初始化参数# w = random.randn(n, 1)#其中n是特征的个数w = zeros((n, 1))      #一阶特征的系数w_0 = 0.v = normalvariate(0, 0.2) * ones((n, k))   #即生成辅助向量,用来训练二阶交叉特征的系数for it in range(iter):for x in range(m):  # 随机优化,每次只使用一个样本xx0=dataMatrix[x]xx=np.array(xx0)xx1=xx.T@xxvv=v@v.Te=xx1*vvinteraction=0.5*(e.sum()-e.trace())p = w_0 + xx@w + interactionloss = (1-sigmoid(classLabels[x] * p[0, 0]) )   #计算损失w_0 = w_0 +alpha * loss * classLabels[x]for i in range(n):if dataMatrix[x, i] != 0:w[i, 0] = w[i, 0] +alpha * loss * classLabels[x] * xx[0,i]#dataMatrix[x, i]for j in range(k):vv=np.array([v[:,j]])v[i, j] = v[i, j]+ alpha * loss * classLabels[x] * xx[0,i]*( xx@vv.T - v[i, j] * xx[0,i])print("第{}次迭代后的损失为{}".format(it, loss))return w_0, w, vdef getAccuracy(dataMatrix, classLabels, w_0, w, v):m, n = shape(dataMatrix)allItem = 0error = 0result = []for x in range(m):   #计算每一个样本的误差allItem += 1xx0=dataMatrix[x]xx=np.array(xx0)xx1=xx.T@xxvv=v@v.Te=xx1*vvinteraction=0.5*(e.sum()-e.trace())p = w_0 + xx@w + interactionpre = sigmoid(p[0, 0])result.append(pre)if pre < 0.5 and classLabels[x] == 1.0:error += 1elif pre >= 0.5 and classLabels[x] == -1.0:error += 1else:continuereturn float(error) / allItemif __name__ == '__main__':train=pd.read_csv(trainData)test = pd.read_csv(testData)dataTrain, labelTrain = preprocessData(train)dataTest, labelTest = preprocessData(test)date_startTrain = datetime.now()print    ("开始训练")w_0, w, v = SGD_FM(mat(dataTrain), labelTrain, 20, 30)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)))

从本质上讲,fm就是一个机器学习算法;
一种有监督学习算法;
一种和多元线性回归非常相似的算法;
就是一种算法而已;
但是这种算法在输入是稀疏矩阵的情况下,效果比LR,SVM,要好,
原因是他考虑了不同特征的相关性;
个性化推荐的场景下,输入的是一个很大的稀疏矩阵;
所以这种算法在推荐场景应用的比较多

代码在git

文章链接

1
2
3
4
5代码加数学推导

因子分解机 Factorization Machine python 源码相关推荐

  1. Python源码剖析[16] —— Pyc文件解析

    Python源码剖析[16] -- Pyc文件解析 2008-02-28 18:29:55|  分类: Python |举报 |字号 订阅 Python源码剖析 --Pyc文件解析 本文作者: Rob ...

  2. Python源码剖析[19] —— 执行引擎之一般表达式(2)

    Python源码剖析 --Python执行引擎之一般表达式(2) 本文作者: Robert Chen(search.pythoner@gmail.com ) 3.2     Simple.py 前面我 ...

  3. 卷积神经网络(三):卷积神经网络CNN的简单实现(部分Python源码)

    转载自: 卷积神经网络(三):卷积神经网络CNN的简单实现(部分Python源码) - xuanyuansen的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/xu ...

  4. python 取余_玩转Python源码(一) quot;%squot;与“%d”

    某一天吹水的时候,吹着吹着就吹到了一下这么一个案例. import timeitdef a():"%s, %s" % (1, 2)def b():"%s, %d" ...

  5. python源码剖析 豆瓣_在数据分析师的分析中豆瓣的书那些值得读

    最近总是有人问我有什么书好推荐看看,特烦.但是看到那么多人问,看来挺多人有这个需求,便想了一下,如何通过数据分析找到值得看的书.通过爬取某个标签例如产品,运营获取对应已经打了标签的书,获取书对应的评分 ...

  6. 分享57个Python源码,总有一款适合您

    Python源码 分享57个Python源码,总有一款适合您 57个Python源码下载链接:https://pan.baidu.com/s/1YZcrJAYFFy3OrdEN5IxnQQ?pwd=6 ...

  7. 活体检测眨眼、张嘴、点头、摇头动作一网打尽:人脸面部活体检测系统【含Python源码+PyqtUI界面+原理详解】

    基本功能演示 摘要:活体检测是用于判断捕捉到的人脸是真实人脸,还是伪造的人脸攻击的一种技术手段.本文详细介绍了其实现的技术原理,同时给出完整的Python实现代码,并且通过PyQT实现了UI界面,更方 ...

  8. Python源码学习:多线程实现机制

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 本文分析Python中的多线程机制,主要通过一个多线程的脚本来分析多线程的基本操作与 ...

  9. Python源码学习:Python类机制分析-用户自定义类

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 上一文,分析了Python在启动初始化时,对内置类的一个基本的初始化流程,本文就简析 ...

最新文章

  1. Python3中__init__.py文件介绍
  2. android socket 收不到数据,android Socket服务端接收客户端数据问题
  3. 学习jquery选项卡插件
  4. Tomcat容器入门介绍
  5. 使用CORS解决同源限制
  6. 《python 源码剖析》 读后总结(虚拟机综述)
  7. [css] 说说你对hasLayout的理解,触发hasLayout的方式有哪些?
  8. CORS跨域时axios无法获取服务器自定义的header信息 - 番外篇
  9. java for循环死循环_Java for循环进化
  10. Android4.4 多媒体开发(五)----OpenMax简介
  11. 根据crash学习用户空间程序内存布局
  12. mysql 优化max_Mysql 优化
  13. 扫描仪怎样装无线网络服务器,怎么设置打印机IP地址和安装扫描仪。
  14. recover 没有捕获异常_Golang学习笔记之错误处理error、panic (抛出错误),recover(捕获错误...
  15. 如何将mp4格式的电视剧转换成gif动图呢
  16. LaTeX中CTeX版本日期格式设置英文
  17. 各种范文都有,到时不用找了。(值得收藏)
  18. Incomplete chess boards 有趣.
  19. jboss下ejb简介
  20. 处理jmeter tcp 取样器500错误

热门文章

  1. Ubuntu 16.04使用root 帐号开启 SSH 登录
  2. XPath 使用那些事
  3. Python字符串、时间戳、datetime时间相关转换
  4. 为何终端防护对ICS如此重要
  5. 监控摄像机选型攻略之有无必要性
  6. ASP.NET Core 中文文档 第四章 MVC(4.2)控制器操作的路由
  7. Oracle数据表和Constraint管理
  8. IT人士,你的知识需要管理。
  9. ASP.NET 页面事件执行顺序
  10. Android使用ActivityGroup设置android:windowSoftInputMode失效的问题