当前位置:   article > 正文

(西瓜书)多元线性回归代码详解_多元线性回归 迭代求解 代码

多元线性回归 迭代求解 代码
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. def true_fun(X): #因为我们没有样本来训练,所以我们自己生成一些样本,假设true_fun是理想多元线性回归函数y = 1 * x1 + 2 * x2 + 3 * x3 + 0.2
  4. Y = np.dot([1,2,3], X.transpose()) #此时Y = 1 * x1 + 2 * x2 +3 * x3,此处也就等价于矩阵X乘[1,2,3]的转置,Y是一个1*30的一维列表
  5. #print(Y)
  6. x = 0
  7. for x in range(n_sample) :
  8. Y[x] = Y[x] + 0.2
  9. #print(Y)
  10. return Y #此时Y = 1 * x1 + 2 * x2 +3 * x3 + 0.2
  11. np.random.seed(0) # 随机种子
  12. n_sample = 30 # 生成30个样本点
  13. n_feature = 3 #每个样本点有3个属性特征
  14. """生成随机数据作为训练集"""
  15. train_X = np.sort(np.random.rand(n_sample,n_feature)) #生成30个0~1之间的3维向量的列表,作为X矩阵 此时train_X是一个3*30的二维列表(类似二维数组) https://blog.csdn.net/qq_40130759/article/details/79535575
  16. #print(train_X)
  17. data_X = np.array(train_X) # 将data_X变成矩阵形式
  18. train_Y = (true_fun(data_X)+np.random.randn(n_sample) * 0.05).reshape(n_sample,1) # 通过上行的X和理想函数true_fun加上一些小波动得到Y值
  19. #此时我们自己创建的训练集{(Xi1,Xi2,Xi3,Yi)}已创建好了
  20. #print(train_Y)
  21. #print(train_X[0])
  22. m,n = np.shape(data_X) # m,n分别表示行(样本点总个数),列(每个样本包含的特征总个数(此时还不包含数字1)),此时m=30,n=3
  23. #print(m,n)
  24. B = np.ones((m,1)) #构造一个m*1的向量,分量全为1
  25. #print(B)
  26. data_X = np.hstack((data_X,B)) #给矩阵X的最后多加一列全为1的列向量,即把b并入矩阵X和w向量 https://www.cnpython.com/qa/140574
  27. #print(data_X)
  28. maxiter = 4000 # 设置一个迭代的次数(次数越多,学习的越准确)
  29. weights = np.ones((n+1,1)) #初始化权重向量W((n+1)*1的形状),生成n+1个分量w,每个分量均为1,因为W的分量的个数要对应于X中分量的个数,+1是因为上面把b并入矩阵X和w向量 https://blog.csdn.net/cunchi4221/article/details/107471968
  30. #print(weights)
  31. alpha = 0.01 # 学习率
  32. for i in range(0,maxiter):
  33. hypothesis = np.dot(data_X,weights) # 此值为实际值f(Xi) dot(矩阵1,矩阵2)是矩阵(向量)乘法运算函数 https://www.jb51.net/article/178703.htm
  34. error = (hypothesis - train_Y) # 误差向量=实际值f(Xi)-真实值yi (此向量的分量相加就是总误差)
  35. gradient = data_X.transpose().dot(error) #求梯度 data_X.transpose()表示对矩阵data_X的转置,再.dot(error)表示转置后的矩阵与error向量相乘
  36. #以上3行为求解损失函数对w向量的梯度,由西瓜书p55公式(3.10)得来!!!推导过程见西瓜书p55
  37. weights = weights - alpha * gradient #根据公式更新W向量
  38. print("输出参数w:",weights[0:n]) #前n个数是w
  39. print("输出参数b:",weights[n]) #最后一个数(第n+1个数)是b

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/354708
推荐阅读
相关标签
  

闽ICP备14008679号