(西瓜书)一元线性归回代码详解

import numpy as np
import matplotlib.pyplot as plt

def true_fun(X):    #因为我们没有样本来训练,所以我们自己生成一些样本,假设true_fun是理想线性回归函数
    return 1.5 * X + 0.2

np.random.seed(0) # 随机种子
n_sample = 30 # 生成30个样本点
"""生成随机数据作为训练集"""
train_X = np.sort(np.random.rand(n_sample)) #生成30个0~1之间的随机数的列表,作为X  此时train_X是一个1*30的二维列表(类似二维数组)https://blog.csdn.net/qq_40130759/article/details/79535575
train_Y = (true_fun(train_X)+np.random.randn(n_sample) * 0.05).reshape(n_sample,1) # 通过上行的X和理想函数true_fun加上一些小波动得到Y值
#此时我们自己创建的训练集{(Xi,Yi)}已创建好了


data_X = []
for x in train_X: #对二维列表循环取x,x是一个数字而非一维列表!
    data_X.append([1,x]) #给每个一维X向量加个分量1,方便后面多元回归时将b并入X0 * w0,即 1 * b
#此时data_X列表的内容形如[[1, 0.02021839744032572],[1, 0.08712929970154071]...],即是一个30行2列的矩阵
data_X = np.array(data_X) # 将data_X变成矩阵形式,形如[[1, 0.02021839744032572]
#                                                  [1, 0.08712929970154071]
#                                                  ...]
m,n = np.shape(data_X) # m,n分别表示行(样本点总个数),列(每个样本包含的特征总个数(包含数字1)),此时m=30,n=2


maxiter = 400 # 设置一个迭代的次数(次数越多,学习的越准确)
weights = np.ones((n,1)) #初始化权重向量W(n*1的形状),生成n个分量w,每个分量均为1,因为W的分量的个数要对应于X中分量的个数  https://blog.csdn.net/cunchi4221/article/details/107471968
#print(weight)
alpha = 0.01 # 学习率
for i in range(0,maxiter):
    hypothesis = np.dot(data_X,weights) # 此值为实际值f(Xi)    dot(矩阵1,矩阵2)是矩阵(向量)乘法运算函数 https://www.jb51.net/article/178703.htm
    error = (hypothesis - train_Y) # 误差向量=实际值f(Xi)-真实值yi (此向量的分量相加就是总误差)
    gradient = data_X.transpose().dot(error) #求梯度  data_X.transpose()表示对矩阵data_X的转置,再.dot(error)表示转置后的矩阵与error向量相乘
    #以上3行为求解损失函数对w向量的梯度,由西瓜书p55公式(3.10)得来!!!推导过程见西瓜书p55
    weights = weights - alpha * gradient #根据公式更新W向量
print("输出参数w:"+str(weights[1:]))
print("输出参数b:",weights[0])

 (西瓜书)一元线性归回代码详解_第1张图片

 

(西瓜书)一元线性归回代码详解_第2张图片 

 

你可能感兴趣的:(线性代数,机器学习,sklearn)