精华内容
下载资源
问答
  • libfm

    2019-05-10 14:56:22
    FM模型主要目标是:解决数据稀疏的情况下,特征怎样组合的问题,因此该算法主要用于组合特征等特征工程。...进入src的libfm目录点击make all命令,在bin目录下会生成三个可执行的文件的convert* libFM...

    FM模型主要目标是:解决数据稀疏的情况下,特征怎样组合的问题,因此该算法主要用于组合特征等特征工程。

    参考 https://blog.csdn.net/chloezhao/article/details/53462411  使用手册中文版

    具体可以查看readme.pdf

    进入src的libfm目录点击make all命令,在bin目录下会生成三个可执行的文件的convert*  libFM*  transpose*

    在bin目录下操作命令

    1. ./libFM -help :libFM 工具
    2. ./convert :将文字文件转换成二进制格式的工具
    3. ./transpose:转换二进制设计矩阵的一个工具
    4. •  scripts

      — — ltriple format to libfm.pl︰ 一个 Perl 脚本将逗号/制表符分隔的数据集 转换成 libFM 格式。

      • src︰ 源文件的 libFM 和工具

    文件格式

    libFM的输入数据支持两种文件格式:txt格式和二进制格式。txt推荐新手使用。

     数据格式跟SVMlite和 LIBSVM的一样:4 0:1.5 3:-7.9   y=4,  x0 = 1.5 ,x3=-7.9(先是y,再是xINDEX = VALUE)

    For binary classification, cases with y > 0 are regarded as the positive class and with y ≤ 0 as the negative class.

    文件转换

    推荐系统中经常使用像 userid, itemid, rating的这样的文件格式

    1、文本格式

    转换libFM文件格式的perl脚本在scripts目录中

    #输出将写入到一个文件扩展名为.libfm的文件中。例如,写入toratings.dat.libfm中。将Movielens 1M里的rating.csv转换成libFM格式
    ./triple_format_to_libfm.pl-in ratings.dat -target 2 -delete_column 3 -separator "::"
    包含多个文件
    ./triple_format_to_libfm.pl -in train.txt,test.txt -target 2 -delete_column 3 -separator ”::”
    每个文件单独运行转换脚本,变量(ids)会不匹配
    
    
    ./libFM -task r -train ml1m-train.libfm -test ml1m-test.libfm -dim ’1,1,8’ -iter 1000 -method sgd /als  /mcmc
    -learn_rate 0.01 -regular ’0,0,0.01’ -init_stdev 0.1 
    
    

    2、二进制文件

    bin文件夹下的convert

    ./convert --ifile ratings.dat.libfm --ofilex ratings.x --ofiley ratings.y
    
    输出两个文件: 
    (1)包含设计矩阵X即预测器变量的文件
    (2)包含预测目标y的文件
    建议,分别以.x和.y作为文件拓展名
    
    转置数据: ./transpose --ifile ratings.x --ofile ratings.xt

     

    3、LIBFM

    libFm工具从训练数据集(-train)和验证数据集(-test)中训练FM模型。

    强制参数

    • task要指定,到底是classification还是regression,分类还是回归。
    •   train和test数据集要指定。可以使用二进制文件,也可以使用libFm文本格式文件
    •   dim要指定,k0,k1,k2
    • 例如:一个FM,使用bias,1-way interactions,a factorization of k = 8 forpairwise interactions的回归任务——
      /libFM -task r -train ml1m-train.libfm -test ml1m-test.libfm -dim ’1,1,8’
      LIBFM说明
    ----------------------------------------------------------------------------
    libFM
      Version: 1.4.2
      Author:  Steffen Rendle, srendle@libfm.org
      WWW:     http://www.libfm.org/
    This program comes with ABSOLUTELY NO WARRANTY; for details see license.txt.
    This is free software, and you are welcome to redistribute it under certain
    conditions; for details see license.txt.
    ----------------------------------------------------------------------------
    -cache_size     cache size for data storage (only applicable if data is
                    in binary format), default=infty
    -dim            'k0,k1,k2': k0=use bias, k1=use 1-way interactions,
                    k2=dim of 2-way interactions; default=1,1,8
    -help           this screen
    -init_stdev     stdev for initialization of 2-way factors; default=0.1
    -iter           number of iterations; default=100
    -learn_rate     learn_rate for SGD; default=0.1
    -meta           filename for meta information about data set
    -method         learning method (SGD, SGDA, ALS, MCMC); default=MCMC
    -out            filename for output
    -regular        'r0,r1,r2' for SGD and ALS: r0=bias regularization,
                    r1=1-way regularization, r2=2-way regularization
    -relation       BS: filenames for the relations, default=''
    -rlog           write measurements within iterations to a file;
                    default=''
    -task           r=regression, c=binary classification [MANDATORY]
    -test           filename for test data [MANDATORY]
    -train          filename for training data [MANDATORY]
    -validation     filename for validation data (only for SGDA)
    -verbosity      how much infos to print; default=0

     

    展开全文
  • <div><p>libfm-extra conflicts with libfm-git, cannot install new version of menu-cache. <p>error: failed to commit transaction (conflicting files) libfm-extra: /usr/include/libfm-1.0/fm-extra.h exists...
  • libfm手册1.4.2

    2017-09-24 10:34:30
    改文档讲述libfm框架的安装,数据输入格式,使用,以及基本原理,通过该文档基本可以快速上手使用libfm框架。
  • Independence from libfm

    2020-12-28 08:31:04
    <div><p>In the last few months, I saw that some libfm-qt methods and functions, which were based on libfm, could be replaced by Qt-only ones. Naturally, it occurred to me that maybe libfm-qt could be ...
  • libfm-qt 概述 libfm-qt是libfm的Qt端口,libfm是一个库,提供了用于构建属于桌面文件管理器的组件。 libfm-qt已根据或任何更高版本的条款获得许可。 有关全文,请参见文件LICENSE。 fm-qt-config.cmake.in根据的...
  • Fedora libfm conflicts.

    2021-01-02 16:03:47
    <div><p>In fedora the libfm which is required for lxde conflicts with libfm and libfm4 in lxqt. Therefore I cannot test lxqt while having lxde installed. <p>One solution would be to ship a pcmanfm ...
  • Python安装 libFM

    千次阅读 2018-09-20 19:07:30
    编译libFm 主页: http://www.libfm.org/ 源代码:https://github.com/srendle/libfm libFm手册(libFM 1.4.2 manual):http://www.libfm.org/libfm-1.42.manual.pdf LibFM使用手册中文版: ...

    编译libFm

    主页: http://www.libfm.org/
    源代码:https://github.com/srendle/libfm
    libFm手册(libFM 1.4.2 manual):http://www.libfm.org/libfm-1.42.manual.pdf
    LibFM使用手册中文版: https://blog.csdn.net/Chloezhao/article/details/53462411

    下载源码,进入文件夹编译:make all
    在这里插入图片描述

    Python 中使用FM

    python工具包

    In [1]: from pyfm import pylibfm
    In [2]: from sklearn.feature_extraction import DictVectorizer
    In [3]: import numpy as np
    
    In [4]: train = [
    	{"user": "1", "item": "5", "age": 19},
    	{"user": "2", "item": "43", "age": 33},
    	{"user": "3", "item": "20", "age": 55},
    	{"user": "4", "item": "10", "age": 20},
    ]
    In [5]: v = DictVectorizer()
    In [6]: X = v.fit_transform(train)
    
    In [7]: print(X.toarray())
    [[ 19.   0.   0.   0.   1.   1.   0.   0.   0.]
     [ 33.   0.   0.   1.   0.   0.   1.   0.   0.]
     [ 55.   0.   1.   0.   0.   0.   0.   1.   0.]
     [ 20.   1.   0.   0.   0.   0.   0.   0.   1.]]
    
    In [8]:  y = np.repeat(1.0,X.shape[0])
    In [9]:  fm = pylibfm.FM()
    In [10]:  fm.fit(X,y) 
    Creating validation dataset of 0.01 of training for adaptive regularization
    -- Epoch 1
    Training log loss: 0.37194
    
    In [11]:  m.predict(v.transform({"user": "1", "item": "10", "age": 24}))
    Out[11]: array([ 0.99795679])
    
    展开全文
  • libFM 简介

    2016-01-04 17:12:00
    libFM全称为Factorization Machine Library,是由Steffen Rendle于2010年提出的。最近由于他以libFM为队名,在KDD CUP 2012和刚刚结束的Music Hackathon中都取得了很不错的成绩,所以libFM引...

    原文:https://eachcloudcn.blob.core.chinacloudapi.cn/clips/XOI1W.htm

    libFM全称为Factorization Machine Library,是由Steffen Rendle于2010年提出的。最近由于他以libFM为队名,在KDD CUP 2012和刚刚结束的Music Hackathon中都取得了很不错的成绩,所以libFM引起了一些人的注意。我最近拜读了一下libFM的相关论文,以及源代码,也有一些收获,就总结一下。
    libFM不仅仅适用于推荐系统,而是和SVM一样可以用于数据挖掘中的很多问题,以分类问题为主。他接受的数据格式和libSVM是一样的,每行一个数值(分类结果or打分结果等),对应一组特征,每个非零特征都需要给出数值,零特征忽略。
    他的思想应该是从推荐系统中经典的SVD模型(因子分解模型)得到的,经典的SVD模型当中相当于只有两种类型的feature,一类feature是user,一类feature是item,而libFM是把这个模型推广到了多类feature的情况。为简单起见,考虑因子维数为1的情况,SVD模型用ab来作为对打分的预测。而libFM要面对的是多类feature,假设是3类,那么就用ab+bc+ca来作为对结果的预测。这时候就要问了,如果feature很多,这不就有平方量级的乘法次数了么?当然不是,libFM的文章中提到,他利用((a+b+c)2a2b2c2)/2来计算刚才的式子,但是你可以看到,他们其实是相等的,不同的是,这样的计算量只是线性复杂度的。当然libFM也同时支持bias项,这和经典SVD模型类似。
    以上就是libFM的创新之处,其实如果很了解SVD模型,那这个改进并不难理解。
    论文中还提到,经典的SVD++模型等对于SVD模型的改进,也只是libFM的一个子集而已。只要合适的去添加feature即可。比如SVD++模型就相当于对每个item增加一个feature,来描述用户是否也给这个item打过分即可。所以有了libFM以后,最需要人工解决的问题就是添加合适的feature了。
    另外再说明一下推荐系统的数据如何转化成libFM接受的形式。假设User ID范围是[0,99],Item ID范围是[0,199],则定义feature 0到feature 99对应于User,feature 100到feature 299对应于Item,假设第一条打分记录是User 4对Item 9的打分,则feature 4和feature 109的取值为1,其余feature取值都是0。由于数据文件是稀疏格式的,所以取值为0的feature都不用写,这样文件不会太大。其余对经典SVD模型的改进就需要增加一些对应feature。他的代码中,每条记录是使用map存储feature的,可以随机存取任意一个feature的值(但是可能用链表就可以了?因为一般都是顺序访问的)。
    他的这种做法虽然简单,但可以很好的处理二元以上的关系。libFM能够从一个更高的层次去理解SVD模型的改进,这也包括去年xlvector对KDD CUP Track 2所做的那个改进(用户是否听过这个歌手的歌),这也难怪libFM能在多个比赛中取得出色的成绩。
    最后给出libFM官方网站:http://libfm.org/

    展开全文
  • 本节主要介绍的是libFM源码分析的第三部分——libFM的模型处理。3.1、libFM中FM模型的定义libFM模型的定义过程中主要包括模型中参数的设置及其初始化,利用模型对样本进行预测。在libFM中,首先定义FM模型,在fm_...

    本节主要介绍的是libFM源码分析的第三部分——libFM的模型处理。

    3.1、libFM中FM模型的定义

    libFM模型的定义过程中主要包括模型中参数的设置及其初始化,利用模型对样本进行预测。在libFM中,首先定义FM模型,在fm_model类中实现对FM模型的定义,fm_model类在“\libfm-1.42.src\src\fm_core\fm_model.h”中。在定义fm_model类之前,使用到了一些数据类:

    #include "../util/matrix.h"
    #include "../util/fmatrix.h"
    
    #include "fm_data.h"

    数据类的具体定义在“机器学习算法实现解析——libFM之libFM的数据处理部分”中定义。fm_model类的代码如下所示:

    // fm_model模型类
    class fm_model {
        private:
            DVector<double> m_sum, m_sum_sqr;// 分别对应着交叉项的中的两项
        public: //fm模型中的参数
            double w0;// 常数项
            DVectorDouble w;// 一次项的系数
            DMatrixDouble v;// 交叉项的系数矩阵
    
        public:
            // 属性
            // the following values should be set:
            uint num_attribute;// 特征的个数
    
            bool k0, k1;// 是否包含常数项和一次项
            int num_factor;// 交叉项因子的个数
    
            double reg0;// 常数项的正则参数
            double regw, regv;// 一次项和交叉项的正则系数
    
            double init_stdev;// 初始化参数时的方差
            double init_mean;// 初始化参数时的均值
    
            // 函数
            fm_model();// 构造函数,主要完成参数的初始化
            void debug();// debug函数
            void init();// 初始化函数,主要用于生成各维度系数的初始值
            // 对样本进行预测
            double predict(sparse_row<FM_FLOAT>& x);
            double predict(sparse_row<FM_FLOAT>& x, DVector<double> &sum, DVector<double> &sum_sqr);
    };

    FM模型的一般形式如下所示:

    y^:=w0+i=1nwixi+i=1n1j=i+1nvi,vjxixj

    其中,w0为常数项系数,wi为一次项系数,vivj为交叉项系数。对于交叉项系数vi,其具体的形式为:

    vi=(vi,1,vi,2,,vi,k)1×k

    在FM模型的定义中,首先需要分别定义三个参数:w0,w和v。其次,需要定义模型中需要使用到的函数,包括初始化init函数和预测predict函数。

    3.2、FM的初始化

    完成FM模型初始化过程主要包括两个部分:

    • 构造函数fm_model()
    • init()函数

    构造函数fm_model()的具体实现如下所示:

    // fm_model类的构造函数
    fm_model::fm_model() {
        num_factor = 0;// 交叉项中因子的个数
        init_mean = 0;// 初始化的均值
        init_stdev = 0.01;// 初始化的方差
        reg0 = 0.0;// 常数项的正则化参数
        regw = 0.0;// 一次项的正则化参数
        regv = 0.0;// 交叉项的正则化参数 
        k0 = true;// 是否包含常数项
        k1 = true;// 是否包含一次项
    }

    init()函数的具体实现如下所示:

    // 初始化fm模型的函数
    void fm_model::init() {
        w0 = 0;// 常数项的系数
        w.setSize(num_attribute);// 设置一次项系数的个数
        v.setSize(num_factor, num_attribute);// 设置交叉项的矩阵大小
        w.init(0);// 初始化一次项系数为0
        v.init(init_mean, init_stdev);// 按照均值和方差初始化交叉项系数
        // 交叉项中的两个参数,设置其大小为num_factor
        m_sum.setSize(num_factor);
        m_sum_sqr.setSize(num_factor);
    }

    在初始化的过程中,除了基本的数据类型外,还涉及到自定义的三种数据类型,分别为:DVectorDouble,DMatrixDouble和DVector,这三种数据类型在“机器学习算法实现解析——libFM之libFM的数据处理部分”中有详细说明。

    3.3、利用FM模型对样本进行预测

    在libFM中,fm_model类中实现了两种预测函数,分别为:

    double predict(sparse_row<FM_FLOAT>& x);
    double predict(sparse_row<FM_FLOAT>& x, DVector<double> &sum, DVector<double> &sum_sqr);

    两者的区别主要是下面的函数多了两个参数,一个是sum,另一个是sum_sqr,这两个参数分别对应着交叉项计算过程中的两项。

    FM模型中的计算方法为:

    y^:=w0+i=1nwixi+i=1n1j=i+1nvi,vjxixj

    其中,对于交叉项的计算,在FM算法中提出了快速的计算方法,即:

    i=1n1j=i+1nvi,vjxixj=12i=1nj=1nvi,vjxixj12i=1nvi,vixixi=12i=1nj=1nf=1kvi,fvj,fxixji=1nf=1kvi,fvj,fx2i=12f=1k(i=1nvi,fxi)j=1nvj,fxji=1nv2i,fx2i=12f=1k(i=1nvi,fxi)2i=1nv2i,fx2i

    利用上面的计算公式,libFM中的两个函数的实现如下所示:

    // 对样本进行预测,其中x表示的是一行样本
    double fm_model::predict(sparse_row<FM_FLOAT>& x) {
        return predict(x, m_sum, m_sum_sqr);        
    }
    
    double fm_model::predict(sparse_row<FM_FLOAT>& x, DVector<double> &sum, DVector<double> &sum_sqr) {
        double result = 0;// 最终的结果
        // 第一部分
        if (k0) {// 常数项 
            result += w0;
        }
    
        // 第二部分
        if (k1) {// 一次项
            for (uint i = 0; i < x.size; i++) {// 对样本中的每一个特征
                assert(x.data[i].id < num_attribute);// 验证样本的正确性
                // w * x
                result += w(x.data[i].id) * x.data[i].value;
            }
        }
    
        // 第三部分
        // 交叉项,对应着公式,有两重循环
        for (int f = 0; f < num_factor; f++) {// 外层循环
            sum(f) = 0;
            sum_sqr(f) = 0;
            for (uint i = 0; i < x.size; i++) {
                double d = v(f,x.data[i].id) * x.data[i].value;
                sum(f) += d;
                sum_sqr(f) += d*d;
            }
            result += 0.5 * (sum(f)*sum(f) - sum_sqr(f));// 得到交叉项的值
        }
        return result;
    }

    在交叉项的计算过程中,sum(f)和sum_sqr(f)与公式中的对应关系为:


    这里写图片描述

    3.4、其他

    剩下的代码便是debug函数,debug函数用于打印中间的结果,其具体的代码如下所示:

    // debug函数,主要用于输出中间调试的结果
    void fm_model::debug() {
        std::cout << "num_attributes=" << num_attribute << std::endl;// 特征的个数
        std::cout << "use w0=" << k0 << std::endl;//是否包含常数项
        std::cout << "use w1=" << k1 << std::endl;//是否包含一次项
        std::cout << "dim v =" << num_factor << std::endl;//交叉项中因子的个数
        std::cout << "reg_w0=" << reg0 << std::endl;//常数项的正则化参数
        std::cout << "reg_w=" << regw << std::endl;//一次项的正则化参数
        std::cout << "reg_v=" << regv << std::endl;//交叉项的正则化参数
        std::cout << "init ~ N(" << init_mean << "," << init_stdev << ")" << std::endl;//初始化的均值和初始化的方差
    }

    参考文献

    • Rendle S. Factorization Machines[C]// IEEE International Conference on Data Mining. IEEE Computer Society, 2010:995-1000.
    • Rendle S. Factorization Machines with libFM[M]. ACM, 2012.
    展开全文
  • Libfm compilation error

    2020-12-31 22:44:29
    <div><p>I use the following command line to compile libfm (master version): <code>./configure \ --without-gtk \ --disable-gtk-doc \ --disable-udisks \ --enable-actions \ --prefix="/usr&#...
  • libFM初尝试

    2020-04-11 10:43:39
    libFM使用 要使用LibFM训练数据,发现要用libvsm格式数据 但libvsm格式的数据要求时一行一个样本,第一列是标签,其余列是feature特征,但我们的数据是有三个标签,于是设法分别对三个标签单独训练三次,向其他博客...
  • 本节主要介绍的是libFM源码分析的第五部分之二——libFM的训练过程之Adaptive Regularization的方法。5.3、Adaptive Regularization的训练方法5.3.1、SGD的优劣在“机器学习算法实现解析——libFMlibFM的训练过程...
  • 本节主要介绍的是libFM源码分析的第四部分——libFM的训练。FM模型的训练是FM模型的核心的部分。4.1、libFM中训练过程的实现在FM模型的训练过程中,libFM源码中共提供了四种训练的方法,分别为:Stochastic Gradient...
  • 本节主要介绍的是libFM源码分析的第五部分之一——libFM的训练过程之SGD的方法。5.1、基于梯度的模型训练方法在libFM中,提供了两大类的模型训练方法,一类是基于梯度的训练方法,另一类是基于MCMC的模型训练方法。...
  • <code>Includes libfm-qt, the Qt port of the libfm - a library providing components to build desktop file managers.</code></p> <p>Seems one of the two is not up-to date, because without satisfying the ...
  • Package: libfm-qt-dev Version: 0.13.2~278-g3ecb989-1 Severity: normal -- System Information: Debian Release: buster/sid APT prefers testing APT policy: (990, 'testing'), (500, 'unstable...
  • libfm-1.3.1.tar.xz

    2019-03-13 10:18:46
    libfm-1.3.1.tar.xz 安装源码,linux下比较好用的文件管理器
  • libfm in python

    千次阅读 2016-12-05 16:10:18
    这是一个 python 实现的分解机 [1]。...从 libfm.org:"分解机 (FM) 是允许通过来模拟大多数分解模型的特征工程的泛型方法。这种方式,分解机"相结合特征工程概论凭借优势的分解模型估计的大域分类变量之
  • 本节主要介绍的是libFM源码分析的第五部分之一——libFM的训练过程之SGD的方法。 5.1、基于梯度的模型训练方法 在libFM中,提供了两大类的模型训练方法,一类是基于梯度的训练方法,另一类是基于MCMC的模型训练...
  • LibFM使用手册中文版

    万次阅读 2016-12-05 13:12:41
    英文版原文:http://www.libfm.org/libfm-1.42.manual.pdf 自己翻译 libFM 1.4.2 - 指南 Steffen Rendle srendle@libfm.org http://www.libfm.org/  2014年9月14日 内容
  • Factorization Machines with libFMhttps://pan.baidu.... libFM网站:http://www.libfm.org/ libFM github地址:https://github.com/srendle/libfm libFM manual中文版:http://d0evi1.c...
  • FM 算法介绍以及 libFM 源码简析 libFM 的大名如雷贯耳, 然而一直没有机会看看它的具体实现; 周末查看了一下 FM 算法的原理以及源码实现, 现在记录下心得. 另外发现大佬很多, 像博主 zhiyong_will 写了一系列的文章,...
  • libfm的基本使用

    千次阅读 2017-05-23 15:06:19
    话说fm、ffm等为代表的算法在ctr预测方面已经是大显身手,fm、ffm的开源实现台湾国立大学,业界常用的LibSVM, Liblinear等都是他们开发的,开源代码的效率和质量都非常高,本篇文章也是为了介绍libfm的基本使用,...
  • Simple libFM example, part1(LibFM使用方法)

    千次阅读 2015-05-02 12:24:41
    I often get email of people asking me how to run libFM and having trouble to understand the whole pipeline. If you are verse in Machine Learning, a first step is to take a look at Steffen Rendle’...
  • libFM安装 1.下载libFM源码包: 源包 2.解压压缩包libfm-1.42.src(为方便后续操作,将文件重命名为libfm) 3.在终端输入命令行:cd /Users/xxx/Desktop/libfm/,即到libfm放置的目录下,我是将源包放置在了桌面上。...
  • Factorization Machines with libFM

    千次阅读 2016-10-08 21:12:08
    LIBFM是FM的软件实现,实现了随机梯度下降(SGD),交替最小二乘(ALS)和使用MCMC进行贝叶斯推断的方法(MCMC)。本文从建模和学习两个角度总结了FM最近的研究进展,对ALS和MCMC算法进行了拓展;并对LIBFM工具进行...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 329
精华内容 131
关键字:

LibFM