Factorization Machine

Factorization Machine---因子分解機(jī)

①target function的推導(dǎo)

logistics regression algorithm model中使用的是特征的線性組合捞魁,最終得到的分割平面屬于線性模型局骤,但是線性模型就只能處理線性問(wèn)題惋鸥,所以對(duì)于非線性的問(wèn)題就有點(diǎn)難處理了银受,對(duì)于這些復(fù)雜問(wèn)題一般是兩種解決方法①對(duì)數(shù)據(jù)本身進(jìn)行處理妆绞,比如進(jìn)行特征轉(zhuǎn)換收捣,和函數(shù)高維擴(kuò)展等等陨收。②對(duì)算法模型本身進(jìn)行擴(kuò)展势告,比如對(duì)linear regression加上正則化懲罰項(xiàng)進(jìn)行改進(jìn)得到lasso regression或者是ridge regression岸啡。
Factorization Machine就是一種對(duì)logistics regression的一種改進(jìn)原叮,線性的部分權(quán)值組合是不變的,在后面增加了非線性的交叉項(xiàng)巡蘸。
target function:y_{score} = w_0+\sum_{i=1}^nw_ix_i+\sum_{i=1}^{n-1}\sum_{j=i+1}^n<v_i, v_j>x_ix_j <v_i, v_j> = \sum_{f=1}^kv_{i,f}*v_{j,f}
v_i表示的是系數(shù)矩陣V的第i維向量奋隶,v_i=(v_{i,1},v_{i,2},v_{i,3},...v_{i,k}),k的大小稱為是度悦荒,度越大代表分解出來(lái)的特征就越多唯欣。對(duì)于每一個(gè)特征都會(huì)對(duì)應(yīng)有一個(gè)k維的向量。前兩部分是傳統(tǒng)的線性模型搬味,后一個(gè)部分就是將臉剛剛互不相同的特征分量之間的相互關(guān)系考慮進(jìn)來(lái)了境氢。也就是不同特征之間的吸引程度。
如果使用男女戀愛(ài)來(lái)解釋這個(gè)模型碰纬,得分score是男生對(duì)女生的一個(gè)喜歡程度萍聊,w_0代表的就是底分,可以看成是男生對(duì)于女生的第一感覺(jué)悦析。對(duì)于第二部分可以看成是女生的優(yōu)秀程度寿桨,第三部分就相當(dāng)于是男女之間的事交互關(guān)系了,也就是男女之間的感覺(jué)她按,如果兩個(gè)男生對(duì)于同一個(gè)女生的感覺(jué)是一致的牛隅,那么他們的v就是一致的,從本質(zhì)上說(shuō)酌泰,因子分解機(jī)也是探索一種相似性媒佣,其與協(xié)同過(guò)濾算法是類似的,但是這兩者的區(qū)別在于陵刹,因子分解機(jī)同時(shí)考慮了男生和男生間的相似性以及女生和女生間的相似性默伍,但是協(xié)同過(guò)濾要么只考慮男生之間的相似性,要么只考慮女生之間的相似性衰琐。

優(yōu)化求解target function

y_{score} = w_0+\sum_{i=1}^nw_ix_i+\sum_{i=1}^{n-1}\sum_{j=i+1}^n<v_i, v_j>x_ix_j <v_i, v_j> = \sum_{f=1}^kv_{i,f}*v_{j,f}對(duì)于原始的target function計(jì)算復(fù)雜度是O(n^2)也糊,采用公式((a+b+c)^2-a^2-b^2-c^2)/2的公式。于是化簡(jiǎn)一波:


這樣就成功的把復(fù)雜度降到了
O(n)

