转载链接:http://blog.youkuaiyun.com/nlp_zcchen/article/details/17381823
这个算法原作者意思是在NLP中面对高维向量和数据稀疏时效果会不错,算法保持了当前预测向量w的均值和方差,并做优化。代码实现如下:
-
- def get_phi():
- ''
- import numpy as np
- from scipy import stats
- eta = float(raw_input("please input confidence parameter between (0 1)\n"))
- X = stats.norm(0.0,1.0)
- phi = X.ppf(eta)
- return phi
-
- def get_data_size(datafile):
- f = open(datafile)
- size = f.readline().strip().split()
- f.close()
- return len(size)
-
- def dot(X,Y):
- sum = 0
- for (x,y) in zip(X,Y):
- sum += x*y
- return sum
- def mul(X,Y):
- Z = []
- for (x,y) in zip(X,Y):
- Z.append(x*y)
- return Z
- def plus(X,Y):
- Z = []
- for (x,y) in zip(X,Y):
- Z.append(x+y)
- return Z
-
- def opp(X):
- Y = []
- for x in X:
- Y.append(1/x)
- return Y
- def init_u_E(datafile):
-
-
-
- phi = get_phi()
-
- a = float(raw_input("initial variance parameter a \n"))
- size = get_data_size(datafile)
- u = []
- E = []
- for i in range(size-1):
- u.append(0)
- E.append(a)
- return u,E,phi
- def CWL(datafile,u,E,phi = 0.8):
- ''
- import math
- for line in open(datafile):
- Y_X_str = line.strip().split()
- Y_X = [float(t) for t in Y_X_str]
- X = Y_X[1:]
- Y = Y_X[0]
- Mi = Y*dot(X,u)
- Vi = dot(X,mul(X,E))
- Ri = (-1-2*phi*Mi+float(math.sqrt((1+2*phi*Mi)*(1+2*phi*Mi)-8*phi*(Mi-phi*Vi))))/(4*phi*Vi)
- alpha = max(Ri,0)
- dlt_u = [alpha*Y*x for x in mul(E,X)]
- u = plus(u,dlt_u)
- dlt_E = [ 2*alpha*phi*x for x in mul(X,X)]
- E = opp(plus(opp(E),dlt_E))
- return u,E
-
-
- u,E,phi = init_u_E("data")
- for i in range(10000):
- u,E = CWL("data",u,E,phi)
- print u
- print E
- print dot(u,[0,1,0])
数据类型为
1 0 0 1
-1 0 1 0
第一列为准确的类型,后面是feature set。
两个参数,phi是对于当前预测的置信度,即当预测的概率大于phi时才做预测(代码中预设为0.8),alpha为初始预测向量w的方差(预设为1)
测试效果不定,手写了7组数据,5个是可以判断正确的
还有一部分是对于有多个label时设计的算法,multi-class CW。这里是假设存在一个feature function将当前x和一个lable映射为一个值,即f(x,y),那么在算法实际过程中,利用这个值来对所有的label进行一个排序,那么将产生K个(K为label总数)限制条件(在binary classify中只有一个限制条件),算法再根据这K个条件做取舍决定最后的参数更新值(原文中有几种不同的更新方法)。
参考文献 confidence weighted linear classification by Mark Dredze,Koby Crammer
Multii-class confidence weighted algoritms