1.写在前面

吴恩达机器学习的课后作业及数据可以在coursera平台上进行下载,只要注册一下就可以添加课程了。所以这里就不写题目和数据了,有需要的小伙伴自行去下载就可以了。
作业及数据下载网址:吴恩达机器学习课程

2.偏差和方差

偏差和方差的作业内容比较多,主要有以下几项:

  1. 可视化训练集数据
  2. 利用一元线性回归进行拟合,可视化并绘制学习曲线
  3. 利用多项式回归进行拟合,可视化并绘制学习曲线
  4. 绘制lamda变化对于各项数据集的代价变化

下面附上代码,有详细的注释,这里就不一一解释了。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import scipy.io as scio  # 用于导入mat文件的库
from scipy.optimize import minimize# 用于导入数据的函数
def input_data():dataFile = 'machine-learning-ex5\\machine-learning-ex5\\ex5\\ex5data1.mat'# 导入mat文件数据data = scio.loadmat(dataFile)# 导入训练集数据train_X = data['X']train_y = data['y']# 导入测试集数据test_X = data['Xtest']test_y = data['ytest']# 导入交叉验证集数据val_X = data['Xval']val_y = data['yval']return train_X, train_y, test_X, test_y, val_X, val_y# 用于数据可视化的函数
def visualize_data(X, y):fig, ax = plt.subplots(1, 1)ax.scatter(X, y)        # 绘制散点图ax.set_xticks([k for k in range(-50, 50, 10)])  # 设置x轴坐标ax.set_yticks([k for k in range(0, 45, 5)])     # 设置y轴坐标ax.set_xlabel('Change in water level(x)')       # 设置x轴标题ax.set_ylabel('Water flowing out of the dam (y)')   # 设置y轴标题plt.show()# 用于计算代价的函数
def compute_costs(theta, X, y, lamda):theta = theta.reshape(theta.shape[0],1)     # 将theta从一维还原成二维m = X.shape[0]      # 获得mcostJ1 = np.sum(np.power(X @ theta - y, 2))     # 计算代价函数第一部分costJ2 = np.sum(np.power(theta[1:, 0], 2)) * lamda  # 计算代价函数第二部分return (costJ1 + costJ2) / (2 * m)      # 计算并返回# 用于计算梯度的函数
def compute_gradient(theta, X, y, lamda):theta = theta.reshape(theta.shape[0], 1)        #将theta数组从一维还原成二维m = X.shape[0]      # 获得mgradient = np.sum((X @ theta - y) * X, axis=0)      #计算梯度第一部分gradient = gradient.reshape(gradient.shape[0], 1)   # 将gradient从一维还原成二维reg = theta * lamda     # 计算梯度第二部分reg[0,0] = 0     # 因为theta0不参与计算,所以要单独进行修改return (gradient + reg) / m     # 计算并返回# 用于拟合线性模型
def fit_linear_regression(theta, X, y, lamda):# 调用minimize方法求得最小值res = minimize(fun=compute_costs, x0=theta, args=(X, y, lamda), method='TNC', jac=compute_gradient,options={'maxiter': 100})final_theta = res.x     # 获得最优theta数组return final_theta# 用于绘制线性回归图像的函数
def plot_linear_regression(final_theta, train_X,train_y):px = np.linspace(np.min(train_X[:, 1]), np.max(train_X[:, 1]), 100)     # 产生自变量xpx = px.reshape(px.shape[0], 1)     # 将数据从一维还原成二维px = np.insert(px, 0, 1, axis=1)    # 插入一列全为1的列py = px @ final_theta       # 计算预测的值# 绘制散点图和预测曲线fig, ax = plt.subplots(1, 1)ax.scatter(train_X[:, 1], train_y)ax.plot(px[:, 1], py)ax.set_xticks([k for k in range(-50, 50, 10)])ax.set_yticks([k for k in range(-5, 45, 5)])ax.set_xlabel('Change in water level(x)')ax.set_ylabel('Water flowing out of the dam (y)')plt.show()# 用于绘制线性模型的学习曲线
def plot_linear_learning_curves(train_X, train_y, val_X, val_y, lamda):error_train = []    # 训练集代价数组error_val = []      # 交叉验证集代价数组for i in range(0, train_X.shape[0]):        # 逐个增加训练集的训练样本数theta = np.ones((train_X.shape[1], 1))      # 初始化theta数组# 调用线性回归进行拟合,并获得最优theta数组theta = fit_linear_regression(theta, train_X[0:i + 1, :], train_y[0:i + 1, :], lamda)# 利用最优theta计算训练集代价,注意这里的样本数为训练集中的(i+1)样本train_error = compute_costs(theta, train_X[0:i + 1, :], train_y[0:i + 1, :], 0)# 利用最优theta计算交叉验证集代价,注意这里的样本数为整个交叉验证集val_error = compute_costs(theta, val_X, val_y, 0)error_train.append(train_error)     # 将当前size的代价添加到训练集代价数组中error_val.append(val_error)         # 将整个交叉验证集的代价添加到交叉验证集代价数组中# 绘制散点图和拟合曲线fig, ax = plt.subplots(1, 1)ax.plot([i for i in range(1, train_X.shape[0] + 1)], error_train, c='blue', label='Train')ax.plot([i for i in range(1, train_X.shape[0] + 1)], error_val, c='green', label='Cross Validation')ax.set_xticks(np.arange(0, 13, 2))ax.set_yticks(np.arange(0, 151, 50))plt.legend()plt.show()# 用于将特征映射会高维度的函数
def map_polynomial_features(X, p):for i in range(2, p + 1):   # 从2次方开始一直到p次方X = np.insert(X, X.shape[1], values=np.power(X[:, 1], i), axis=1)return X# 用于进行特征缩放的函数(均值归一化)
def feature_normalize(data, d,dataMean,dataStd):for i in range(1, d + 1):for j in range(0, data.shape[0]):  # 遍历第i列中每一个数值data[j, i] = (data[j, i] - dataMean[i]) / dataStd[i]  # 利用吴恩达老师的公式进行归一化return data# 用于获得数据X的均值和方差的函数
def get_means_stds(X):means = np.mean(X,axis=0)   # 计算均值stds = np.std(X,axis=0)     # 计算方差return means,stds# 用于拟合多项式模型的函数
def fit_polynomical_regression(theta, train_X, train_y, lamda, d,train_mean,train_std):poly_features = map_polynomial_features(train_X, d)     # 将训练集映射到高纬度nor_poly_features = feature_normalize(poly_features, d,train_mean,train_std)     # 进行归一化theta = np.ones((nor_poly_features.shape[1],1))     # 初始化theta数组final_theta = fit_linear_regression(theta, nor_poly_features, train_y, lamda)   # 调用线性回归进行拟合final_theta = final_theta.reshape(final_theta.shape[0], 1)   # 将最优theta数组从一维还原成二维return final_theta# 用于绘制多项式回归图像的函数
def plot_polynomical_regression(final_theta, train_X,train_y,d, train_mean, train_std):x = np.linspace(-70, 60, 100)  # 从-70到60之间产生100个数xx = x.reshape(x.shape[0], 1)  # 将数据从一维还原成二维数据xx = np.insert(xx, 0, 1, axis=1)  # 插入一列全为1的列xx = map_polynomial_features(xx, d)  # 将产生的数据映射到高纬度# 特别注意这里要使用训练集的均值和方差,而不是从产生的数据中的均值和方差xx = feature_normalize(xx, d, train_mean, train_std)  # 进行归一化yy = xx @ final_theta  # 计算预测的值# 绘制散点图和拟合曲线fig, ax = plt.subplots(1, 1)ax.scatter(train_X[:, 1], train_y, c='red')ax.plot(x, yy.flatten(), c='blue', linestyle='--')ax.set_xticks([k for k in range(-80, 81, 20)])ax.set_yticks([k for k in range(-60, 41, 10)])ax.set_xlabel('Change in water level(x)')ax.set_ylabel('Water flowing out of the dam (y)')plt.show()# 用于绘制多项式回归的学习曲线的函数
def plot_poly_learning_curves(train_X, train_y, val_X, val_y, lamda,d,train_mean,train_std,val_mean,val_std):error_train = []    # 定义训练集代价数组error_val = []      # 定义交叉验证集代价数组for i in range(0, train_X.shape[0]):    # 训练集size从0开始逐渐递增theta = np.ones((d+1, 1))       # 初始化theta数组# 调用多项式线性回归函数获得最优theta值theta = fit_polynomical_regression(theta, train_X[0:i + 1, :], train_y[0:i + 1, :], lamda,d,train_mean,train_std)# 将(i+1)个训练样本映射为高纬度train_poly_features = map_polynomial_features(train_X, d)# 进行归一化,注意这里使用的是整个训练集的均值和代价train_nor_poly_features = feature_normalize(train_poly_features, d,train_mean,train_std)# 计算(i+1)个训练集样本的代价train_error = compute_costs(theta, train_nor_poly_features[0:i + 1, :], train_y[0:i + 1, :], 0)# 将整个交叉验证集映射到高纬度val_poly_features = map_polynomial_features(val_X, d)# 对整个交叉验证集进行归一化,特别注意这里使用的是训练集的均值和方差val_nor_poly_features = feature_normalize(val_poly_features, d,train_mean,train_std)# 计算整个交叉验证集的代价val_error = compute_costs(theta, val_nor_poly_features, val_y, 0)error_train.append(train_error)     # 将训练集代价添加到训练集代价数组中error_val.append(val_error)         # 将交叉验证集代价添加到交叉验证集代价数组中# 绘制散点图和拟合曲线fig, ax = plt.subplots(1, 1)ax.plot([i for i in range(1, train_X.shape[0] + 1)], error_train, c='blue', label='Train')ax.plot([i for i in range(1, train_X.shape[0] + 1)], error_val, c='green', label='Cross Validation')ax.set_xticks(np.arange(0, 13, 2))ax.set_yticks(np.arange(0, 101, 10))plt.legend()plt.show()# 绘制随lamda的变化,训练集、测试集、交叉验证集的代价
def plot_lamda_curve(theta, train_X, train_y, val_X, val_y,test_X,test_y,d,train_mean,train_std):lamda = [0,0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1, 3, 10]    # 设置lamda数组error_train = []       # 训练集代价数组error_val = []         # 交叉验证集代价数组error_test = []        # 测试集代价数组for k in lamda:         # 遍历每一种lamdatheta = np.ones((d + 1, 1))     # 初始化theta数组# 调用多项式回归拟合函数theta = fit_polynomical_regression(theta, train_X, train_y, k,d,train_mean,train_std)train_poly_features = map_polynomial_features(train_X, d)   # 训练集进行映射高维度# 注意这里使用的是训练集的均值和方差train_nor_poly_features = feature_normalize(train_poly_features, d,train_mean,train_std)   # 训练集进行归一化train_error = compute_costs(theta, train_nor_poly_features, train_y, 0)     # 训练集代价val_poly_features = map_polynomial_features(val_X, d)       # 交叉验证集进行映射高维度# 注意这里使用的是训练集的均值和方差val_nor_poly_features = feature_normalize(val_poly_features, d,train_mean,train_std)    # 交叉验证集集进行归一化val_error = compute_costs(theta, val_nor_poly_features, val_y, 0)   # 交叉验证集代价test_poly_features = map_polynomial_features(test_X, d)     # 测试集进行映射高维度# 注意这里使用的是训练集的均值和方差test_nor_poly_features = feature_normalize(test_poly_features, d, train_mean, train_std)    # 测试集进行归一化test_error = compute_costs(theta, test_nor_poly_features, test_y, 0)    # 测试集代价error_train.append(train_error)     # 将训练集代价加入到数组中error_val.append(val_error)         # 将交叉验证集代价加入到数组中error_test.append(test_error)       # 将测试集代价加入到数组中# 绘制三种数据集的代价随着lamda变化的图像fig,ax = plt.subplots(1,1)ax.plot(lamda,error_train,label='Train',c='b')ax.plot(lamda, error_val, label='Cross Validation', c='g')ax.plot(lamda, error_test, label='Test', c='r')ax.set_xticks(np.arange(0,11,1))ax.set_yticks(np.arange(0,21,2))plt.legend()plt.show()d=6     # 定义多项式的阶数
lamda = 0   # 定义lamda
train_X, train_y, test_X, test_y, val_X, val_y = input_data()   # 分别导入三种数据集的数据
train_X = np.insert(train_X, 0, 1, axis=1)  # 训练集增加全1的列
test_X = np.insert(test_X, 0, 1, axis=1)    # 测试集集增加全1的列
val_X = np.insert(val_X, 0, 1, axis=1)      # 交叉验证集集增加全1的列train_poly_X = map_polynomial_features(train_X, d)  # 将训练集映射成高维度
test_poly_X = map_polynomial_features(test_X, d)    # 将测试集映射成高维度
val_poly_X = map_polynomial_features(val_X, d)      # 将交叉验证集映射成高维度train_mean,train_std=get_means_stds(train_poly_X)   # 将训练集归一化
test_mean,test_std=get_means_stds(test_poly_X)      # 将测试集归一化
val_mean,val_std=get_means_stds(val_poly_X)         # 将交叉验证集归一化theta = np.ones((2, 1))     # 用于一元线性回归的theta数组初始化
# 调用一元线性回归
final_theta = fit_linear_regression(theta, train_X, train_y, lamda)
# 绘制一元线性回归拟合曲线
plot_linear_regression(final_theta, train_X,train_y)
# 绘制一元线性回归学习曲线
plot_linear_learning_curves(train_X, train_y, val_X, val_y, lamda)
# 调用多项式回归
final_theta = fit_polynomical_regression(theta, train_X, train_y, lamda, d,train_mean,train_std)
# 绘制多项式回归拟合曲线
plot_polynomical_regression(final_theta, train_X,train_y,d, train_mean, train_std)
# 绘制多项式回归学习曲线
plot_poly_learning_curves(train_X, train_y, val_X, val_y, lamda,d,train_mean,train_std,val_mean,val_std)
# 绘制数据集随lamda的代价函数曲线
plot_lamda_curve(theta, train_X, train_y, val_X, val_y,test_X,test_y,d,train_mean,train_std)

