任务5附录
一、定义线性回归模型
def h(theta, X):
#定义模型函数
return np.dot(X, theta) # 此时的X为处理后的X
二、定义损失函数
这里依然采用均方误差。
def J(theta, X, Y):
#定义代价函数,均方误差
m = len(X)
return np.sum(np.dot((h(theta,X)-Y).T, (h(theta,X)-Y))/(2 * m))
三、梯度下降更新过程
def bgd(alpha, X, Y, maxloop, epsilon):
'''定义梯度下降函数'''
m, n = X.shape
theta = np.zeros((n,1)) #初始化参数为0
count = 0 # 记录迭代次数
converged = False # 是否已收敛的标志
cost = np.inf # 初始化代价值为无穷大
costs = [J(theta, X, Y),] # 记录每一次的代价值
thetas = {} # 记录每一次参数的更新
for i in range(n):
thetas[i] = [theta[i,0],]
while count <= maxloop:
if converged:
break
count += 1
theta = theta - alpha * 1.0 / m * np.dot(X.T, (h(theta, X) - Y))
#添加到thetas中
for j in range(n):
thetas[j].append(theta[j,0])
# 记录当前参数的函数代价,并存入costs
cost = J(theta, X, Y)
costs.append(cost)
if abs(costs[-1] - costs[-2]) < epsilon:
converged = True
#print(theta)
return theta, thetas, costs
四、开始训练
调用上述数据标准化函数,设置训练过程中的学习率、最大迭代次数、误差阈值,开始训练,然后输出模型参数。
Y =np.array(lgY).reshape(-1,1)
X, values=standarize(np.array(lgX).copy())
m, n = X.shape
X = np.concatenate((np.ones((m,1)), X), axis=1) # 将第一列为1的矩阵,与原X相连,m行一维值为1扩充到X
print(X.shape, Y.shape)
alpha = 0.1 # 学习率
maxloop = 2000 # 最大迭代次数
epsilon = 0.01 # 收敛判断条件
result = bgd(alpha, X, Y, maxloop, epsilon)
theta, costs, thetas = result # 最优参数保存在theta中,costs保存每次迭代的代价值,thetas保存每次迭代更新的theta值
print('模型参数theta如下:\n',theta)
# 到此,参数学习出来了,模型也就定下来了
运行结果:
(63, 5) (63, 1)
模型参数theta如下:
[[685.39761904]
[-59.66223869]
[-36.71790432]
[ -5.6123785 ]
[350.28414739]]
五、模型预测
使用线性回归模型,对任意特征的乐高玩具进行价格预测。
#实例预测,比如乐高年限、套装数量、是否全新、原价是(2009、3200、0、250),预测售价
lg_year=2009
lg_num=3100
lg_new=0
lg_oricost=250.0
normalized1 = (lg_year-values[0][0])/values[0][1]
normalized2 = (lg_num-values[1][0])/values[1][1]
normalized3 = (lg_new-values[2][0])/values[2][1]
normalized4 = (lg_oricost-values[3][0])/values[3][1]
predicateX = np.matrix([[1, normalized1,normalized2,normalized3,normalized4]])
print('2009年的乐高、套装数量3200、非全新、原价是250,预测售价为:',h(theta, predicateX))
运行结果:
2009年的乐高、套装数量3200、非全新、原价是250,预测售价为: [[446.11336434]]