主線1 2FM演算法的Python實現

2021-10-05 19:31:25 字數 4097 閱讀 9609

演算法原理部分可以檢視部落格主線1.1fm演算法原理詳解

# 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 =

8def

loaddataset

(data)

:# 對資料進行處理

datamat =

labelmat =

fr =

open

(data)

# 開啟檔案

for line in fr.readlines():

# readlines()用於讀取所有行並返回列表,該列表可以由 python 的 for... in ... 結構進行處理。如果碰到結束符eof則返回空字串。

currline = line.strip(

).split(

)# 該語法作用是除掉兩邊和中間空格,返回乙個字串列表

# linearr = [1.0]

linearr =

for i in

range

(featurenum)

:float

(currline[i +1]

))# 將字串列表放到linearr中

# # 最終將處理完的資料放到datamat中

float

(currline[0]

)*2-

1)return datamat, labelmat

defsigmoid

(inx)

:# 啟用函式sigmoid

return

1.0/(1

+ exp(

-inx)

)def

stocgradascent

(datamatrix, classlabels, k,

iter):

# 引數更新

# datamatrix用的是mat, classlabels是列表 mat函式用於將陣列轉換為矩陣

m, n = shape(datamatrix)

alpha =

0.01

# 初始化引數

w = zeros(

(n,1))

# 其中n是特徵的個數

w_0 =0.

v = normalvariate(0,

0.2)

* ones(

(n, k)

)# normalvariate用於生成正態分佈函式

for it in

range

(iter):

print

itfor x in

range

(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])-

1print

loss

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]

* 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]

)return w_0, w, v

defgetaccuracy

(datamatrix, classlabels, w_0, w, v)

: m, n = shape(datamatrix)

allitem =

0 error =

0 result =

for x in

range

(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])if pre <

0.5and classlabels[x]

==1.0

: error +=

1elif pre >=

0.5and classlabels[x]==-

1.0:

error +=

1else

: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)

)

FM的快速增量演算法猜想

接觸fm方法時間也算是很久了,雖然沒有持續在上面做非常深入的研究,但是做的幾個專案中,多次使用後也算是也算是業餘玩家中的高階玩家了。在前期的乙個專案中深入的參與了spark中的als推薦模型 其實本質是fm,als是指其中最優化的演算法 其中主要參與解決的問題就是增量推薦 場景中是解決新使用者的推薦...

python教程系列(五 1 2 演算法的衡量)

事後統計方法 主要是通過設計好的測試程式和資料,利用計算機計時器對不同演算法編制的程式的執行時間進行比較,從而確定演算法效率的高低,但這種方法有很大缺陷,一般不予採納。事前分析估算方法 在計算機程式編制前,依據統計方法對演算法進行估算。乙個用高階語言編寫的程式在計算機上執行時所消耗的時間取決於以下因...

python主線程捕獲子執行緒的方法

最近,在做乙個專案時遇到的了乙個問題,主線程無法捕獲子執行緒中丟擲的異常。先看乙個執行緒類的定義 created on oct 27,2015 author wujz import threading class runscriptthread threading.thread def init s...