1. 线性回归
核心公式:
w = (XX)XY
流程伪代码:
读入数据,将数据特征x、特征标签y存储在矩阵x、y中 验证 x^Tx 矩阵是否可逆 使用最小二乘法求得 回归系数 w 的最佳估计
核心代码:
1 def standRegres(xArr, yArr): 2 xMat = mat(xArr) 3 yMat = mat(yArr).T 4 # 矩阵乘法的条件是左矩阵的列数等于右矩阵的行数 5 xTx = xMat.T * xMat 6 # 因为要用到xTx的逆矩阵,所以事先需要确定计算得到的xTx是否可逆,条件是矩阵的行列式不为0 7 # linalg.det() 函数是用来求得矩阵的行列式的,如果矩阵的行列式为0,则这个矩阵是不可逆的,就无法进行接下来的运算 8 if linalg.det(xTx) == 0.0: 9 print("This matrix is singular, cannot do inverse") 10 return 11 # 最小二乘法 12 # 求得w的最优解 13 ws = xTx.I * (xMat.T * yMat) 14 return ws
2. 局部加权线性回归
(就是中间乘上权值W)
核心公式:
参数w = (XWX)XWY
权值Wi = exp( ||xi - x|| / ( -2*k) )
流程伪代码:
读入数据,将数据特征x、特征标签y存储在矩阵x、y中 利用高斯核构造一个权重矩阵 W,对预测点附近的点施加权重 验证 X^TWX 矩阵是否可逆 使用最小二乘法求得 回归系数 w 的最佳估计
核心代码:
1 def lwlr(testPoint, xArr, yArr, k=1.0): 2 xMat = mat(xArr) 3 yMat = mat(yArr).T 4 # 获得xMat矩阵的行数 5 m = shape(xMat)[0] 6 # eye()返回一个对角线元素为1,其他元素为0的二维数组,创建权重矩阵weights,该矩阵为每个样本点初始化了一个权重 7 weights = mat(eye((m))) 8 for j in range(m): 9 # testPoint 的形式是 一个行向量的形式 10 # 计算 testPoint 与输入样本点之间的距离,然后下面计算出每个样本贡献误差的权值 11 diffMat = testPoint - xMat[j, :] 12 # k控制衰减的速度 13 weights[j, j] = exp(diffMat * diffMat.T / (-2.0 * k ** 2)) 14 # 根据矩阵乘法计算 xTx ,其中的 weights 矩阵是样本点对应的权重矩阵 15 xTx = xMat.T * (weights * xMat) 16 if linalg.det(xTx) == 0.0: 17 print("This matrix is singular, cannot do inverse") 18 return 19 # 计算出回归系数的一个估计 20 ws = xTx.I * (xMat.T * (weights * yMat)) 21 return testPoint * ws