参考了han同学的答案,西瓜数据集也可在han同学的github上下载。

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

代码

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn import linear_model
# 下面这两行是为了让matplotlib画图时的汉字正常显示
import matplotlib
matplotlib.rc("font",family='YouYuan')# sigmoid函数def sigmoid(s):s = 1 / (1 + np.exp(-s))return s# 公式 3.27,最小化对数似然的相反数def J_cost(X, y, beta):""":param X: array , shape(num_sample, num_features):param y: array, shape(num_sample, 1):param beta: array, shape(num_features+1, 1):return: 公式3.27的结果,即对数似然相反数的值"""X_hat = np.c_[X, np.ones((X.shape[0], 1))]y = y.reshape(-1, 1)beta = beta.reshape(-1, 1)lbeta = -y*np.dot(X_hat, beta) + np.log(1 + np.exp(np.dot(X_hat, beta)))return lbeta.sum()# 公式3.30,beta的一阶导数def gradient(X, y, beta):''':param X::param y::param beta::return: result of formula 3.30'''X_hat = np.c_[X, np.ones((X.shape[0], 1))]beta = beta.reshape(-1, 1)y = y.reshape(-1, 1)p1 = np.exp(np.dot(X_hat, beta)) / (1 + np.exp(np.dot(X_hat, beta)))grad = (-X_hat*(y - p1)).sum(0)return  grad.reshape(-1, 1)# 梯度下降法,更新betadef update_parameters_gradDesc(X, y, beta, learning_rate, num_iterations, print_cost):'''使用梯度下降法更新beta,输出对数似然相反数 公式3.27 的值:param X::param y::param beta::param learning_rate::param num_iterations::param print_cost::return:'''for i in range(num_iterations):grad = gradient(X, y, beta)beta -= learning_rate * gradif (i % 100 == 0) & print_cost:print('{}th iteration, cost is {} '.format(i, J_cost(X, y, beta)))return beta# 牛顿法,海森因矩阵def hessian(X, y, beta):'''根据公式3.31求Lbeta二阶导:param X::param y::param beta::return:'''X_hat = np.c_[X, np.ones((X.shape[0], 1))]y = y.reshape(-1, 1)beta = beta.reshape(-1, 1)p1 = np.exp(np.dot(X_hat, beta)) / (1 + np.exp(np.dot(X_hat, beta)))m, n = X.shape# np.eye(m)是一个单位阵,P是方阵P = np.eye(m) * p1 * (1 -p1)assert P.shape[0] == P.shape[1]hess = np.dot(np.dot(X_hat.T, P), X_hat)return hess# 牛顿法更新参数def update_parameters_Newton(X, y, beta, num_iterations, print_cost):'''根据公式3.29更新beta:param X::param y::param beta::param learning_rate::param num_iterations::param print_cost::return: beta'''for i in range(num_iterations):grad = gradient(X, y, beta)hess = hessian(X, y, beta)beta -= np.dot(np.linalg.inv(hess), grad)if (i % 100 == 0) & print_cost:print('{}th iteration, cost is {}'.format(i, J_cost(X, y, beta)))return beta# 初始化betadef initialize_beta(n):# randn产生的样本符合正态分布beta = np.random.randn(n + 1, 1) * 0.5 + 1# print(beta)return beta# 对数几率模型def logistic_beta(X, y, num_iterations=100, learning_rate=1.2, print_cost=False, method='gradDesc'):''':param X: array shape(num_sample, num_feature):param y::param num_iterations: 迭代次数:param learning_rate: 学习率:param print_cost: 是否打印对数似然相反数:param method: 所用方法:return: beta array shape(num_feature + 1, 1)'''m, n = X.shapebeta = initialize_beta(n)if method == 'gradDesc':return update_parameters_gradDesc(X, y, beta, learning_rate, num_iterations, print_cost)elif method == 'Newton':return update_parameters_Newton(X, y, beta, num_iterations, print_cost)else:raise ValueError('Unknown error of %s' % method)# 预测def predict(X, beta):X_hat = np.c_[X, np.ones((X.shape[0], 1))]beta.reshape(-1, 1)p1 = np.exp(np.dot(X_hat, beta)) / (1 + np.exp(np.dot(X_hat, beta)))p1[p1 > 0.5] = 1p1[p1 <= 0.5] = 0temp = np.c_[X, p1]print(temp)return p1if __name__ == '__main__':data_path = r'C:\Users\***\3.3\watermelon3_0_Ch.csv '# 加载数据data = pd.read_csv(data_path).values# print(data)is_good = data[:, 9] == '是'# print(is_good)is_bad = data[:, 9] == '否'# print(is_bad)# 7、8列数据,密度和含糖量X = data[:, 7:9].astype(float)# print(X)# 第九列数据,样本标记‘是’或‘否’y = data[:, 9]# print(y)y[y == '是'] = 1y[y == '否'] = 0y = y.astype(int)# 绘图:密度为行,含糖量为列,好瓜为黑圈,坏瓜为红×plt.scatter(data[:, 7][is_good], data[:, 8][is_good], c='k', marker='o')plt.scatter(data[:, 7][is_bad], data[:, 8][is_bad], c='r', marker='x')plt.xlabel('密度')plt.ylabel('含糖量')# 可视化模型结果beta = logistic_beta(X, y, num_iterations=1000, learning_rate=2.0, print_cost=True, method='gradDesc')w1, w2, intercept = beta# 预测结果predict(X, beta)x1 = np.linspace(0, 1)# 下面这个式子我不是很明白,我觉得y1也是一个属性,对应参数w2,w2y1 = -(w1x + b),两边相减结果为0y1 = -(w1*x1 + intercept) / w2# print(x1)# print(y1)plt.plot(x1, y1, label=r'my_logistic_gradDesc')beta = logistic_beta(X, y, num_iterations=1000, learning_rate=2.0, print_cost=True, method='Newton')w1, w2, intercept = beta# 预测结果predict(X, beta)x1 = np.linspace(0, 1)# 下面这个式子我不是很明白,我觉得y1也是一个属性,对应参数w2,w2y1 = -(w1x + b),两边相减结果为0y1 = -(w1*x1 + intercept) / w2plt.plot(x1, y1, label=r'my_logistic_Newton')# 可视化sklearn Logistic regression 模型结果# 注意sklearn的逻辑回归中,C越大表示正则化程度越低lr = linear_model.LogisticRegression(solver='lbfgs', C=100)lr.fit(X, y)lr_beta = np.c_[lr.coef_, lr.intercept_]print('cost of sklearn logistic: {}'.format(J_cost(X, y, lr_beta)))w1_sk, w2_sk = lr.coef_[0, :]x2 = np.linspace(0, 1)y2 = -(w1_sk*x2 + lr.intercept_) / w2_skplt.plot(x2, y2, label=r'sklearn logistic')plt.legend(loc='upper right')plt.show()

