You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1.6 KiB

python

from numpy import *

数据集大小 即20个数据点

m = 20

x的坐标以及对应的矩阵

X0 = ones((m, 1)) # 生成一个m行1列的向量也就是x0全是1 X1 = arange(1, m+1).reshape(m, 1) # 生成一个m行1列的向量也就是x1从1到m X = hstack((X0, X1)) # 按照列堆叠形成数组,其实就是样本数据

对应的y坐标

Y = array([ 3, 4, 5, 5, 2, 4, 7, 8, 11, 8, 12, 11, 13, 13, 16, 17, 18, 17, 19, 21 ]).reshape(m, 1)

学习率

alpha = 0.01

定义代价函数

def cost_function(theta, X, Y): diff = dot(X, theta) - Y # dot() 数组需要像矩阵那样相乘就需要用到dot() return (1/(2*m)) * dot(diff.transpose(), diff)

定义代价函数对应的梯度函数

def gradient_function(theta, X, Y): diff = dot(X, theta) - Y return (1/m) * dot(X.transpose(), diff)

######Begin######

梯度下降迭代

def gradient_descent(X, Y, alpha): theta = array([1, 1]).reshape(2, 1) gradient = gradient_function(theta, X, Y) while not all(abs(gradient) <= 1e-5): theta = theta - alpha * gradient gradient = gradient_function(theta, X, Y) return theta

optimal = gradient_descent(X, Y, alpha) print('optimal:', optimal) print('cost function:', cost_function(optimal, X, Y)[0][0]) #######End#######

根据数据画出对应的图像

def plot(X, Y, theta): import matplotlib.pyplot as plt ax = plt.subplot(1,1,1)
ax.scatter(X, Y, s=30, c="red", marker="s") plt.xlabel("X") plt.ylabel("Y") x = arange(0, 21, 0.2) # x的范围 y = theta[0] + theta[1]*x ax.plot(x, y) plt.show()

plot(X1, Y, optimal)