多变量线性回归

数据下载:

链接:https://pan.baidu.com/s/1GFVuNcF3iM3rIhbZd9lgfQ
提取码:d0zk

主程序:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import cost_function
import gd_function

path = "ex1data2.txt"
data2 = pd.read_csv(path, names=["size", "bedrooms", "price"])
data2 = (data2 - data2.mean()) / data2.std()
# data2.head()
data2.insert(0, "Ones", 1)  # 在训练集中插入一列1,方便计算
# set X(training set), y(target variable)
# 设置训练集X,和目标变量y的值
cols = data2.shape[1]  # 获取列数
x = data2.iloc[:, 0:cols - 1]  # 输入向量X为前cols-1列
y = data2.iloc[:, cols - 1:cols]  # 目标变量y为最后一列
x = np.array(x.values)
y = np.array(y.values)
theta = np.array([[0, 0, 0]])
gd_function.gra_des(x, y, theta, 0.01, 1000)
final_theta, cost = gd_function.gra_des(x, y, theta, 0.01, 1000)
final_cost = cost_function.compute_cost(x, y, final_theta)
print(final_theta)
print(final_cost)


# 由于梯度下降过程中每一次迭代都会得到一个cost值,下面我们根据cost的值来绘制图像。
# 我们通常使用绘制cost图像的方式来观测梯度下降算法是否正常的运行,
# 若是算法运行正常,该图像会一直下降
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(np.arange(0, 1000,), cost, "r")
ax.set_xlabel("Iterations")
ax.set_ylabel("Cost")
ax.set_title("Error vs Traning iterations")
plt.show()

由于代价函数和梯度下降函数不在主程序中,下面是两个单独函数的代码:

import numpy as np


def compute_cost(x, y, theta):
    inner = np.power(x.dot(theta.T) - y, 2)  # 后面的2表示2次幂
    return sum(inner) / (2 * len(x))


import numpy as np
import cost_function


def gra_des(x, y, theta, alpha, epoch):
    temp1 = np.zeros(theta.shape)  # 初始化一个theta临时矩阵
    cost = np.zeros(epoch)  # 初始化一个array,包含每次迭代后的cost
    m = x.shape[0]  # 样本数量m

    for i in range(epoch):
        # 利用向量化同步计算theta值
        # 注意theta是一个行向量
        temp1 = theta - (alpha / m) * (x.dot(theta.T) - y).T.dot(x)  # 得出一个theta行向量
        theta = temp1
        cost[i] = cost_function.compute_cost(x, y, theta)  # 这个函数中,theta是变量,X,y是已知量
    return theta, cost  # 迭代结束之后返回theta和cost值

结果显示:

print(final_theta):

[[-1.10703409e-16 8.78503652e-01 -4.69166570e-02]]

print(final_cost):
[0.13070337]

多变量线性回归_第1张图片

你可能感兴趣的:(多变量线性回归)