|
|
4 years ago | |
|---|---|---|
| README.md | 4 years ago | |
README.md
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)