python實現FM演算法
1、通常我們在做邏輯迴歸或者線性迴歸的時候一般都是沒有考慮特徵之間相乘產出的情況(特徵交叉)
假設有3個特徵x1,x2,x3,那麼就會有3中特徵相乘的組合x1*x2,x1*x3,x2*x3,如果變數的維度比較少,我們是可以先計算這些特徵組合在進行求相關的引數,但是如果遇到維度特別大的時候而且特徵又是比較稀疏的時候可以考慮用FM演算法
2、FM演算法的原理其實很簡單,只是利用這個簡單的公式 - - - = ,具體的原理以及導數的求解https://www.jianshu.com/p/40c7358040c9這篇文章講的很清楚
3、程式碼:
import pandas as pd import numpy as np # y_hat = w0 + w1*x1 + w2*x2 + w3*x3 + w4*x1*x2 + w5*x1*x3 + w6*x2*x3 => # y_hat = w0 + w1*x1 + w2*x2 + w3*x3 + 1/2[(v1*x1 + v2*x2 + v3*x3)^2 -(v1*x1)^2 -(v2*x2)^2 - (v3*x3)^2] # optimize params:w0,w1,w2,w3,v1,v2,v3 class FM: def __init__(self,target,lr=0.1,reg_lambda=0.0001,max_iter=300,bias=True): self.__lr = lr self.__reg_lambda = reg_lambda self.__max_iter = max_iter self.__bais = bias self.__coef = [] self.__v_coef = [] self.__target = target # 線性迴歸 if reg else 邏輯迴歸 @property def coef(self): return self.__coef @property def v_coef(self): return self.__v_coef def args_init(self,columns): if self.__bais: self._intercept = 0.001 for _ in columns: self.__coef.append(np.random.normal(0,0.1)) self.__v_coef.append(np.random.normal(0,0.1)) def sigmoid(self,x): ss = np.exp(-np.clip(x,a_min=-1e32,a_max=1e32)) return 1/(1 + ss) @staticmethod def calc_ks(y_true, y_pred): y_true = y_true.reshape(-1, ) y_pred = y_pred.reshape(-1, ) sort_index = np.argsort(y_pred, kind="mergesort")[::-1] y_pred = y_pred[sort_index] y_true = y_true[sort_index] # 獲取不同的值 diff = np.diff(y_pred) distinct_value_indices = np.where(np.diff(y_pred))[0] threshold_idxs = np.r_[distinct_value_indices, y_pred.size - 1] tps = np.cumsum(y_true)[threshold_idxs] fps = np.cumsum((1 - y_true))[threshold_idxs] threshold = y_pred[threshold_idxs] tps = np.r_[0, tps] fps = np.r_[0, fps] tpr = tps / (tps[-1] + 1e-32) fpr = fps / (fps[-1] + 1e-32) return max(np.abs(tpr - fpr)) def predict(self,X): bias = np.zeros([X.shape[0],1]) + self._intercept W = np.zeros_like(X) + self.__coef V = np.zeros_like(X) + self.__v_coef W_X = np.sum(W * X,axis=1).reshape(-1,1) V_x = (np.square(np.sum(V * X,axis=1)) - np.sum(np.square(V*X),axis=1)).reshape(-1,1) / 2 if self.__target.startswith('reg'): return bias + W_X + V_x return self.sigmoid(bias + W_X + V_x) def v_opt(self,X,i): # i 表示第幾列 V = np.zeros_like(X) + self.__v_coef V_opt = np.sum(V * X,axis=1).reshape(-1,1) * X[:,[i]] - np.sum(V[:,[i]] * np.square(X[:,[i]]),axis=1).reshape(-1,1) # 計算關於vi的導數 return V_opt def fit(self,X,y): if isinstance(X,np.ndarray): cols = ['x%s'%(i+1) for i in range(X.shape[1])] elif isinstance(X,pd.core.frame.DataFrame): cols = X.columns else: raise TypeError("input X must be array or dataframe") if isinstance(y,pd.core.series.Series): y = np.array(y).reshape(-1,1) if y.shape == 1: y = y.reshape(-1,1) self.args_init(cols) for _ in range(self.__max_iter): r = self.predict(X) ks = self.calc_ks(y,r) v_opt = {} for s in range(X.shape[1]): v_opt[s] = self.v_opt(X,s) print("ks = ",ks) for j in range(len(X)): if self.__bais: self._intercept -= float(self.__lr * (r[j] -y[j]))+ self.__reg_lambda * self._intercept for i in range(len(cols)): self.__coef[i] -= float(self.__lr * (r[j] - y[j])*(X[j,[i]])) + \ self.__reg_lambda*self.__coef[i] # 正則 for i in range(len(cols)): self.__v_coef[i] -= float(self.__lr * (r[j] - y[j]) * v_opt[i][j]) + \ self.__reg_lambda * self.__v_coef[i] if __name__ == '__main__': from sklearn.datasets import make_moons X,y = make_moons() fm = FM(target='classify') print(type(X)) fm.fit(X,y) from sklearn.linear_model import LogisticRegression lr = LogisticRegression() xx = X[:,[0]] * X[:,[1]] X = np.concatenate([X,xx],axis=1) lr.fit(X, y) pred = lr.predict_proba(X)[:, [1]] print(fm.calc_ks(y, pred))
相關文章
- FM演算法python實現演算法Python
- 4.【Python】分類演算法—Factorization Machine(FM,因子分解機)Python演算法Mac
- python實現冒泡演算法Python演算法
- RSA演算法與Python實現演算法Python
- PageRank演算法概述與Python實現演算法Python
- python實現希爾排序演算法Python排序演算法
- 蟻群演算法原理及其實現(python)演算法Python
- python實現常用五種排序演算法Python排序演算法
- 模擬退火演算法(1)Python 實現演算法Python
- [譯]使用 Python 實現接縫裁剪演算法Python演算法
- 隨機森林演算法原理與Python實現隨機森林演算法Python
- CART演算法解密:從原理到Python實現演算法解密Python
- 用Python實現約瑟夫環演算法Python演算法
- 目標匹配:匈牙利演算法的python實現演算法Python
- 排序演算法原理總結和Python實現排序演算法Python
- 手寫演算法-python程式碼實現Kmeans演算法Python
- python實現常見的五種排序演算法Python排序演算法
- 高斯混合模型(GMM)和EM演算法 —— python實現模型演算法Python
- 八大排序演算法的python實現排序演算法Python
- 社群發現之標籤傳播演算法(LPA)python實現演算法Python
- python基礎之 python實現PID演算法及測試的例子Python演算法
- 基於鄰域粗糙集演算法python實現演算法Python
- 如何使用Python語言實現計數排序演算法?Python排序演算法
- Python程式設計實現蟻群演算法詳解Python程式設計演算法
- python實現Dijkstra演算法之 最短路徑問題Python演算法
- 感知器演算法及其python 實現 V2.0演算法Python
- Python-遺傳演算法君主交叉程式碼實現Python演算法
- 快速理解7種排序演算法 | python3實現(排序演算法Python
- RSA加密演算法簡單介紹以及python實現加密演算法Python
- 用Python寫演算法 | 蓄水池演算法實現隨機抽樣Python演算法隨機
- 利用python的KMeans和PCA包實現聚類演算法PythonPCA聚類演算法
- python實現之 K-means演算法簡單介紹Python演算法
- HMM-維特比演算法理解與實現(python)HMM維特比演算法Python
- python3實現幾種常見的排序演算法Python排序演算法
- 智慧優化演算法——python實現免疫遺傳演算法的影像擬合優化演算法Python
- 7.2 FM Index MatchingIndex
- micropather實現A*演算法演算法
- ARC演算法實現演算法