一、基础知识准备:
1.线性回归:
1) 统计回归分析的任务:
根据x1,x2,x3,...,xp
和观察值Y
,去估计函数f
,寻求变量之间近似的函数关系2) 参数回归 & 线性回归:
我们常用的是,假定f
函数的数学形式已知,其中若干个参数未知,要通过自变量和因变量的观察值去估计未知的参数值。这叫“参数回归”。其中应用最广泛的是f
为线性函数的假设:
f(x1,x2,x3,...,xp)=b0+b1x1+b2x2+...+bpxp
这种情况叫做“线性回归”3) 一元线性回归 & 多元线性回归:
自变量只有一个时,叫做一元线性回归
hθ(x)=θ0+θ1x
自变量有 多个时,叫做多元线性回归
hθ(x)=θ0+θ1x1+θ2x2+...+θmxm(x0=1)
可简化为:hθ(x)=∑i=0mθixi4)分类(Classification) &回归(Regression):
共同点:都属于监督学习
区别:
– 分类用于预测有限的离散值,如是否得了癌症(0,1)
或手写数字的判断,是0,1,2,3,4,5,6,7,8还是9等。分类中,预测的可能的结果是有限的,且提前给定的。
– 回归:用于预测实数值(连续值),如给定了房子的面积,地段,和房间数,预测房子的价格。
2.求解线性回归的方法:
1)
梯度下降法:
主要思想是,函数在沿着其梯度方向增加最快的,那么要找到该函数的最小值,可以沿着梯度的反方向来迭代寻找。也就是说,给定一个初始位置
后,寻找当前位置函数减小最快的方向
,加上一定步长
即可到达下一位置
,然后再寻找下一位置最快的方向
来到达再下一个位置……,直至其收敛
这个可以参考coursera的《machine learning》课程中的讲解和一些blog:
http://www.cnblogs.com/fanyabo/p/4060498.html
http://www.cnblogs.com/jcchen1987/p/4401533.html
http://blog.sina.com.cn/s/blog_68c81f3901019hhp.html2)
最小二乘法:
核心思想是平方误差之和最小
具体推导过程:http://www.cnblogs.com/fanyabo/p/4060498.html
推导结果:
θ=(XTX)−1XTy⃗3)
其他方法暂时未接触到,待补充
3 局部线性回归:
引入
高斯核
,用于解决线性回归的过拟合现象
高斯核权重公式:
ω(i,j)=exp(∣∣x(i)−x∣∣−2k2)
其中,x(i)为高斯分布的中心位置(x离x(i)越近,权重越大);k为高斯分布的范围(平坦程度,k越大,曲线分布范围越广,越平坦)
4.算法代码及注释:
from numpy import *
#打开一个用Tab键分割的文本文件(默认文件每行的最后一个值是目标值)
#返回文本文件所包含的数据集合、特征标签信息
def loadDataSet(filename):
numFeat = len(open(filename).readline().split('\t')) -1
dataMat =[]
labelMat = []
fr = open(filename)
for line in fr.readlines():
lineArr = []
curLine = line.strip().split('\t')
for i in range(numFeat):
lineArr.append(float(curLine[i]))
dataMat.append(lineArr)
labelMat.append(float(curLine[-1]))
return dataMat,labelMat
#根据"最小二乘法"公式计算最佳拟合曲线
def standRegres(xArr,yArr):
xMat = mat(xArr)
yMat = mat(yArr).T
xTx = xMat.T * xMat
if linalg.det(xTx) == 0.0: #当矩阵的行列式等于0,矩阵不可逆
print "This matrix is singular, cannot do inverse"
ws = xTx.I * (xMat.T * yMat)
return ws
#局部加权线性回归函数(LWLR)
def lwlr(testPoint,xArr,yArr,k=0.0):
xMat = mat(xArr)
yMat = mat(yArr).T
m = shape(xMat)[0]
weights = mat(eye(m))
for j in range(m):
diffMat = testPoint - xMat[j,:]
weights[i,j] = exp(diffMat *diffMat.T/(-2.0*k**2)) #高斯核
xTx = xMat.T * (weights * xMat)
if linalg.det(xTx) ==0.0:
print "This matrix is singular, cannot do inverse"
ws = xTx.I * (xMat.T * (weights * yMat))
return testPoint * ws
#统计回归误差,便于对比
def resError(yArr,yHatArr):
return ((yArr - yHatArr)**2).sum()