吴恩达机器学习作业python实现--多变量线性回归

多变量线性回归

代价函数
J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J\left( \theta \right)=\frac{1}{2m}\sum\limits_{i=1}^{m}{ { {\left( { {h}_{\theta }}\left( { {x}^{(i)}} \right)-{ {y}^{(i)}} \right)}^{2}}} J(θ)=2m1i=1m(hθ(x(i))y(i))2
假设函数
h θ ( x ) = θ T X = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n { {h}_{\theta }}\left( x \right)={ {\theta }^{T}}X={ {\theta }_{0}}{ {x}_{0}}+{ {\theta }_{1}}{ {x}_{1}}+{ {\theta }_{2}}{ {x}_{2}}+...+{ {\theta }_{n}}{ {x}_{n}} hθ(x)=θTX=θ0x0+θ1x1+θ2x2+...+θnxn

# 同单变量线性回归一样,加一列全1,为了和theta0求积,否则无法对应起来
data2 = data2_0
data2.insert(0, 'Ones', 1)# insert第一个参数是插入的列的位置,第二个参数是列名,第三个参数是value

# 特征变量和目标变量的个数获取
cols = data2.shape[1] #获取列数,及有多少个变量,包含特征变量和预测变量
X2_0 = data2.iloc[:,0:cols-1] #取前面所有列
y2_0 = data2.iloc[:,cols-1:cols] #取最后一列,减1的原因是索引是从0排起来的

# theta初始化,并将数据矩阵化
X2 = np.matrix(X2_0.values)   #直接写np.mat(x2_0)也是阔以滴
y2 = np.matrix(y2_0.values)   
theta2 = np.matrix(np.array([0,0,0]))   #直接写np.mat([2,2,2])也是一样滴
#为了多变量适用,不用每次数着特征变量来写,theta初始化的赋值可以写成
#其中-1是代表只要该矩阵前面是一行就行,列随总数除以行数来算,如果有强迫症不喜欢浮点型,此处astype可以变成整型
theta2 = np.mat(np.zeros(cols-1)).reshape(1,-1).astype(int)

'''
此例中的theta应该为3个值,第一个就是常数项,第二、三个为后面两个自变量的权重,
因此可以写成
h(theta) = theta0*x1 + theta1*x2 + theta2*x3  其中x1=1
那么同单变量线性回归一样,我们需要先去计算代价函数cost
为啥要算代价函数呢,因为要根据代价函数利用梯度下降算法算局部最优解的theta数组,
下面先实现cost函数的计算
'''
#cost函数
def computeCost(X, y, theta):
    # 返回代价函数
    tmp = np.power((X*theta.T -y),2)
    return np.sum(tmp)/(2*len(X))
'''
为啥这么算呢,因为代价函数的矩阵化公式就是特征量矩阵 叉乘 theta向量的转置 再减去 目标向量 ,将其中每个元素求和再求均值即可
那下面再次写一遍梯度下降算法
'''
#梯度下降
def gradientDescent(X,y,theta,alpha,iters):
    
    theta_cn = theta.shape[1]  #不用len()是因为theta2是矩阵,返回的是1
    N = len(X)  #样本容量
    cost = np.zeros(iters)  #用来存每次迭代后计算的代价函数
    temp = np.mat(np.zeros(theta.shape))  #用来传临时theta2,后面做递归用
    
    for i in range(iters):
        error = (X*theta.T-y)
        for j in range(theta_cn):
            term = np.multiply(error,X[:,j])
            temp[0,j] = theta[0,j] -(alpha/len(X)*np.sum(term))
        # 把temp的两个值其实也就是theta0、theta1传给theta,再计算第i次迭代出来的代价函数的值    
        theta = temp
        cost[i] = computeCost(X, y, theta)
    return theta, cost

alpha = 0.01
iters = 1000
# 导出theta数组和cost数组
g2, cost2 = gradientDescent(X2, y2, theta2, alpha, iters)

# 计算模型最后一次迭代的代价函数值
computeCost(X2, y2, g2)

#观看cost函数下降趋势
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(np.arange(iters), cost2, 'r')
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')
plt.show()

你可能感兴趣的:(机器学习算法代码实现,python,算法,机器学习)