如何在python中绘制最小二乘回归成本函数作为轮廓图

时间:2019-01-28 23:06:35

标签: python numpy matplotlib contour

我正在尝试学习一些基本的机器学习。我已经实现了梯度下降,但是我试图可视化我的成本函数,但是仍然坚持如何做到这一点。

以下是我的成本函数

w是2×1阵列(大多数人标签作为THETA)表示的线的斜率和y截距(W [0,1] =斜率,W [1,1] = Y INT)

X是一个400 x 2的数组。第一列是实际的数据,第二 列是全1列。

t是真实的y值(400 x 1数组)

def cost_fn(w, X, t):
    N, M = np.shape(X)
    y = X @ w
    difference = t - y
    return np.sum(np.square(difference)) / (2.0 * N)

这与我的梯度下降算法很好用。

然而,我试图使我的成本函数的等高线图与z轴和W [0,1]和W上的等高线图的x和y轴[1,1]成本。

我的第一个尝试是生成一个包含多个w向量的矩阵,将每个向量存储在列向量的数组中,遍历它们,为每个w向量计算成本并将其用作我的Z值

def cost_array(w, X, t):

    nrow_w, ncol_w = w.shape
    cost = np.zeros((ncol_w, 1))

    for i in range(0, ncol_w):
        y = X @ w[:, i]

        cost_i = cost_fn(w[:, i], X, t)
        cost[i, 0] = cost_i
    print(cost)
    return cost

w1 = np.array([np.linspace(-40, 40, num=1000)])
w0 = np.array([np.linspace(-40, 40, num=1000)])
w_array = np.vstack((w1, w0))
# print(w_array)
x_msh, y_msh = np.meshgrid(w1,w0)
c_array = cost_array(w_array, X, t)
plt.contour(x_msh, y_msh, c_array, cmap='RdGy')
plt.show()

但是轮廓却抱怨我的c_array的形状至少不是2x2。我该如何补救?也有我的矢量化功能cost_array让我没有使用循环的方式?

这是一个完整的例子:

import numpy as np
import random
import matplotlib.pyplot as plt

def generate_data():
     x = np.arange(400)
     delta = np.random.uniform(-10,10, size=(400,))
     y = .4 * x +3 + delta
     return x, y

def cost_fn(w, X, t):
    N, M = np.shape(X)
    y = X @ w
    difference = t - y
    return np.sum(np.square(difference)) / (2.0 * N)

def cost_array(w, X, t):

    nrow_w, ncol_w = w.shape
    cost = np.zeros((ncol_w, 1))

    for i in range(0, ncol_w):
        y = X @ w[:, i]

        cost_i = cost_fn(w[:, i], X, t)
        cost[i, 0] = cost_i

    return cost

x, t = generate_data()

x = x[:, None]
t = t[:, None]

# add col of 1s to X
ones_array = np.ones(x.shape[0])
X = np.c_[x, ones_array]

# Example of w vector
w = np.array([[1, 1]]).T
print(w)

# Example of cost function:
cost_example = cost_fn(w, X, t)

# Trying to make contour
w1 = np.array([np.linspace(-40, 40, num=1000)])
w0 = np.array([np.linspace(-40, 40, num=1000)])
w_array = np.vstack((w1, w0))

x_msh, y_msh = np.meshgrid(w1,w0)
c_array = cost_array(w_array, X, t)
plt.contour(x_msh, y_msh, c_array, cmap='RdGy')
plt.show()

0 个答案:

没有答案