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.html
2) 最小二乘法:核心思想是 平方误差之和最小 具体推导过程: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()