GYH's Blog - Python
type: channel
link: https://www.imgyh.com/tag/Python/
items: 吴恩达机器学习笔记1--线性回归与逻辑回归
items: requests详解
items: BeautifulSoup详解
items: Python数据可视化
items: Python网络爬虫

吴恩达机器学习笔记1--线性回归与逻辑回归
type: item
date: 2021-08-18T20:37:00+08:00
description: 引言机器学习定义引用 Tom Mitchell的定义，Tom 定义的机器学习是，一个好的学习问题定义如下，他说，一个程序被认为能从经验E 中学习，解决任务T ，达到性能度量值P ，当且仅当，有了经验E 后，经过P 评判，程序在处理T时的性能有所提升。监督学习与无监督学习监督学习：监督学习指的就是我们给学习算法一个数据集，这个数据集由“正确答案”组成，数据集中每一个数据都有对应的值。如线性回归，逻辑回归。无监督学习：无监督学习指的是数据集中没有任何标签或者是有相同的标签或者就是没标签。所以我们已知数据集，却不知如何处理，也未告知每个数据点是什么。别的都不知道，就是一个数据集。如聚类。线性回归单变量线性回归假设函数：$h_\theta \left( x \right)=\theta_{0}+\theta_{1}x$代价函数： $J \left( \theta_0, \theta_1 \right) = \frac{1}{2m}\sum\limits_{i=1}^m \left( h_{\theta}(x^{(i)})-y^{(i)} \right)^{2}$批量梯度下降（batch gradient descent ）：${\theta_{j}}:={\theta_{j}}-\alpha \frac{\partial }{\partial {\theta_{j}}}J\left(\theta \right)$$m$代表训练集中实例的数量$x$ 代表特征/输入变量$y$ 代表目标变量/输出变量$\left( x,y \right)$ 代表训练集中的实例$({{x}^{(i)}},{{y}^{(i)}})$ 代表第$i$ 个观察实例$h$ 代表学习算法的解决方案或函数也称为假设（hypothesis）梯度下降算法：线性回归问题运用梯度下降法，关键在于求出代价函数的导数，即：$\frac{\partial }{\partial {{\theta }_{j}}}J({{\theta }_{0}},{{\theta }_{1}})=\frac{\partial }{\partial {{\theta }_{j}}}\frac{1}{2m}{{\sum\limits_{i=1}^{m}{\left( {{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}} \right)}}^{2}}$$j=0$ 时：$\frac{\partial }{\partial {{\theta }_{0}}}J({{\theta }_{0}},{{\theta }_{1}})=\frac{1}{m}{{\sum\limits_{i=1}^{m}{\left( {{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}} \right)}}}$$j=1$ 时：$\frac{\partial }{\partial {{\theta }_{1}}}J({{\theta }_{0}},{{\theta }_{1}})=\frac{1}{m}\sum\limits_{i=1}^{m}{\left( \left( {{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}} \right)\cdot {{x}^{(i)}} \right)}$则算法改写成：Repeat {${\theta_{0}}:={\theta_{0}}-a\frac{1}{m}\sum\limits_{i=1}^{m}{ \left({{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}} \right)}$${\theta_{1}}:={\theta_{1}}-a\frac{1}{m}\sum\limits_{i=1}^{m}{\left( \left({{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}} \right)\cdot {{x}^{(i)}} \right)}$}多变量线性回归单变量线性回归类似，在多变量线性回归中，我们也构建一个代价函数，则这个代价函数是所有建模误差的平方和，即：$J\left( {\theta_{0}},{\theta_{1}}...{\theta_{n}} \right)=\frac{1}{2m}\sum\limits_{i=1}^{m}{{{\left( h_{\theta} \left({x}^{\left( i \right)} \right)-{y}^{\left( i \right)} \right)}^{2}}}$，其中：$h_{\theta}\left( x \right)=\theta^{T}X={\theta_{0}}+{\theta_…

requests详解
type: item
date: 2021-01-29T10:53:00+08:00
description: 发送请求HTTP请求类型有这么几种：GET，POST，PUT，DELETE，HEAD 以及 OPTIONS，下面分别进行介绍requestrequest是requests中的一个重要方法，所有的HTTP请求都是基于这个方法request(method, url, **kwargs)method：请求方式OPTIONS, HEAD, POST, PUT, PATCH, or DELETEurl：请求的网址**kwargs：其他可选参数params：字典或字节序列，作为参数增加到url中data：字典、字节序列或文件对象，作为Request的内容json：JSON格式的数据，作为Request的内容。headers：字典，HTTP定制请求头cookies：字典或CookieJar，Request中的cookiefiles：字典，用于传输文件auth：元组，支持HTTP的认证功能timeout：设定超时时间，单位为秒allow_redirects：布尔，重定向开关。默认Trueproxies：字典，设定代理服务器，可以增加登录认证verify：布尔，认证SSL证书的开关。默认Truestream：布尔，获取内容立即下载开关。默认Truecert：本地SSL证书路径stream：布尔，获取内容立即下载开关。默认TrueGET请求get(url, params=None, **kwargs)参数与上面的request一致，例如：r = requests.get('https://api.github.com/events')POST请求post(url, data=None, json=None, **kwargs)参数与上面的request一致，例如：r = requests.post('http://httpbin.org/post', data = {'key':'value'})PUT请求put(url, data=None, **kwargs)参数与上面的request一致，例如：r = requests.put('http://httpbin.org/put', data = {'key':'value'})DELETE请求delete(url, **kwargs)参数与上面的request一致，例如：r = requests.delete('http://httpbin.org/delete')HEAD请求head(url, **kwargs)参数与上面的request一致，例如：r = requests.head('http://httpbin.org/get')OPTIONS请求options(url, **kwargs)参数与上面的request一致，例如：r = requests.options('http://httpbin.org/get')向url传递参数url_params = {'key':'value'} # 字典传递参数，如果值为None的键不会被添加到url中 r = requests.get('your url',params = url_params) print(r.url) # 打印内容your url?key=value响应内容r.encoding #获取当前的编码 r.encoding = 'utf-8' #设置编码 r.text #以encoding解析返回内容。字符串方式的响应体，会自动根据响应头部的字符编码进行解码。 r.content #以字节形式（二进制）返回。字节方式的响应体，会自动为你解码 gzip 和 deflate 压缩。 r.request.headers #获取请求头 r.headers #以字典对象存储服务器响应头，但是这个字典比较特殊，字典键不区分大小写，若键不存在则返回None r.headers['Content-Type'] #访问headers的Content-Type内容 r.headers.get('Content-Type') #访问响应头部分内容的两种方式 r.request._cookies #获取请求的cookie r.cookies #获取响应的cookie r.cookies['example_cookie_name'] #读取cookies r.history #返回重定向信息,当然可以在请求是加上allow_redirects = false 阻止重定向 r.status_code #响应状态码 r.raw #返回原始响应体，也就是 urllib 的 response 对象，使用 r.raw.read() r.ok # 查看r.ok的布尔值便可以知道是否登陆成功 #*特殊方法*# r.json() #Requests中内置的JSON解…

BeautifulSoup详解
type: item
date: 2021-01-28T22:03:00+08:00
description: BeautifulSoup4简介参考： http://www.jsphp.net/python/show-24-214-1.htmlBeautifulSoup4是爬虫必学的技能。BeautifulSoup最主要的功能是从网页抓取数据，Beautiful Soup自动将输入文档转换为Unicode编码，输出文档转换为utf-8编码。BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器，如果我们不安装它，则 Python 会使用 Python默认的解析器，lxml 解析器更加强大，速度更快，推荐使用lxml 解析器。BeautifulSoup4和 lxml 一样，Beautiful Soup 也是一个HTML/XML的解析器，主要的功能也是如何解析和提取 HTML/XML 数据。BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器，如果我们不安装它，则 Python 会使用 Python默认的解析器，lxml 解析器更加强大，速度更快，推荐使用lxml 解析器。Beautiful Soup自动将输入文档转换为Unicode编码，输出文档转换为utf-8编码。你不需要考虑编码方式，除非文档没有指定一个编码方式，这时，Beautiful Soup就不能自动识别编码方式了。然后，你仅仅需要说明一下原始编码方式就可以了。BeautifulSoup4主要解析器，以及优缺点BeautifulSoup4简单使用假设有这样一个Html，具体内容如下： 百度一下，你就知道 新闻 hao123 地图 视频 贴吧 更多产品 from bs4 import BeautifulSoup file = open('./aa.html', 'rb') html = file.read() bs = BeautifulSoup(html,"html.parser") # 缩进格式 print(bs.prettify()) # 格式化html结构 print(bs.title) # 获取title标签的名称 print(bs.title.name) # 获取title的name print(bs.title.string) # 获取head标签的所有内容 print(bs.head) print(bs.div) # 获取第一个div标签中的所有内容 print(bs.div["id"]) # 获取第一个div标签的id的值 print(bs.a) print(bs.find_all("a")) # 获取所有的a标签 print(bs.find(id="u1")) # 获取id="u1" for item in bs.find_all("a"): print(item.get("href")) # 获取所有的a标签，并遍历打印a标签中的href的值 for item in bs.find_all("a"): print(item.get_text()) # 获取所有的a标签，并遍历打印a标签中的内容BeautifulSoup4四大对象种类BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:TagNavigableStringBeautifulSoupCommentTagTag通俗点讲就是HTML中的一个个标签，例如：from bs4 import BeautifulSoup file = open('./aa.html', 'rb') html = file.read() bs = BeautifulSoup(html,"html.parser") # 获取title标签的所有内容 print(bs.title) # 获取head标签的所有内容 print(bs.head) # 获取第一个a标签的所有内容 print(bs.a) # 类型 print(type(bs.a))我们可以利用 soup 加标签名轻松地获取这些标签的内容，这些对象的类型是bs4.element.Tag。但是注意，它查找的是在所有内容中的第一个符合要求的标签。对于 Tag，它有两个重要的属性，是 name 和 attrs:from bs4 import BeautifulSoup file = open('./aa.html', 'rb') html = file.read() bs = BeautifulSoup(html,"html.parser") # [document] #bs 对象本身比较特殊，它的 name 即为 [document] print(bs.name) # head #对于其他内部标签，输出的值便为标签本身的名称 p…

Python数据可视化
type: item
date: 2021-01-28T09:27:00+08:00
description: FlaskFlask简介Flask作为Web框架，它的作用主要是为了开发Web应用程序。那么我们首先来了解下Web应用程序。Web应用程序 (World Wide Web)诞生最初的目的，是为了利用互联网交流工作文档。一切从客户端发起请求开始。所有Flask程序都必须创建一个程序实例。当客户端想要获取资源时，一般会通过浏览器发起HTTP请求。此时，Web服务器使用一种名为WEB服务器网关接口的WSGI（Web Server Gateway Interface）协议，把来自客户端的请求都交给Flask程序实例。Flask使用Werkzeug来做路由分发（URL请求和视图函数之间的对应关系）。根据每个URL请求，找到具体的视图函数。在Flask程序中，路由一般是通过程序实例的装饰器实现。通过调用视图函数，获取到数据后，把数据传入HTML模板文件中，模板引擎负责渲染HTTP响应数据，然后由Flask返回响应数据给浏览器，最后浏览器显示返回的结果。Flask诞生于2010年，是Armin ronacher（人名）用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架。它主要面向需求简单的小应用。Flask本身相当于一个内核，其他几乎所有的功能都要用到扩展（邮件扩展Flask-Mail，用户认证FlaskLogin），都需要用第三方的扩展来实现。比如可以用Flask-extension加入ORM、窗体验证工具，文件上传、身份验证等。Flask没有默认使用的数据库，你可以选择MySQL，也可以用NoSQL。其 WSGI 工具箱采用 Werkzeug（路由模块） ，模板引擎则使用 Jinja2 。可以说Flask框架的核心就是Werkzeug和Jinja2。Python最出名的框架要数Django，此外还有Flask、Tornado等框架。虽然Flask不是最出名的框架，但是Flask应该算是最灵活的框架之一，这也是Flask受到广大开发者喜爱的原因。Flask扩展包：Flask-SQLalchemy：操作数据库；Flask-migrate：管理迁移数据库；Flask-Mail:邮件；Flask-WTF：表单；Flask-script：插入脚本；Flask-Login：认证用户状态；Flask-RESTful：开发REST API的工具；Flask-Bootstrap：集成前端Twitter Bootstrap框架；Flask-Moment：本地化日期和时间；Flask基本使用Hello World 程序from flask import Flask # Flask类接收一个参数__name__ app = Flask(__name__) # 路由解析通过用户访问的路径，匹配相应的函数 # 装饰器的作用是将路由映射到视图函数index @app.route("/") def index(): return "hello,world" # Flask应用程序实例的run方法启动WEB服务器 if __name__ == "__main__": app.run(debug=True, host="0.0.0.0",port=3000) # debug 开启调试，更改代码内容，界面相应改变； # host改成0.0.0.0让其他机器可以访问 # port=3000端口号路由传参有时我们需要将同一类URL映射到同一个视图函数处理，比如：使用同一个视图函数 来显示不同用户的个人信息。通过向规则参数添加变量部分，可以动态构建URL。此变量部分标记为。它作为关键字参数传递给与规则相关联的函数。from flask import Flask app = Flask(__name__) @app.route("/index") def index(): return "hello,world" # 通过访问路径获取用户的字符串参数 @app.route("/user/<name>") # <name>表示name参数，需要将路径中的name参数传入下面的函数中 def Wellcome(name): return "你好%s"%name # 通过访问路径获取用户的整形参数 # 路由传递的参数默认当做string处理，这里指定int，尖括号中冒号后面的内容是动态的 # 除此之外还有 float 型 @app.route("/user/<int:id>") def Wellcome1(id): return "你好%d号会员"%id # 路由的路径不能重复，用户通过唯一路径访问特定函数 if __name__ == "__main__": app.run(debug=True, host="0.0.0.0",port=3000)使用 render…

Python网络爬虫
type: item
date: 2021-01-26T10:14:00+08:00
description: 准备工作该笔记围绕豆瓣TOP250页面进行学习，爬取豆瓣TOP250影片信息。网址为 https://movie.douban.com/top250?start=25 其中 ?start=25 表示显示第25个以后的25个影片信息，如果不加该参数，则从第一个开始显示。我们需要安装相应的第三方模块，如下from bs4 import BeautifulSoup #网页解析获取数据 import re #正则表达式进行文字匹配 import urllib.request , urllib.error , requests #网页请求 import xlwt #进行Excel操作 import sqlite3 #进行sqlite数据库操作项目流程# 主函数 def main(): baseurl = "https://movie.douban.com/top250?start=" # 1.爬取网页 GetData(baseurl) # 3.保存数据 savepath = "./top250.xls" SaveData(savepath) def GetData(baseurl): datalist=[] # 2.边爬取边解析数据 return datalist def SaveData(savepath): pass if __name__ == "__main__": main()urllib库介绍基本的请求 是python内置的一个http请求库，不需要额外的安装。只需要关注请求的链接，参数，提供了强大的 解析。urllb.request 请求模块urllib.error 异常处理模块urllib.parse 解析模块参考： https://www.cnblogs.com/qikeyishu/p/10748497.html# get请求 import urllib.request , urllib.error response=urllib.request.urlopen("http://www.baidu.com") print(response.read().decode("utf-8")) #对读到的响应转码成utf-8 print(response.status) # 获取状态码 print(response.getheaders()) #获取所有响应头信息 print(response.getheader("Bdqid")) #获取某个响应头信息 # post请求 import urllib.request , urllib.error import urllib.parse data = bytes(urllib.parse.urlencode({"hello":"world"}),encoding="utf-8") #生成测试数据 res = urllib.request.urlopen("http://httpbin.org/post",data=data) print(res.read().decode("utf-8")) # 超时处理 import urllib.request , urllib.error try: response=urllib.request.urlopen("http://www.baidu.com",timeout=0.01) # 设置超时时间，超过0.01s没返回就报错 print(response.read().decode("utf-8")) except urllib.error.URLError as result: print("Time Out!") # 封装请求头访问 import urllib.request , urllib.error import urllib.parse url="http://httpbin.org/post" data = bytes(urllib.parse.urlencode({"hello":"world"}),encoding="utf-8") #生成测试数据 headers={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36" } req = urllib.request.Request(url=url,data=data,headers=headers,method="POST") #封装请求对象,由于urlopen无法传参数，声明一个Request对象 res = urllib.request.urlopen(req…