我正在学习一些基本的机器学习。我已经实现了梯度下降,但是我正在尝试可视化我的成本函数,但我坚持如何做到这一点。在
下面是我的成本函数
w是一个2x1数组(大多数人把它称为theta),它表示一条直线的斜率和y截距(w[0,1]=slope,w[1,1]=y int)
X是一个400x2数组。第一列是实际数据,第二列是实际数据 列是所有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[1,1]位于等高线图的x和y轴上。在
我的第一次尝试包括生成一个由各种w向量组成的矩阵,将这些向量存储在列向量的数组中,循环遍历这些向量,并计算每个w向量的成本并将其用作Z值
^{pr2}$然而,轮廓抱怨我的c勍阵列不是至少2x2形状。我该怎么补救?还有没有一种方法可以将cost_数组函数矢量化,这样我就不用使用循环了?在
下面是一个完整的例子:
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()
目前没有回答
相关问题 更多 >
编程相关推荐