单变量即一个特征 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无需变动,即同时适用于单变量和多变量线性回归。