一个特征值
- 加载数据,将数据赋给x和y两个向量;
此处使用numpy模块对数组进行处理data = np.loadtxt(‘data1’,delimiter=’、’),此时data为包含两列数据的数组;
计算data的行数,将第一列赋给x,第二列赋给y
m = np.size(data,0)
x=data[:,0]#数据切片,取所有行的第一列,为一行数据
y=data[:,1]#去所有行的第二列,一行数据
- 画出原始数据的散点图
fig,ax = plt.subplots(1,2,figsize(20,10))
a[0].scatter(x,y,c='r',marker='x')
ax[0].plot(x, mx.dot(theta))
ax[0].set_title('Original scatterplot and Predict line')
如图:
-
代价函数
- 数据整理
theta = np.zeros(2) mx = x.reshape((m,1)) mx = np.hstack((np.ones((m,1)),mx)) my = y.reshape((m,1))
- 代价函数实现
def costFunc(theta, x, y): m, n = x.shape#m为x的行数,n为x的列数 theta = theta.reshape((n, 1)) y = y.reshape((m, 1))#重复做事防止y没被标准化m行1列的形式 err = x.dot(theta) - y J = 0.5*(np.sum(err*err))/m return J
使用梯度下降法最小化代价函数
def gradient(theta, x, y):
m, n = x.shape
theta = theta.reshape((n, 1))
y0 = y.reshape((m, 1))
y1 = x.dot(theta)
grad = ((x.T).dot(y1-y0))/m
#注意x的转置,因为θ0是乘以的1,所以x是添加了1位列的,转置后刚好得到
return grad.flatten()
iters = 15000#迭代次数
alpha = 0.01#学习速率
def gradientSolve(theta, x, y, alpha, iters):
alpha *= 1.0
jhistory = []
theta = theta.flatten()
while iters > 0:
deri = gradient(theta, x, y)
theta = theta - alpha*deri
jhistory.append(costFunc(theta, x, y))
iters -= 1
return theta, jhistory
#theta为梯度下降法迭代后的最后theta值,后面为每一次迭代后的代价函数值,为了画图
代价函数随迭代次数的图像如图:
- 代价函数的3D曲面图,轴标为
根据原始数据的散点图可以大致确定
的取值范围分别为(-10,10)和(-1,4)
针对每一对
的取值都对应一个相应的代价函数的取值。所以代价函数的3D曲面图如下:
def visualCost3D(x, y):
theta0 = np.linspace(-10, 10, 200)#在指定的间隔内返回均匀间隔的数字
theta1 = np.linspace(-1, 4, 200)
jvals = np.zeros((theta0.size, theta1.size))
for i in np.arange(0, theta0.size):
for j in np.arange(0, theta1.size):
#水平(按列顺序)把数组给堆叠起来,返回结果为numpy的数组
theta = np.hstack((theta0[i], theta1[j])).T
jvals[i, j] = costFunc(theta, x, y)
fig = plt.figure()
ax = Axes3D(fig)
#meshgrid函数通常在数据的矢量化上使用,适用于生成网格型数据,可以接受两个一维数组生成两个二维矩阵,对应两个数组中所有的(x,y)对。
x, y = np.meshgrid(theta0, theta1)
ax.plot_surface(x, y, jvals.T, cmap='rainbow')
ax.set_title('Cost Function Surface')
图像如图所示:
- 等高线图
#等高线图
def contour(res, x, y):
fig, ax = plt.subplots()
res = res.flatten()#返回一个折叠成一维的数组
theta0 = np.linspace(-10, 10, 200)
theta1 = np.linspace(-1, 4, 200)
jvals = np.zeros((theta0.size, theta1.size))
for i in np.arange(0, theta0.size):
for j in np.arange(0, theta1.size):
theta = np.hstack((theta0[i], theta1[j])).T
jvals[i, j] = costFunc(theta, x, y)
x, y = np.meshgrid(theta0, theta1)
ax.scatter(res[0], res[1])#梯度下降法所得到的θ值得散点图,即中心点
# transpose jvals before calling contour, or else the axes will be flipped
ax.contour(x, y, jvals.T, np.logspace(-2, 2, 50))
ax.set_title('Contour of Cost Function')