梯度下降实现线性回归

单变量即一个特征 n = 1

权重个数 =  n + 一个偏置 = n + 1 

X = [1,x]'   #  变量为 n+1 维向量

W = [w0,w1]'  # 权重为 n+1 维向量

h = w0 + w1 * x = W' * X   #假设函数 

J = 1/(2m) * Σi=1,m (hi - yi)^2   #  损失函数

ΔJ / Δw0 = 1/m * Σi=1,m (hi - yi) # 对 w0 求导 

ΔJ / Δw1 = 1/m * Σi=1,m (hi - yi) * xi # 对 w1 求导

w0 = w0 - a * ΔJ / Δw0  # a 是 学习率, 更新 w0

w1 = w1 - a * ΔJ / Δw1  # a 是 学习率, 更新 w1

 

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import os

# 梯度下降,更新权重
def gradient(X,y,W,a):
    h = np.dot(X,W)
    D = 1 / m * np.dot( (h-y).transpose(),X)
    W = W - a * D.transpose()
    return W

#计算代价函数
def costFunction(X,y,W):
    h = np.dot(X,W)
    J = 1/(2*m) * np.power(h-y,2).sum()
    return J

#数据读取并清洗
def pretreat(file):
    data = pd.read_csv(file,sep=',')
    data.dropna(subset=['x','y'],how='any',axis=0,inplace=True)  # 空值无效删除
    
    #异常值处理
    Q1 = data['x'].quantile(0.25)
    Q3 = data['x'].quantile(0.75)
    IQR = Q3 - Q1
    lowerBound = Q1 - 1.5 * IQR
    upperBound = Q3 + 1.5 * IQR
    data = data[(data['x']>=lowerBound) & (data['x']<=upperBound)]
    
    m = data.shape[0]   # 样本数
    X=np.hstack([np.ones([m,1]),np.transpose( [np.array(data['x']) ])])  # 得到 X
    y = np.array([data['y']]).transpose()    # 得到 y
    
    return X,y


X,y = pretreat('ex1data1.txt')
W = np.random.random([X.shape[1],1]) * 2 * 0.1 - 0.1   #随机产生权重W
a = 0.2   # 指定 学习率,需要调整

for i in range(10):
    W = gradient(X,y,W,a)

 

这数据集只有一个特征,其实无论有几个特征,只是稍微更改一下读取函数pretreat的内容,比如X需要读取多列,而gradient和costFunction无需变动,即同时适用于单变量和多变量线性回归。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值