位置: IT常识 - 正文

周志华《机器学习》第三章课后习题

编辑:rootadmin
周志华《机器学习》第三章课后习题

目录

3.1 试析在什么情形下式(3.2) 中不必考虑偏置项 b.

3.2、试证明,对于参数w,对率回归的目标函数(3.18)是非凸的,但其对数似然函数(3.27)是凸的.

 3.3、编程实现对率回归,并给出西瓜数据集3.0α上的结果.

3.4 选择两个 UCI 数据集,比较 10 折交叉验证法和留一法所估计出的对率回归的错误率。

3.5 编辑实现线性判别分析,并给出西瓜数据集 3.0α 上的结果.


3.1 试析在什么情形下式(3.2) 中不必考虑偏置项 b.

推荐整理分享周志华《机器学习》第三章课后习题,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

①b与输入毫无关系,如果没有b,y‘=wx必须经过原点 ②当两个线性模型相减时,消除了b。可用训练集中每个样本都减去第一个样本,然后对新的样本做线性回归,不用考虑偏置项b。

3.2、试证明,对于参数w,对率回归的目标函数(3.18)是非凸的,但其对数似然函数(3.27)是凸的.

 3.27

 

 3.3、编程实现对率回归,并给出西瓜数据集3.0α上的结果.

数据集:

周志华《机器学习》第三章课后习题

3.3.py

# -*- coding: utf-8 -*'''data importion'''import numpy as np # for matrix calculationimport matplotlib.pyplot as plt# load the CSV file as a numpy matrix# 将CSV文件加载为numpy矩阵dataset = np.loadtxt('watermelon3_0_Ch.csv', delimiter=",")# separate the data from the target attributes# 将数据与目标属性分离X = dataset[:, 1:3]y = dataset[:, 3]m, n = np.shape(X)# draw scatter diagram to show the raw data#绘制出数据点f1 = plt.figure(1)plt.title('watermelon_3a')plt.xlabel('density')plt.ylabel('ratio_sugar')plt.scatter(X[y == 0, 0], X[y == 0, 1], marker='o', color='k', s=100, label='bad')plt.scatter(X[y == 1, 0], X[y == 1, 1], marker='o', color='g', s=100, label='good')plt.legend(loc='upper right')# plt.show()''' using sklearn lib for logistic regression使用sklearn库进行逻辑回归'''from sklearn import metricsfrom sklearn import model_selectionfrom sklearn.linear_model import LogisticRegressionimport matplotlib.pylab as pl# generalization of test and train set# 先划分训练集和测试集,采用sklearn.model_selection.train_test_split()实现X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.5, random_state=0)# model training# 采用sklearn.linear_model.LogisticRegression,基于训练集直接拟合出逻辑回归模型,然后在测试集上评估模型(查看混淆矩阵和F1值)log_model = LogisticRegression() # using log-regression lib modellog_model.fit(X_train, y_train) # fitting# model validation 模型确认y_pred = log_model.predict(X_test)# summarize the fit of the model 总结模型的拟合情况print(metrics.confusion_matrix(y_test, y_pred))print(metrics.classification_report(y_test, y_pred))precision, recall, thresholds = metrics.precision_recall_curve(y_test, y_pred)# show decision boundary in plt 在PLT中显示决策边界# X - some data in 2dimensional np.array X -二维np.array中的一些数据f2 = plt.figure(2)h = 0.001x0_min, x0_max = X[:, 0].min() - 0.1, X[:, 0].max() + 0.1x1_min, x1_max = X[:, 1].min() - 0.1, X[:, 1].max() + 0.1x0, x1 = np.meshgrid(np.arange(x0_min, x0_max, h), np.arange(x1_min, x1_max, h))# here "model" is your model's prediction (classification) function# 这里的“模型”是模型的预测(分类)函数z = log_model.predict(np.c_[x0.ravel(), x1.ravel()])# Put the result into a color plot 把结果放入颜色图中z = z.reshape(x0.shape)# 采用matplotlib.contourf绘制的决策区域和边界,可以看出对率回归分类器还是成功的分出了绝大多数类:plt.contourf(x0, x1, z, cmap=pl.cm.Paired)# Plot also the training pointsplt.title('watermelon_3a')plt.title('watermelon_3a')plt.xlabel('density')plt.ylabel('ratio_sugar')plt.scatter(X[y == 0, 0], X[y == 0, 1], marker='o', color='k', s=100, label='bad')plt.scatter(X[y == 1, 0], X[y == 1, 1], marker='o', color='g', s=100, label='good')# plt.show()'''coding to implement logistic regression编码以实现逻辑回归'''from sklearn import model_selectionimport self_def# X_train, X_test, y_train, y_testnp.ones(n)m, n = np.shape(X)X_ex = np.c_[X, np.ones(m)] # extend the variable matrix to [x, 1]X_train, X_test, y_train, y_test = model_selection.train_test_split(X_ex, y, test_size=0.5, random_state=0)# using gradDescent to get the optimal parameter beta = [w, b] in page-59beta = self_def.gradDscent_2(X_train, y_train)# prediction, beta mapping to the modely_pred = self_def.predict(X_test, beta)m_test = np.shape(X_test)[0]# calculation of confusion_matrix and prediction accuracy# #混淆矩阵的计算和预测精度cfmat = np.zeros((2, 2))for i in range(m_test): if y_pred[i] == y_test[i] == 0: cfmat[0, 0] += 1 elif y_pred[i] == y_test[i] == 1: cfmat[1, 1] += 1 elif y_pred[i] == 0: cfmat[1, 0] += 1 elif y_pred[i] == 1: cfmat[0, 1] += 1print(cfmat)

