书上介绍,属于最优化算法,也确实如此,就像怎么工作时间短并且又做得好一样。 主要思想是:根据现有数据对分类边界线建立回归公式,以此分类。因为需要计算距离,需要数值型数据;因为工作原因,挑选的数据需要预测性强、容易获得、容易解读等等,算法的大部分时间用于训练,为了找到最佳的回归系数。
因为个人数学极差,理解公式很费劲,书中的越阶函数其实就是一个分类函数而已,可以根据自己的需要设定阈值,区间在0-1之间,里面有一个因变量,函数值和这个因变相正相关,公式大概长这样:f(x) = 1/1+exp(-z),z = w1x1 + w2x2.......wnxn,w就是我们要求的回归系数,因为每个样本都有既定的分类,假设某个分类样本值是y,那我们想要函数的结果就是和它一毛一样,等于y最好了,不然特别接近也是极好的,也就是y - f(x)接近0,数学上好像叫代价函数,另外怎么求使f(x)接近y的w值呢,数学上叫极大似然估计,意思应该是让上面这个式子成立的最大w值/或者最小,求的方法数学是求偏导数,个人理解这个偏导数像斜率,斜率等于0,正常的话函数曲线上应该就是极值那个点了,书上的代码长这样:
# 剃度上升算法
# 先创建个数据集,每个样本3个特征,最后一个为类别,初始化了第一个为1
def loaddatamet():
datamat = []; labelmat = []
file = open(r'testset.txt')
for line in file.readlines():
linearr = line.strip().split()
datamat.append([1.0, linearr[0], linearr[1])
labelmat.append(linearr[2])
return datamat, labelmat
# 创建sigmoid越阶函数
def sigmoid(inx):
return 1.0 / (1 + exp(-inx))
# 算法代码
def gradascent(dataset, label):
# 将数据集编程矩阵matrix,matrix类似array的子集,不同的是做矩阵乘法的时候,matrix无需调用numpy.dot()直接计算
datamatrix = mat(dataset)
labels = mat(label).transpose()
m, n = shape(datamatrix)
alpha = 0.01
times = 500
weights = ones((n, 1))
for k in times():
h = sigomid(datamatrix * weights)
error = labels - h
# 个人理解datamatrix.transpose()为求偏导后的斜率,所以函数每次计算之后都会按最优方向逼近似然估计值
weights = weights + alpha * datamatrix.transpose() * error
return weights
梯度下降算法也是同一个道理。