结果展示:
一元线性回归拟合效果:

一元线性回归学习曲线:

多项式回归拟合效果:

多项式回归学习曲线:

lamda变化对于各个数据集的影响

吴恩达机器学习课后作业——偏差和方差相关推荐

  1. 目录:吴恩达机器学习课后作业

    简单介绍 本博客为作者自行完成的吴恩达机器学习课后练习题目录,均使用PyTorch进行实现,无法保证对错,仅供参考. 作业题目以及源代码 百度云盘连接 提取码:3dvb 题目的命名方式与下表中的作业名 ...

  2. 吴恩达机器学习课后作业——线性回归(Python实现)

    1.写在前面 吴恩达机器学习的课后作业及数据可以在coursera平台上进行下载,只要注册一下就可以添加课程了.所以这里就不写题目和数据了,有需要的小伙伴自行去下载就可以了. 作业及数据下载网址:吴恩 ...

  3. 吴恩达机器学习课后作业ex1(python实现)

    作业介绍 吴恩达老师的作业资源可以在github或者网上找到 . ex1主要是对线性回归的一些复习和梯度下降.损失函数等的具体代码实现. pdf文件是对作业的说明.文件夹则是作业数据的各种格式,pyt ...

  4. 吴恩达机器学习课后作业1——单变量线性回归(Linear regression with one variable)

    1. 问题和数据 假设你是一家连锁餐车店的老板,但是你又和别的土老板不一样,你又刚好是个懂线性回归,还懂编程的老板,正在考虑在不同的城市开一家新店.该连锁店已经在各个城市开设了餐车,你可以获得这些城市 ...

  5. 吴恩达机器学习课后作业1.1——多变量线性回归(Linear regression with multiple variable)

    1. 问题和数据 假设你要卖掉你的房子,你想知道一个好的市场价格是多少.其中一种方法是,首先收集最近出售的房屋的信息.在本部分的练习中,你将使用多元线性回归来预测房屋价格. 数据ex1data2.tx ...

  6. 吴恩达机器学习课后作业——SVM支持向量机

    支持向量机 一.作业内容 在本练习的前半部分,您将对各种示例2D数据集使用支持向量机(svm).使用这些数据集进行试验将帮助您直观地了解支持向量机的工作方式,以及如何在支持向量机中使用高斯核.在练习的 ...

  7. 吴恩达机器学习课后作业——线性回归

    一.单变量线性回归 一.作业内容 假设你是一家特许经营餐厅的首席执行官,正在考虑在不同的城市开一家新店,该连锁店已经在各个城市开设了餐车,文件ex1data1.txt中包含你这些城市的利润和人口数据. ...

  8. 吴恩达机器学习课后作业ex3(python实现)

    ex3是机器学习中经典的手写数字识别(使用逻辑回归分类),给出的数据是.mat后缀,可以用python中load方法加载数据.手写体"1"到"9"的类别分别标为 ...

  9. 吴恩达机器学习课后作业深度解析(附答案)(ex2)

    作业ex2题目及答案源码下载地址ex2题目及答案 一.逻辑回归 问题背景,根据学生两门课的成绩和是否入学的数据,预测学生能否顺利入学 plotData.m:数据可视化 % Find Indices o ...

