python实现线性回归

本文不涉及线性回归的具体原理,只通过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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值