FM可以解決的問(wèn)題主要是四種:
1.回歸問(wèn)題:這時(shí)候的error function:L = \frac{1}{2}\sum_{i=1}^m(y_i^{'}-y_i)^2
2.二分類問(wèn)題:L = \sum_{i=1}^m-ln(sigmoid(y_i^{'}y_i))
3.排序問(wèn)題羡宙。
4,推薦系統(tǒng)狸剃。

接下來(lái)就是模型的求解,自然就是求導(dǎo)了狗热,我們做的是二分類問(wèn)題钞馁,所以采用的就是第二種loss function求導(dǎo),按照求導(dǎo)常規(guī)求取即可:
w_0 = w_0-\alpha[1-sigmoid(y^{'}y)]*y

w_i = w_i-\alpha[1-sigmoid(y^{'}y)]*y*x_i

v_{i,f} = v_{i,f}-\alpha[1-sigmoid(y^{'}y)]*y*[x_i\sum_{j=1}^nv_{j,f}x_j-v_{i,f}x_i^2]

Factorization Machine的優(yōu)點(diǎn)

①對(duì)于一些很稀疏的數(shù)據(jù)集也可以進(jìn)行參數(shù)的預(yù)測(cè)匿刮,而SVM是不行的僧凰。
②FM有線性的復(fù)雜性,可以直接在原始數(shù)據(jù)進(jìn)行預(yù)測(cè)熟丸,而不需要再做核函數(shù)或者特征轉(zhuǎn)換训措,對(duì)于SVM,是要基于對(duì)支持向量的優(yōu)化的光羞。
③FMs是一種通用的預(yù)測(cè)器绩鸣,可用于任何實(shí)值特征向量。相比之下狞山。其他最先進(jìn)的因數(shù)分解模型只在非常有限的輸入數(shù)據(jù)上工作全闷。通過(guò)定義輸入數(shù)據(jù)的特征向量,F(xiàn)Ms可以模擬最先進(jìn)的模型萍启,如偏置MF总珠、SVD++、PITF或FPMC勘纯。

K的選擇

如果數(shù)據(jù)是一個(gè)稀疏矩陣局服,那么可以選擇一個(gè)比較小的k,因?yàn)橄∈杈仃嚻鋵?shí)就已經(jīng)表明這個(gè)矩陣的信息是十分有限的了驳遵,再取比較大的k可能會(huì)導(dǎo)致過(guò)擬合淫奔。如果數(shù)據(jù)并不是一個(gè)稀疏矩陣,可以選擇大一點(diǎn)的k來(lái)代表數(shù)據(jù)堤结。

代碼實(shí)現(xiàn)

主要部分的代碼:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from loadDataSet import loadData

def Accuracy(preiction, classlabel):
    score = 0
    for i in range(len(preiction)):
        if preiction[i] > 0.5:
            preiction[i] = 1
        else:
            preiction[i] = -1
        if preiction[i] == classlabel[i]:
            score += 1
    print('Accuracy: ', score/len(preiction))

def initialize(n, k):
    v = np.mat(np.zeros((n, k)))
    for i in range(n):
        for j in range(k):
            v[i, j] = np.random.normal(0, 0.2)
    return v

def sigmoid(inx):
    return 1.0/(1+np.exp(-inx))

def getCost(predict, classLabels):
    m = len(predict)
    error = 0.0
    for i in range(m):
        error -= np.log(sigmoid(predict[i]*classLabels[i]))
    return error

def getPrediction(dataMatrix, w0, w, v):
    m = np.shape(dataMatrix)[0]
    result = []
    for x in range(m):
        inter_1 = dataMatrix[x] * v
        inter_2 = np.multiply(dataMatrix[x], dataMatrix[x]) * np.multiply(v, v)
        interaction = np.sum(np.multiply(inter_1, inter_1) - inter_2) / 2
        p = w0 + dataMatrix[x] * w + interaction
        pre = sigmoid(p[0, 0])
        result.append(pre)
    return result

def stocGradAscent(dataMatrix, classLabels, k, max_iter, alpha):
    #initialize parameters
    m, n = np.shape(dataMatrix)
    w = np.zeros((n, 1))
    w0 = 0
    v = initialize(n, k)
    #training
    for it in range(max_iter):
        for x in range(m):
            inter_1 = dataMatrix[x] * v
            inter_2 = np.multiply(dataMatrix[x], dataMatrix[x])*np.multiply(v, v)
            interaction = np.sum(np.multiply(inter_1, inter_1) - inter_2)/2
            p = w0 + dataMatrix[x]*w + interaction
            loss = sigmoid(classLabels[x] * p[0, 0]) - 1
            w0 = w0 - alpha*loss*classLabels[x]
            for i in range(n):
                if dataMatrix[x, i] != 0:
                    w[i, 0] = w[i, 0] - alpha*loss*classLabels[x]*dataMatrix[x, i]
                for j in range(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])
        if it % 1000 == 0:
            print('-----iter: ', it, ', cost: ', getCost(getPrediction(np.mat(dataMatrix), w0, w, v), classLabels))
            Accuracy(getPrediction(np.mat(dataMatrix), w0, w, v), classLabels)

if __name__ == '__main__':
    dataMatrix, target = loadData('../Data/testSetRBF2.txt')
    stocGradAscent(dataMatrix, target, 5, 5000, 0.01)

準(zhǔn)備數(shù)據(jù)部分:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

def loadData(filename):
    df = pd.read_csv(filename, sep='    ', names=['1', '2', 'target'])
    data = []
    target = []
    for i in range(len(df)):
        d = df.iloc[i]
        ds = [d['1'], d['2']]
        t = int(d['target'])
        if t == 0:
            t = -1
        data.append(ds)
        target.append(t)
    return np.mat(data), np.mat(target).tolist()[0]

if __name__ == '__main__':
    dataMatrix, target = loadData('../Data/testSetRBF2.txt')
    print(dataMatrix)
    print(target)

最后附上GitHub代碼:
https://github.com/GreenArrow2017/MachineLearning/tree/master/MachineLearning/Factorization%20Machine

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末唆迁,一起剝皮案震驚了整個(gè)濱河市鸭丛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唐责,老刑警劉巖鳞溉,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鼠哥,居然都是意外死亡熟菲,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)朴恳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抄罕,“玉大人,你說(shuō)我怎么就攤上這事于颖〈艋撸” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵森渐,是天一觀的道長(zhǎng)榨崩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)章母,這世上最難降的妖魔是什么母蛛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮乳怎,結(jié)果婚禮上彩郊,老公的妹妹穿的比我還像新娘。我一直安慰自己蚪缀,他們只是感情好秫逝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著询枚,像睡著了一般违帆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上金蜀,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天刷后,我揣著相機(jī)與錄音,去河邊找鬼渊抄。 笑死尝胆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的护桦。 我是一名探鬼主播含衔,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了贪染?” 一聲冷哼從身側(cè)響起缓呛,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杭隙,沒(méi)想到半個(gè)月后强经,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寺渗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兰迫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片信殊。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖汁果,靈堂內(nèi)的尸體忽然破棺而出涡拘,到底是詐尸還是另有隱情,我是刑警寧澤据德,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布鳄乏,位于F島的核電站,受9級(jí)特大地震影響棘利,放射性物質(zhì)發(fā)生泄漏橱野。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一善玫、第九天 我趴在偏房一處隱蔽的房頂上張望水援。 院中可真熱鬧,春花似錦茅郎、人聲如沸蜗元。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)奕扣。三九已至,卻和暖如春掌敬,著一層夾襖步出監(jiān)牢的瞬間惯豆,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工奔害, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留循帐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓舀武,卻偏偏與公主長(zhǎng)得像拄养,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 太長(zhǎng)不讀版:由推薦系統(tǒng)帶來(lái)的推薦服務(wù)基本上已經(jīng)滲透到我們生活的方方面面瘪匿,本文作為淺談推薦系統(tǒng)的基礎(chǔ)篇跛梗,主要從下面幾...
    stayrascal閱讀 31,578評(píng)論 5 60
  • 今天核偿,朋友圈各種秀恩愛(ài),各公眾號(hào)大神也不例外顽染,猝不及防被塞了一把又一把狗糧漾岳,導(dǎo)致到現(xiàn)在沒(méi)吃晚飯還飽飽的。獨(dú)虐虐不如...
    小多媛媛閱讀 1,526評(píng)論 4 3
  • 我今天也算進(jìn)賬了吧,本來(lái)這兩天漲價(jià)洗頭要20的我依然付了15塊唧垦。這應(yīng)該說(shuō)進(jìn)賬五塊是吧
    怡臻閱讀 148評(píng)論 0 0
  • 孫皓暉先生所著《大秦帝國(guó)》系列小說(shuō)是幾年前偶爾看到的振亮。當(dāng)時(shí)開(kāi)始看了就停不下來(lái)巧还,一口氣就看完了前兩部。沒(méi)辦法坊秸,太好看...
    電影反光鏡閱讀 378評(píng)論 0 0
  • 今天我讀了魯迅先生的《阿長(zhǎng)與山海經(jīng)》麸祷。這篇文章講的是魯迅對(duì)兒時(shí)保姆“阿長(zhǎng)”的回憶。她不識(shí)文斷字褒搔,又有些迷信愚昧摇锋,連...
    AG有且僅有閱讀 229評(píng)論 0 0