最新文章

  1. c语言中continue在case中,C語言switch case 語句中能否使用continue 關鍵字?
  2. 线性时间复杂度求数组中第K大数
  3. AI:IPPR的数学表示-CNN方法
  4. hexo博客完整备份
  5. hdu 1800 (map)
  6. 跟我一起学Redis之高可用从主从复制开始
  7. java-多线程-一道阿里面试题分析
  8. Typora中使用Gitee图床
  9. POJ-2456.Aggressivecows.(二分求解最大化最小值)
  10. InTouch软件介绍
  11. UWB定位系统上位机源码
  12. NCURSES程序设计之皇后问题
  13. 想学ui设计从哪里入手
  14. open cv轮廓周围绘制圆形和矩形
  15. Jenkins Pipeline 一键部署SpringBoot项目
  16. 我们的新书--《我是一只IT小小鸟》
  17. 梅森素数、猜年龄、啤酒饮料、武功秘籍、调和级数、李白打酒、猜字母、扩散、三升序列、寻找2020
  18. maven强制刷新本地包:(用于打包后重新加载)
  19. 输入两个整数,要求输出其中值较大者。要求用函数求出最大值
  20. c++商店信息管理系统的设计与实现

热门文章

  1. VS 2010错误提醒: 必需属性“VSInstallDir”缺失或为空 以及 error MSB8008
  2. 肠道重要菌属——颤螺菌属 (Oscillospira),它为什么如此神秘?
  3. 使用certbot生成https证书
  4. PDF电子签名申请与设置方法
  5. 快手影音 www.kuaishou.net
  6. 小学计算机兴趣小组计划书,小学科技兴趣小组活动计划书
  7. 采集全国疫情数据(Python)
  8. react-router4.2使用js控制路由跳转的3种方式
  9. GSMA TAC核发及IMEI编码规则
  10. python立方根求解_python 二分查找(立方根)