可视化呈现

《机器学习》课后习题3.3 对率回归编程实现相关推荐

  1. 机器学习——课后习题解答

    文章目录 机器学习课后习题解答 第一章 绪论 1. 表1.1中若只包含编号为1和4的两个样例,是给出相应的版本空间. 2. 与使用单个合取式来进行假设表示相比,使用"析合范式"将使 ...

  2. 【机器学习】中国大学慕课《机器学习》课后习题(二)(回归)

    部分习题来自黄海广老师的慕课<机器学习>的课后习题,答案暂不公布,可以留言讨论. 课程链接: https://www.icourse163.org/course/WZU-146409617 ...

  3. 吴恩达机器学习课后习题——逻辑回归

    机器学习课后作业-逻辑回归 逻辑回归 逻辑回归算法,是一种给分类算法,这个算法的实质是:它输出值永远在0到 1 之间. 将要构建一个逻辑回归模型来预测,某个学生是否被大学录取.设想你是大学相关部分的管 ...

  4. Python吴恩达机器学习课后习题作业一算法(Ⅰ)(1)

    吴恩达老师的机器学习课程是机器学习入门者必看的经典之一,其课后习题也是典中典.下面将在以Python为语言工具完成课后习题. 问题一:单元线性回归 问题:根据城市人口数量,预测开小吃店的利润 下面我将 ...

  5. 斯坦福大学(吴恩达) 机器学习课后习题详解 第三周 逻辑回归

    测试题 都比较简单,好好看视频吧 知乎: https://zhuanlan.zhihu.com/albertwang 微信公众号:AI-Research-Studio ​ ​​ 下面是赞赏码

  6. 周志华机器学习课后习题解析【第二章】

    作者 | 我是韩小琦 链接 | https://zhuanlan.zhihu.com/p/42435889 2.1 数据集包含 1000 个样本,其中 500 个正例. 500 个反例,将其划分为包含 ...

  7. 吴恩达机器学习-课后习题

    原题参考链接https://www.kesci.com/home/project/5e0f01282823a10036b280a7 第 1 题 一个计算机程序从经验E中学习任务T,并用P来衡量表现.并 ...

  8. 【课程作业】西瓜书 机器学习课后习题 : 第五章

    目录 简介 说明 5.1 5.2 5.3 结语 简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出-   ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介 ...

  9. 斯坦福大学(吴恩达) 机器学习课后习题详解 第三周 正则化

    正则化测试题: 知乎: https://zhuanlan.zhihu.com/albertwang 微信公众号:AI-Research-Studio ​ ​​ 下面是赞赏码

