赞
踩
- import numpy as np
- import matplotlib.pyplot as plt
-
- def true_fun(X): #因为我们没有样本来训练,所以我们自己生成一些样本,假设true_fun是理想多元线性回归函数y = 1 * x1 + 2 * x2 + 3 * x3 + 0.2
- Y = np.dot([1,2,3], X.transpose()) #此时Y = 1 * x1 + 2 * x2 +3 * x3,此处也就等价于矩阵X乘[1,2,3]的转置,Y是一个1*30的一维列表
- #print(Y)
- x = 0
- for x in range(n_sample) :
- Y[x] = Y[x] + 0.2
- #print(Y)
- return Y #此时Y = 1 * x1 + 2 * x2 +3 * x3 + 0.2
-
- np.random.seed(0) # 随机种子
- n_sample = 30 # 生成30个样本点
- n_feature = 3 #每个样本点有3个属性特征
- """生成随机数据作为训练集"""
- 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
- #print(train_X)
- data_X = np.array(train_X) # 将data_X变成矩阵形式
- train_Y = (true_fun(data_X)+np.random.randn(n_sample) * 0.05).reshape(n_sample,1) # 通过上行的X和理想函数true_fun加上一些小波动得到Y值
- #此时我们自己创建的训练集{(Xi1,Xi2,Xi3,Yi)}已创建好了
- #print(train_Y)
- #print(train_X[0])
-
-
-
- m,n = np.shape(data_X) # m,n分别表示行(样本点总个数),列(每个样本包含的特征总个数(此时还不包含数字1)),此时m=30,n=3
- #print(m,n)
- B = np.ones((m,1)) #构造一个m*1的向量,分量全为1
- #print(B)
- data_X = np.hstack((data_X,B)) #给矩阵X的最后多加一列全为1的列向量,即把b并入矩阵X和w向量 https://www.cnpython.com/qa/140574
- #print(data_X)
-
-
-
- maxiter = 4000 # 设置一个迭代的次数(次数越多,学习的越准确)
- 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
- #print(weights)
- 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:",weights[0:n]) #前n个数是w
- print("输出参数b:",weights[n]) #最后一个数(第n+1个数)是b
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。