本文不涉及线性回归的具体原理,只通过python代码实现算法,并且没有用到机器学习库,根据算法流程一步一步实现。
线性回归
加载数据
# 加载数据
def loadData(fileName):
file = open(fileName)
num = len(file.readline().split('\t')) - 1 # 特征的个数
x = [] # 数据
y = [] # 标签
# 遍历每一条数据
for i in file.readlines():
xi =[] # 第i条数据
xif = i.strip().split('\t')
# 第j个特征或标签
for j in range(num):
xi.append(float(xif[j]))
x.append(xi)
y.append(float(xif[-1]))
return x, y
计算直线系数
# 计算直线系数
def regress(x, y):
x = np.mat(x)
y = np.mat(y).T
xTx = x.T * x
# 如果是奇异矩阵
if np.linalg.det(xTx) == 0.0:
return
w = xTx.I * (x.T * y)
return w
绘图
# 绘图
def show(x, y, w):
x = np.mat(x)
y = np.mat(y)
fig = plt.figure()
ax = fig.add_subplot(111)
# 散点图
ax.scatter(x[:, 1].flatten().A[0], y.T[:, 0].flatten().A[0])
x2 = x.copy()
x2.sort(0) # 排序
y_hat = x2 * w # 预测值
ax.plot(x2[:, 1], y_hat) # 直线图
plt.show()
局部加权线性回归
# 局部加权线性回归
def lwlr(p, x, y, k=0.01):
x = np.mat(x)
y = np.mat(y).T
num = np.shape(x)[0] # 数据个数
weights = np.mat(np.eye((num))) # 权重矩阵
for j in range(num):
diff = p - x[j,:]
weights[j,j] = np.exp(diff * diff.T / (-2.0 * k**2))
xTx = x.T * (weights * x)
if np.linalg.det(xTx) == 0.0:
return
ws = xTx.I * (x.T * (weights * y))
return p * ws
岭回归
# 岭回归
def ridgeRegress(x, y, lam=0.2):
xTx = x.T * x
denom = xTx + eye(np.shape(x)[1]) * lam
if np.linalg.det(denom) == 0.0:
return
w = denom.I * (x.T * y)
return w