参考:某大佬的github
建议打开上面的链接看看。
此篇主要补充一些公式转化成线性代数语言和实现。
如有纰漏,欢迎指正。
大致思路
主要部分有:加载数据,归一化数据,计算代价cost,梯度下降。
另外需要一个训练函数,一个预测函数,一些可视化函数和主函数。
参数对应含义
x-特征
y-真实结果
h-假设函数的结果(计算得到的结果)
m-训练样本的数量
n-特征的维数(比如 2 :房屋面积,使用年限)
theta-参数
加载数据
去上面的链接复制粘贴就行
def load_data(filename, delimiter, dtype):
loaddata = np.loadtxt(filename, delimiter=delimiter, dtype=dtype)
# print(loaddata)
return loaddata
归一化数据
公式:
上面的链接使用的标准差(代码std),而我用的最大值-最小值(代码ptp)
def normalization(data_x): # 注意:接收的是x 此函数把参数转化成-0.5到+0.5之间
# 使用x = (x-平均值)/范围 替代x ---------- 也可以除以标准差
data_x_norm = np.array(data_x) # 将X转化为numpy数组对象,才可以进行矩阵的运算
mean = np.mean(data_x_norm, 0) # 求每一列的平均值(0指定为列,1代表行)(一列是同一种特征)
# print(f'mean={mean}')
ptp = np.ptp(data_x_norm, 0) # 求每一列的范围
# print(f'ptp={ptp}')
for col in range(data_x_norm.shape[1]): # python遍历np数组的列
# shape[0]第一维度的长度相当于行数 shape[1]第二维度的长度相当于列数
data_x_norm[:, col] = (data_x_norm[:, col]-mean[col])/ptp[col]
# 其中data_x_norm[:, col]应该是一列,mean[col],ptp[col] 应该是个数字
# print(f'data_x_norm[:, col] ={data_x_norm[:, col] }') # 显示的应该是科学计数法表示的数据,-0.5到+0.5之间是正常的
return data_x_norm, mean, ptp
计算代价cost
有几点要注意的:
1.特征x应该有一列1,实现如下:
x_fin = np.hstack((np.ones((m, 1)), x_norm)) # 在X前加一列1 原因见吴恩达课 # np.vstack():在竖直方向上堆叠 np.hstack():在水平方向上平铺
原因吴恩达老师讲过,这样做可以使得 输出h = x 乘 参数theta
计算输出(假设函数)h的方法见上图,代码如下:
h = np.dot(x, theta) # 计算预测值(把数据代入假设)
计算代价cost的公式:
对应代码:
cost_j = np.transpose(np.dot(x_cost, theta_cost) - y_cost) * (np.dot(x_cost, theta_cost