self_def.py  是 需要调用的函数

import numpy as npdef likelihood_sub(x, y, beta): ''' @param X: one sample variables @param y: one sample label @param beta: the parameter vector in 3.27 @return: the sub_log-likelihood of 3.27 3.27式子的变成对象 ''' return -y * np.dot(beta, x.T) + np.math.log(1 + np.math.exp(np.dot(beta, x.T)))def likelihood(X, y, beta): ''' @param X: the sample variables matrix @param y: the sample label matrix @param beta: the parameter vector in 3.27 @return: the log-likelihood of 3.27 ''' sum = 0 m, n = np.shape(X) for i in range(m): sum += likelihood_sub(X[i], y[i], beta) return sumdef partial_derivative(X, y, beta): # refer to 3.30 on book page 60 请参阅第60页的3.30 ''' @param X: the sample variables matrix @param y: the sample label matrix @param X:样本变量矩阵 @param y:样本标签矩阵 @param beta: the parameter vector in 3.27 @return: the partial derivative of beta [j] ''' m, n = np.shape(X) pd = np.zeros(n) for i in range(m): tmp = y[i] - sigmoid(X[i], beta) for j in range(n): pd[j] += X[i][j] * (tmp) return pddef gradDscent_1(X, y): # implementation of fundational gradDscent algorithms 基本梯度算法的实现 ''' @param X: X is the variable matrix @param y: y is the label array @return: the best parameter estimate of 3.27 然后基于训练集(注意x->[x,1]),给出基于3.27似然函数的定步长梯度下降法,降低损失,注意这里的偏梯度实现技巧: ''' import matplotlib.pyplot as plt h = 0.1 # step length of iterator 迭代器的步长 max_times = 500 # give the iterative times limit 给出迭代次数的极限 m, n = np.shape(X) b = np.zeros((n, max_times)) # for show convergence curve of parameter 表示参数的收敛曲线 beta = np.zeros(n) # parameter and initial 参数和初始 delta_beta = np.ones(n) * h llh = 0 llh_temp = 0 for i in range(max_times): beta_temp = beta.copy() for j in range(n): # for partial derivative 偏导数 beta[j] += delta_beta[j] llh_tmp = likelihood(X, y, beta) delta_beta[j] = -h * (llh_tmp - llh) / delta_beta[j] b[j, i] = beta[j] beta[j] = beta_temp[j] beta += delta_beta llh = likelihood(X, y, beta) t = np.arange(max_times) f2 = plt.figure(3) p1 = plt.subplot(311) p1.plot(t, b[0]) plt.ylabel('w1') p2 = plt.subplot(312) p2.plot(t, b[1]) plt.ylabel('w2') p3 = plt.subplot(313) p3.plot(t, b[2]) plt.ylabel('b') plt.show() return beta'''采用随机梯度下降法来优化:上面采用的是全局定步长梯度下降法(称之为批量梯度下降),这种方法在可能会面临收敛过慢和收敛曲线波动情况的同时,每次迭代需要全局计算,计算量随数据量增大而急剧增大。所以尝试采用随机梯度下降来改善参数迭代寻优过程。'''def gradDscent_2(X, y): # implementation of stochastic gradDscent algorithms 随机梯度算法的实现 ''' @param X: X is the variable matrix @param y: y is the label array @return: the best parameter estimate of 3.27 随机梯度下降法的核心思想是增量学习:一次只用一个新样本来更新回归系数,从而形成在线流式处理。 同时为了加快收敛,采用变步长的策略,h随着迭代次数逐渐减小。 ''' import matplotlib.pyplot as plt m, n = np.shape(X) h = 0.5 # step length of iterator and initial beta = np.zeros(n) # parameter and initial delta_beta = np.ones(n) * h llh = 0 llh_temp = 0 b = np.zeros((n, m)) # for show convergence curve of parameter for i in range(m): beta_temp = beta.copy() for j in range(n): # for partial derivative h = 0.5 * 1 / (1 + i + j) # change step length of iterator beta[j] += delta_beta[j] b[j, i] = beta[j] llh_tmp = likelihood_sub(X[i], y[i], beta) delta_beta[j] = -h * (llh_tmp - llh) / delta_beta[j] beta[j] = beta_temp[j] beta += delta_beta llh = likelihood_sub(X[i], y[i], beta) t = np.arange(m) f2 = plt.figure(3) p1 = plt.subplot(311) p1.plot(t, b[0]) plt.ylabel('w1') p2 = plt.subplot(312) p2.plot(t, b[1]) plt.ylabel('w2') p3 = plt.subplot(313) p3.plot(t, b[2]) plt.ylabel('b') plt.show() return beta#sigmoid函数def sigmoid(x, beta): ''' @param x: is the predict variable @param beta: is the parameter @return: the sigmoid function value ''' return 1.0 / (1 + np.math.exp(- np.dot(beta, x.T)))def predict(X, beta): ''' prediction the class lable using sigmoid 使用sigmoid预测类标签 @param X: data sample form like [x, 1] 数据样本形式如[x, 1] @param beta: the parameter of sigmoid form like [w, b] 形如[w, b]的参数 @return: the class lable array 类标签数组 ''' m, n = np.shape(X) y = np.zeros(m) for i in range(m): if sigmoid(X[i], beta) > 0.5: y[i] = 1; return y return3.4 选择两个 UCI 数据集,比较 10 折交叉验证法和留一法所估计出的对率回归的错误率。

