Как построить функцию стоимости регрессии наименьших квадратов как контурный график в питоне - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь научиться некоторому основному машинному обучению.Я реализовал градиентный спуск, однако я пытаюсь визуализировать свою функцию стоимости, но застрял на том, как это сделать.

Ниже приведена моя функция стоимости

w - массив 2 x 1 (который большинство людей обозначают как тета), который представляет наклон и y-точку пересечения линии (w [0, 1] =наклон, w [1, 1] = y int)

X - массив 400 x 2.Первый столбец - это фактические данные, второй столбец - это столбец всех единиц.

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 [1, 1] по осям x и y контурного графика.,

Моя первая попытка состояла в том, чтобы сгенерировать матрицу различных векторов 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...