机器学习实战笔记(4) 形象线性回归的理解和实现

来源:互联网 发布:logo编程软件 编辑:程序博客网 时间:2024/05/20 07:37

机器学习实战笔记(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就是分类值了, 正数的都是上面的点,负数都是下面的点,然后通过一个阶跃函数就完成了分类。

阅读全文
0 0
原创粉丝点击