线性回归
矩阵X存放输入数据,矩阵w存放回归系数。误差是预测y值和真实y值的差值平方,最佳拟合曲线曲线就是误差最小的曲线。
公式
平法误差
回归系数
示例:标准回归函数
(1) 导入数据函数
def loadDataSet(filename):
fr = open(filename,'r')
NumFea = len(fr.readline().strip().split('\t')) -1
dataMat = []
labelMat = []
for line in fr.readlines():
lineArr = []
curLine = line.strip().split('\t')
for i in range(NumFea):
lineArr.append(float(curLine[i]))
dataMat.append(lineArr)
labelMat.append(float(curLine[-1]))
return dataMat,labelMat
xArr,yArr = loadDataSet('./ex0.txt')
(2) 标准回归函数
def standRegres(xArr,yArr):
xMat = np.mat(xArr)
yMat = np.mat(yArr).T
xTx = xMat.T * xMat
if np.linalg.det(xTx) == 0:
print("This matrix is singular,cannot do inverse")
return
ws = xTx.I *(xMat.T * yMat)
return ws
ws = standRegres(xArr,yArr)
(3) 评价模型好坏
xMat = np.mat(xArr)
yMat = np.mat(yArr)
yHat = xMat * ws
yHat
np.corrcoef(yHat.T,yMat)
示例:局部加权线性回归
适用情况
线性回归欠拟合现象。给待预测点附近的每个点赋予一定的权重。
公式
回归系数
权重
def lwlr(testPoint,xArr,yArr,k = 1.0):
xMat = np.mat(xArr)
yMat = np.mat(yArr).T
row = xMat.shape[0]
weight = np.mat(np.eye((m)))
for i in range(row):
diffMat = testPoint - xMat[i,:]
weight[i,i] = np.exp((diffMat * diffMat.T)/ (-2 * k ** 2))
xTx = xMat.T * (weight * xMat)
if np.linalg.det(xTx) == 0 :
print("This matrix is singular,cannot do inverse")
return
ws = xTx.I * (xMat.T * (weight * yMat))
return testPoint * ws
def lwlrTest(testArr,xArr,yArr,k = 1.0):
row = xArr.shape[0]
yHat = np.zeros(row)
for i in range(row):
yHat[i] = lwlr(testArr[i],xArr,yArr,k)
return yHat
示例: 岭回归
适用情况
数据的特征比样本点多。
公式
回归系数
是一个用户定义的数值;
是一个mxm的矩阵,对角线上元素全为1,其他元素全为0。
(1) 计算回归系数
def ridgeRegres(xMat,yMat,lam=0.2):
xTx = xMat.T * xMat
denom = np.eye((xMat.shape[1])) * lam + xTx
if np.linalg.det(denom) == 0:
print("This matrix is singular,cannot do inverse")
return
ws = denom.I * (xMat.T * yMat)
return ws
(2) 测试
def ridgeTest(xArr,yArr):
xMat = np.mat(xArr)
yMat = np.mat(yArr).T
yMean = np.mean(yMat,0)
yMat = yMat - yMean
xMean = np.mean(xMat,0)
xVar = np.var(xMat,0)
xMat = (xMat - xMean) / xVar
TestTime = 30
wMat = np.zeros((TestTime,xMat.shape[1]))
for i in range(TestTime):
ws = ridgeRegres(xMat,yMat,exp(i - 10))
wMat[i,:] = ws.T
return wMat