记得高中的时候就学过线性回归,那个时候就是数学课上最后一个章节,我当时只是了解。没想到线性回归可以用在机器学习领域里,用来做预测模型。
先从单变量线性回归说起。
一个变量决定一个值,当给出多组变量和值组成的数据(x1,y1),(x2,y2),(x3,y3).......现在需要根据这些数据建立一个模型,来预测新给出的变量x对应的那个y值。
比如预测房价,房子的大小就是就是这个变量,房价就是这个要预测的y值。
单变量的预测模型可以这样表示:
多变量预测模型与上面类似:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
好了,模型很简单。现在既然有了模型,那么剩下的工作就是确定theta的值。下面的梯度下降算法就是通过很多样本数据中学习出theta的值来。
算法初始的时候,theta就是可以是任意值。式中i表示第i个样本数据。alpha是学习速率。当单一变量时候,j的取值只有0和1,而所有样本中x0始终为1,x1为样本数据中单变量的值。算法的最终目标是利用上面的式子迭代求得theta0和theta1.
下面是单变量线性回归中的梯度下降算法的Python实现:
__author__ = 'jianyong'
# machine learn ,linear regression,python implemention
import numpy as np
def gradientDescent(X,y,theta,alpha,m,numIterations):
XTrans=X.transpose()
for i in range(0,numIterations):
h=np.dot(X,theta)
loss=h-y
cost=np.sum(loss ** 2)/(2 * m)
print("Iteration %d cost:%f" % (i,cost))
gradient=np.dot(XTrans,loss)/m
theta=theta-alpha*gradient
return theta
# generate some random data
import random
def genData(numPoints,bias,variance):
x=np.zeros(shape=(numPoints,2))
y=np.zeros(shape=numPoints)
for i in range(numPoints):
x[i][0]=1
x[i][1]=i
y[i]=(i+bias)+random.uniform(0,1)*variance
return x,y
x,y=genData(100,25,10)
m,n=np.shape(x)
numIterations=100000
alpha=0.0005
theta=np.ones(n)
theta=gradientDescent(x,y,theta,alpha,m,numIterations)
print(theta)
# plot x,y
import pylab
# pylab.plot(x,y)
pylab.scatter(x[:,1],y)
pylab.plot(x[:,1],x.dot(theta),color='r')
pylab.show()