参考代码: han1057578619/MachineLearning_Zhouzhihua_ProblemSets

3.5 编辑实现线性判别分析,并给出西瓜数据集 3.0α 上的结果.

 3.5.py

import numpy as npimport pandas as pdfrom matplotlib import pyplot as pltclass LDA(object): # 绘图,求出均值向量,根据公式3.34和3.39求出类内散度矩阵和类间散度矩阵 def fit(self, X_, y_, plot_=False): pos = y_ == 1 neg = y_ == 0 X0 = X_[neg] X1 = X_[pos] # 均值向量,(1, 2) u0 = X0.mean(0, keepdims=True) # (1, n) u1 = X1.mean(0, keepdims=True) # 类内散度矩阵,公式3.33,(2, 2) sw = np.dot((X0 - u0).T, (X0 - u0)) + np.dot((X1 - u1).T, (X1 - u1)) # 类间散度矩阵,公式3.37,(1, 2) w = np.dot(np.linalg.inv(sw), (u0 - u1).T).reshape(1, -1) if plot_: fig, ax = plt.subplots() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') ax.spines['left'].set_position(('data', 0)) ax.spines['bottom'].set_position(('data', 0)) plt.scatter(X1[:, 0], X1[:, 1], c='k', marker='o', label='good') plt.scatter(X0[:, 0], X0[:, 1], c='r', marker='x', label='bad') plt.xlabel('密度', labelpad=1) plt.ylabel('含糖量') plt.legend(loc='upper right') x_tmp = np.linspace(-0.05, 0.15) y_tmp = x_tmp * w[0, 1] / w[0, 0] plt.plot(x_tmp, y_tmp, '#808080', linewidth=1) wu = w / np.linalg.norm(w) # 正负样板店 X0_project = np.dot(X0, np.dot(wu.T, wu)) plt.scatter(X0_project[:, 0], X0_project[:, 1], c='r', s=15) for i in range(X0.shape[0]): plt.plot([X0[i, 0], X0_project[i, 0]], [X0[i, 1], X0_project[i, 1]], '--r', linewidth=1) X1_project = np.dot(X1, np.dot(wu.T, wu)) plt.scatter(X1_project[:, 0], X1_project[:, 1], c='k', s=15) for i in range(X1.shape[0]): plt.plot([X1[i, 0], X1_project[i, 0]], [X1[i, 1], X1_project[i, 1]], '--k', linewidth=1) # 中心点的投影 u0_project = np.dot(u0, np.dot(wu.T, wu)) plt.scatter(u0_project[:, 0], u0_project[:, 1], c='#FF4500', s=60) u1_project = np.dot(u1, np.dot(wu.T, wu)) plt.scatter(u1_project[:, 0], u1_project[:, 1], c='#696969', s=60) # 均值向量的投影点 ax.annotate(r'u0 投影点', xy=(u0_project[:, 0], u0_project[:, 1]), xytext=(u0_project[:, 0] - 0.2, u0_project[:, 1] - 0.1), size=13, va="center", ha="left", arrowprops=dict(arrowstyle="->", color="k", ) ) ax.annotate(r'u1 投影点', xy=(u1_project[:, 0], u1_project[:, 1]), xytext=(u1_project[:, 0] - 0.1, u1_project[:, 1] + 0.1), size=13, va="center", ha="left", arrowprops=dict(arrowstyle="->", color="k", ) ) plt.axis("equal") # 两坐标轴的单位刻度长度保存一致 plt.show() self.w = w self.u0 = u0 self.u1 = u1 return self def predict(self, X): project = np.dot(X, self.w.T) wu0 = np.dot(self.w, self.u0.T) wu1 = np.dot(self.w, self.u1.T) return (np.abs(project - wu1) < np.abs(project - wu0)).astype(int)if __name__ == '__main__': data_path = r'watermelon3_0_Ch.csv' data = pd.read_csv(data_path).values X = data[:, 1:3].astype(float) y = data[:, 3] y[y == '是'] = 1 y[y == '否'] = 0 y = y.astype(int) lda = LDA() lda.fit(X, y, plot_=True) print(lda.predict(X)) # 和逻辑回归的结果一致 print(y)

