线性回归:
优点:结果易于理解,计算上不复杂
缺点:对非线性的数据拟合不好
适用数据类型:数值型和标称型数据
回归的目的是预测数值型的目标值.(求解回归系数的过程叫回归)
最佳拟合直线:将数据视为直线进行建模,但是数据可能还存在其他潜在的模式.
import numpy 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) : '''
计算最佳拟合直线
输入:x和y
输出:回归系数
'''xMat = numpy.mat(xArr)#将输入值保存到矩阵中yMat = numpy.mat(yArr).T xTx = xMat.T * xMat
if numpy.linalg.det(xTx) == 0 : #判断行列式是否为0,若为零,则不能求逆print "This matrxi is singular, connot do inverse"
return ws = xTx.I * (xMat.T * yMat) return ws xArr,
yArr = loadDataSet('ex0.txt ') ws = standRegres(xArr, yArr) print xArr[0 : 2] print ws xMat = numpy.mat(xArr) yMat = numpy.mat(yArr) yHat = xMat * ws print numpy.corrcoef(yHat.T, yMat)#numpy提供的相关系数计算函数'
局部加权线性回归:线性回归求的是最小均方误差的无偏估计,可能出现欠拟合的现象,所以可以考虑引入一些偏差.LWLR 用 "核" 来对附近的点赋予更高的权重.与 KNN 一样,该加权模型认为样本点距离越近,越可能符合同一个线性模型.
def lwlr(testPoint, xArr, yArr, k = 1.0) : '''
给定空间中的任意一点,计算出对应的预测值yHat
'''xMat = numpy.mat(xArr) yMat = numpy.mat(yArr).T m = numpy.shape(xMat)[0] weights = numpy.mat(numpy.eye(m))#权重矩阵是一个方阵,阶数等于样本点个数,该矩阵为每一个样本点初始化一个权重
for j in range(m) : diffMat = testPoint - xMat[j, :] weights[j, j] = numpy.exp(diffMat * diffMat.T / ( - 2.0 * k * *2))#计算每一个样本点对应的权重#随着样本点与待预测点距离的递增,权重将以指数级衰减xTx = xMat.T * (weights * xMat) if numpy.linalg.det(xTx) == 0.0 : print "This matrix is singular, cannot do inverse"
return ws = xTx.I * (xMat.T * (weights * yMat)) return testPoint * ws def lwlrTest(testArr, xArr, yArr, k = 1.0) : m = numpy.shape(testArr)[0] yHat = numpy.zeros(m) for i in range(m) : yHat[i] = lwlr(testArr[i], xArr, yArr, k) return yHat'
局部加权线性回归可以达到不错的预测效果,但是增加了计算量,对每个点做预测是都必须用到整个数据集.
回归还是很好理解,无非就是运用数学计算公式来提升效能.(目前是这样理解的.)
来源: http://lib.csdn.net/article/machinelearning/36343