机器学习实战笔记(4) 线性回归的形象理解和实现
越来越感觉到这个实战就是只实战无理论描述,对算法的原理描述翻译过来后,对新手而言简直是天书,不知道在说什么。
相比而言,线性回归就是纯数学的内容么。千万不要一开始就搞个:
f(x)= X1*W1+ X2*W2+ X3*W3+ X4*W4+ X5*W5…………………….+ Xn*Wn
这样直接就把大家给搞晕了。我们从最简单的实例讲起。
一个数据集:x, y, 就是二维横竖坐标数据如下:
-0.017612 14.053064 0
-1.395634 4.662541 1
-0.752157 6.538620 0
-1.322371 7.152853 0
0.423363 11.054677 0
0.406704 7.067335 1
0.667394 12.741452 0
-2.460150 6.866805 1
0.569411 9.548755 0
-0.026632 10.427743 0
0.850433 6.920334 1
1.347183 13.175500 0
1.176813 3.167020 1
-1.781871 9.097953 0
-0.566606 5.749003 1
0.931635 1.589505 1
-0.024205 6.151823 1
-0.036453 2.690988 1
-0.196949 0.444165 1
1.014459 5.754399 1
1.985298 3.230619 1
-1.693453 -0.557540 1
-0.576525 11.778922 0
-0.346811 -1.678730 1
-2.124484 2.672471 1
1.217916 9.597015 0
-0.733928 9.098687 0
-3.642001 -1.618087 1
0.315985 3.523953 1
1.416614 9.619232 0
-0.386323 3.989286 1
0.556921 8.294984 1
1.224863 11.587360 0
-1.347803 -2.406051 1
1.196604 4.951851 1
下面的描述不是最严谨的数学描述,是我自己的形象的理解阐述。
自然的数据,从图上看,是分为2类。我们的目标就是能找到个直线, 方程为y=W1*X+w0使得所有的点,都尽可能的被这个方程描述, 也就是尽可能使得多数点能被这个直线覆盖,就算不覆盖,也是距离直线最近,模拟的误差最小。 就是最大程度拟合。
换个说法就是: 使得所有的点到这个直线的距离的和最小! 找到了这个直线,就是找到了分类线,正好把数据分开成了2个部分。
对于二维,也就是2个属性的数据而言,就是找到:
X1*W1+ X2*W2+W0的三个W, 使得所有的点对于这个表达式的方差和最小(先这么描述)。 后面就简单了,我们用各种方法来计算出w1, w2,w0.
下面是梯度下降法计算加权系数的过程: 通过迭代逐步逼近。
def gradAscent(dataMatIn, classLabels):
dataMatrix =mat(dataMatIn) #convert toNumPy matrix
printdataMatrix
labelMat =mat(classLabels).transpose() #convert to NumPy matrix
m,n =shape(dataMatrix)
print m
alpha = 0.001
maxCycles =500
weights =ones((n,1))
printweights
raw_input()
for k inrange(maxCycles): #heavy onmatrix operations
h =sigmoid(dataMatrix*weights) #matrixmult
error =(labelMat - h) #vectorsubtraction
weights= weights + alpha * dataMatrix.transpose()* error #matrix mult
print'The times =',k, weights
returnweights
实际的迭代计算:
The times = 484 [[ 4.07215754] [ 0.47561373] [-0.61030406]]
The times =487 [[ 4.08264236] [ 0.47651513] [-0.61162363]]
The times = 489 [[ 4.08960765] [ 0.4771134 ][-0.61381089]]
多元是二元的扩展,不过无法用平面图表示相互关系。如果是三维,我们是在求一个平面,使得所有的点到平面的距离和最小。四维?五维? 应该是一个曲面?不规则面?
总之就是为了找到这么一个分界线,能把不同类别的数据分开。其实这不就是最简单的神经元么? 换另外的一个说法,就是找到一条直线,让这些二维点投影到这个直线上,分成2堆! 就实现了分类! 就是把平面的散乱信息聚焦在直线上,通过转换后来分类!!!很朴素巧妙的方法。
迭代的算法严重影响计算量, 随机梯度上升法能大幅度降低计算量。
下面是一个多属性计算过程中迭代的过程:一个21个属性
The times = 172
[16.1160147 -1.99312061 1.51462451 -0.70880541 0.87447763
-5.25576974 4.86169641 -7.15113487 -6.45990601 -9.42296601
21.69785121 -23.98706034 27.93038626 10.95943526-11.73911474
3.45773292 -4.21967754 0.14068649 0.18581999 -6.1845376
-1.89375417]
从本书的例子看, 准确率达到了80%左右。不知道算好坏?
上面说的过于简单但是还算形象。如何知道这样的一条直线 ,满足各个点到它的距离最近, 有最小一乘法(算距离绝对值之和,计算量巨大不合适)和二乘法(算误差的平方,均方差,这个方便用循环来,计算量小)
W系数算出来后,就可以带入各个属性x1, x2, x3....那么Z就是分类值了, 正数的都是上面的点,负数都是下面的点,然后通过一个阶跃函数就完成了分类。