最新文章

  1. PyTorch 《动手学深度学习》学习笔记(Dive-into-DL-Pytorch)
  2. SQL Server 2005“备份集中的数据库备份与现有的数据库不同”解决方法此信息转载自BlueSky's Blog,www.heuupk.com,为尊重无价的知识请保留此版权信息。...
  3. 个人阅读 代码大全的阅读与提问
  4. linux war版本管理,linux(centos8):用systemctl管理war包形式的jenkins(java 14 / jenkins 2.257)...
  5. python数据库更新消息提醒_用Python实现校园通知更新提醒功能
  6. error: not found: value SparkSession
  7. ssl初一组周六模拟赛【2018.3.24】
  8. 与詹金斯一起连续交付Heroku
  9. 人一生中最该看清的5个真相
  10. 玄学小记.5 ~ Bluestein's algorithm
  11. Cron 触发器及相关内容 (第四部分)
  12. Cabin, 手机端的Kubernetes管理app
  13. 泛型与容器连载(一)泛型的基本概念和原理
  14. redis JAVA hmset_Spring boot 连接Redis实现HMSET操作
  15. 在线JSON格式化美化
  16. 高项 人力资源管理论文
  17. 一年时间,拿到了人生中的第一个20万
  18. 第二届金融交易技术大会拥抱Fin Tech-创新、科技、融合在沪圆满落幕!
  19. 滴滴单通道语音分离与目标说话人提取和抑制技术进展
  20. linux桌面环境调整时钟,小技巧:Linux个性化面版时钟显示

热门文章

  1. codevs 1086
  2. Python爬虫编程思想(87):项目实战--抓取豆瓣电影排行榜
  3. 使用VM安装Mac OS
  4. 《加州消费者隐私法案》解读合集,CCPA手册发布,助力企业出海合规
  5. C++ | 矩阵类模板(类模板)
  6. 单片机实验之汽车转向灯控制
  7. 如何有效利用地铁上的时间,我的实习期度过
  8. 第二十二章《记事本》第2节:记事本功能实现
  9. HINT: Use the Theano flag 'exception_verbosity=high' for a debugprint and storage map footprint of t
  10. 利用matlab求解伊藤公式(ito公式)【matlab工具集_02】