想要代码与数据资源的,可以加我微信好友

参考的博客:

(4条消息) 周志华《机器学习》课后习题第三章解答:Ch3.3 - 编程实现对率回归_zhangriqi的博客-CSDN博客

周志华《机器学习》课后习题(第三章):线性模型-阿里云开发者社区 (aliyun.com) 

本文链接地址:https://www.jiuchutong.com/zhishi/300247.html 转载请保留说明!

上一篇:嵌入式 Linux进程间的通信--信号(linux嵌入式开发教程)

下一篇:共享主机和 WordPress 主机之间的区别(共享主机和vps)

  • iphone13mini支持高刷吗(苹果13mini支持120hz吗)

    iphone13mini支持高刷吗(苹果13mini支持120hz吗)

  • wps2019项目符号怎么添加下划线(wps中项目符号)

    wps2019项目符号怎么添加下划线(wps中项目符号)

  • iphonex手机屏黑白了怎么调回彩色屏(iphone x 黑屏)

    iphonex手机屏黑白了怎么调回彩色屏(iphone x 黑屏)

  • 买家可以通过哪些方式找到想要购买的商品(买家可以通过哪些方法咨询卖家)

    买家可以通过哪些方式找到想要购买的商品(买家可以通过哪些方法咨询卖家)

  • 为什么抖音看不到在线状态(为什么抖音看不了直播)

    为什么抖音看不到在线状态(为什么抖音看不了直播)

  • 企业微信群和普通群有什么区别(企业微信群和普通微信群的区别在哪里)

    企业微信群和普通群有什么区别(企业微信群和普通微信群的区别在哪里)

  • 淘宝换主图要等12点吗(淘宝换主图会影响什么)

    淘宝换主图要等12点吗(淘宝换主图会影响什么)

  • 微信红包封面怎么弄(微信红包封面怎么设置自己图片)

    微信红包封面怎么弄(微信红包封面怎么设置自己图片)

  • vivo手机怎么设置小爱同学(vivo手机怎么设置锁屏时间)

    vivo手机怎么设置小爱同学(vivo手机怎么设置锁屏时间)

  • 微信移出群聊有提示么(微信移出群聊还能看见消息吗)

    微信移出群聊有提示么(微信移出群聊还能看见消息吗)

  • wps是文字处理软件吗(wps文字处理软件下载)

    wps是文字处理软件吗(wps文字处理软件下载)

  • 抖音作品小三角是啥意思(抖音作品小三角怎么关闭)

    抖音作品小三角是啥意思(抖音作品小三角怎么关闭)

  • 路由器老化症状(路由器老化的表现)

    路由器老化症状(路由器老化的表现)

  • oppo可以设置小爱同学吗(oppo手机怎么开启小屏)

    oppo可以设置小爱同学吗(oppo手机怎么开启小屏)

  • 华为手机悬浮窗设置在哪里(华为手机悬浮窗怎么调出来)

    华为手机悬浮窗设置在哪里(华为手机悬浮窗怎么调出来)

  • 华为nova4什么屏幕(华为nova4e什么屏幕)

    华为nova4什么屏幕(华为nova4e什么屏幕)

  • 云闪付具有什么功能(云闪付具有什么特征)

    云闪付具有什么功能(云闪付具有什么特征)

  • word视图模式有哪几种(word视图模式有哪几种特点)

    word视图模式有哪几种(word视图模式有哪几种特点)

  • PS怎么处理全景照片的尺寸(ps怎么处理全景图)

    PS怎么处理全景照片的尺寸(ps怎么处理全景图)

  • excel2003照相机功能在哪(excel照相机功能怎么用)

    excel2003照相机功能在哪(excel照相机功能怎么用)

  • 微信运动0步中间是虚线(微信运动是0步是不是就关闭了)

    微信运动0步中间是虚线(微信运动是0步是不是就关闭了)

  • 大西洋和特内里费山脉上空的流云,西班牙加那利群岛 (© MikeMareen/iStock/Getty Images Plus)(大西洋跟太平洋有没有融为一体?)

    大西洋和特内里费山脉上空的流云,西班牙加那利群岛 (© MikeMareen/iStock/Getty Images Plus)(大西洋跟太平洋有没有融为一体?)

  • 在 C# CLR 中学习 C++ 之了解 extern(c+c#)

    在 C# CLR 中学习 C++ 之了解 extern(c+c#)

  • 食品配送专票税率是多少
  • 企业分红缴纳所得税
  • 其他权益工具账务处理内容
  • 各行业的利润率表
  • 公司贷款利息怎么做分录
  • 研发支出的项目叫什么
  • 厂区打地坪会计怎么做账
  • 公司股东投资比例
  • 应交税费科目核算
  • 汇款手续费的会计科目
  • 建筑安装专票票样
  • 买赠销售方式的税务筹划
  • 金税盘维护费减免政策代码
  • 计提工资和应付职工薪酬怎么不一样
  • 建筑行业新老项目对比
  • 免费的企业
  • 代扣代缴个人所得税手续费是否缴纳增值税
  • 收财务拨款的贷款合法吗
  • 公司买包包送员工入可以计入什么科目?
  • 建筑企业差额征收
  • 拍卖公司如何开展业务
  • 卷烟批发环节消费税计算
  • 货物销售价比采购价高
  • 计提减值准备怎么计算?
  • 企业购买理财产品的会计分录
  • 前两个月亏损第三个月盈利所得税怎么计算
  • win11更新失败怎么办
  • bios升级失败后如何恢复
  • 鸿蒙系统怎么升级3.0
  • 车辆购置税会计科目怎么做账
  • php面向对象优点,缺点
  • player.exe是什么意思
  • 印花税申报后怎么缴费
  • 固定资产计提折旧的原则
  • 出口收汇可以收人民币吗
  • PHP:zip_close()的用法_Zip函数
  • 讲解如何使用
  • vue相关
  • lean in桑德伯格
  • 深度学习中的注意力机制模型及代码实现(SE Attention、CBAM Attention)
  • web系统的安全现状
  • 利用php抓取蜘蛛网
  • 制造费用主要核算项目
  • 报废机器设备如何缴纳增值税
  • 公司向股东个人借款的会计分录
  • 税控系统维护费普通发票可以全额抵扣吗
  • 以固定资产增资流程是怎样操作
  • mongodb的分片集群的组成部分
  • 本月的费用
  • 个税申报属于哪个部门的职责
  • 农产品加计扣除10%进项税账务处理
  • 财付通支付的优缺点
  • 增值税发票上注明的价款包含增值税吗
  • 先收款后给发票合法吗
  • 管理人员工资属于酌量性固定成本
  • 公司临时工的车可以买吗
  • 备用金怎么计入明细账
  • 专项应付款如何冲减
  • 代扣个人所得税怎么算
  • 累计折旧的计提会计分录
  • 银行汇票和银行本票区别图解
  • 个体工商户建账流程
  • sql语句压缩
  • Mysql主从同步的实现原理
  • windows自带的几个软件
  • zhudongfangyu.exe是什么进程,可以删除吗
  • mainwindow是什么程序
  • windows10粘滞键
  • win8.1无线
  • JS、jQuery中select的用法详解
  • 安卓性能测试主要测试的是
  • unity动画教程
  • javascript 进阶篇2 CSS XML学习
  • javascript零基础
  • js获取文本框的值进行计算
  • Android Path和PathMeasure类的使用之获取圆弧上的坐标值
  • 2021年徐州农村合作医疗
  • 税务执法资格考试
  • 个体工商户两处所得,如何减半个税
  • 证券行业的税务问题
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设