【自学笔记】支持向量机(1)

news/2024/9/18 6:24:27/ 标签: 笔记, 支持向量机, 算法, 机器学习, 人工智能

一些概念

  支持向量机(Support Vector Machine,简称SVM)是一种广受欢迎的监督学习算法,主要用于分类和回归分析。在分类问题中,SVM的主要目标是在训练数据中找到一个超平面。这个超平面不仅能够准确地区分不同类别的样本,而且还能最大化不同类别样本到该超平面的最小距离,这个距离被称为“间隔”(margin)。

  超平面是一个重要的数学概念。在n维空间中,超平面是一个维度为n-1的子空间,它将空间划分成两个半空间。
  超平面可以被看作是平面概念的推广,就像在二维空间中,直线是一维的超平面;在三维空间中,平面是二维的超平面。
  在数学上,n维空间中的超平面可以通过一个线性方程来定义,即:

w 1 x 1 + w 2 x 2 + . . . + w n x n + b = 0 w_{1}x_{1}+w_{2}x_{2}+...+w_{n}x_{n}+b=0 w1x1+w2x2+...+wnxn+b=0
用向量写作 w ⃗ T x ⃗ + b = 0 \vec{w}^{T}\vec{x}+b=0 w Tx +b=0

  超平面的法向量是指与超平面垂直的向量,能够指示超平面的方向。

  点到超平面或超平面到超平面的间隔即它们间的距离。公式为:

x 0 ⃗ = ( x 01 , x 02 , . . . x 0 n ) \vec{x_{0}}=(x_{01}, x_{02}, ... x_{0n}) x0 =(x01,x02,...x0n) (点)
∣ ∣ w ⃗ ∣ ∣ = ∑ i = 1 n w i 2 ||\vec{w}||=\sqrt{\sum_{i=1}^{n}w_{i}^{2} } ∣∣w ∣∣=i=1nwi2 (模)

d = ∣ w ⃗ T x 0 ⃗ + b ∣ ∣ ∣ w ⃗ ∣ ∣ d=\frac{|\vec{w}^{T}\vec{x_{0}}+b|}{||\vec{w}||} d=∣∣w ∣∣w Tx0 +b (间隔)

  正超平面是离决策边界最近的一个超平面,位于决策边界的正类别一侧。数学定义为:

w ⃗ T x ⃗ + b = 1 \vec{w}^{T}\vec{x}+b=1 w Tx +b=1

  负超平面是离决策边界最近的一个超平面,位于决策边界的负类别一侧。数学定义为:

w ⃗ T x ⃗ + b = − 1 \vec{w}^{T}\vec{x}+b=-1 w Tx +b=1

支持向量机SVM

  对于一个训练集,有时能找到很多有效的决策边界来实现分类任务,但不同的决策边界在新的测试集中的表现各不相同。而SVM采用最大化间隔的标准来挑选出一种较优的决策边界,可以有效减少过拟合。

在这里插入图片描述
  对于一个决策边界,我们可以将它视作这个数据集维度下的超平面 ( w ⃗ T , b ) = w ⃗ T x ⃗ + b = 0 (\vec{w}^{T}, b)=\vec{w}^{T}\vec{x}+b=0 (w T,b)=w Tx +b=0。假设该超平面已经能正确将训练样本分类,即满足两类样本 − 1 , + 1 {-1, +1} 1,+1已经分到了正负超平面的两侧:

y i = + 1 y_{i}=+1 yi=+1,那么 w ⃗ T x ⃗ + b ≥ + 1 \vec{w}^{T}\vec{x}+b \ge +1 w Tx +b+1
y i = − 1 y_{i}=-1 yi=1,那么 w ⃗ T x ⃗ + b ≤ − 1 \vec{w}^{T}\vec{x}+b \le -1 w Tx +b1

  如右图,距离超平面最近的几个训练样本点使等号成立,它们被称为“支持向量”(support vector)。显然,正负超平面的间隔等于两个异类支持向量到超平面 ( w ⃗ T , b ) (\vec{w}^{T}, b) (w T,b)的间隔之和,记作 γ \gamma γ,有:

γ = 2 ∣ ∣ w ⃗ ∣ ∣ \gamma = \frac{2}{||\vec{w}||} γ=∣∣w ∣∣2

  显然,正负超平面离地越远,不同类别的数据的差异就体现地越明显,于是,我们希望找到具有“最大间隔”的划分超平面,即找到这样的参数 w ⃗ \vec{w} w b b b,使得:

min ⁡ w ⃗ , b ∣ ∣ w ⃗ ∣ ∣ \min_{\vec{w}, b}||\vec{w}|| minw ,b∣∣w ∣∣

s.t. y i ( w ⃗ T x i ⃗ + b ) ≥ 1 , i = 1 , 2 , . . . , m y_{i}(\vec{w}^{T}\vec{x_{i}}+b) \ge 1, i=1,2,...,m yi(w Txi +b)1,i=1,2,...,m

PS: s.t. 意思是 subject to, 即受限于…, 满足…
PS: m 表示数据组数

  这就是SVM要解决的问题。

凸二次规划求解

一些定义

在这里插入图片描述

在这里插入图片描述  简单理解:海森矩阵是将函数在某一点处的所有二阶偏导数组织成一个矩阵的形式,这个矩阵可以提供函数在该点局部行为的详细信息。海森矩阵也记作 H = ▽ 2 f ( x ) H=\bigtriangledown ^{2}f(x) H=2f(x)

在这里插入图片描述

  我们有这样的定理:若函数在任一点的海森矩阵是半正定的,那么这个函数是凸函数。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

凸二次规划问题

在这里插入图片描述
在这里插入图片描述
  

转化原问题为凸二次规划问题

  这里我们用拉格朗日乘子法

  (1) 构建拉格朗日函数:令 α ⃗ = ( α 1 , α 2 , . . . α m ) \vec{\alpha} = (\alpha_{1},\alpha_{2},...\alpha_{m}) α =(α1,α2,...αm)是与不等式约束向对应的拉格朗日乘子向量。则拉格朗日函数 L ( w ⃗ , b , α ⃗ ) L(\vec{w}, b, \vec{\alpha}) L(w ,b,α )定义为:

L ( w ⃗ , b , α ⃗ ) = 1 2 ∣ ∣ w ⃗ ∣ ∣ 2 − ∑ i = 1 m α i [ y i ( w ⃗ T x ⃗ i + b ) − 1 ] L(\vec{w},b,\vec{\alpha})=\frac{1}{2}||\vec{w}||^{2}-\sum_{i=1}^{m}\alpha _{i}[y_{i}(\vec{w}^{T}\vec{x}^{i}+b)-1] L(w ,b,α )=21∣∣w 2i=1mαi[yi(w Tx i+b)1]

  (2)定义KKT条件。举个例子,一个二次函数的最小值满足 △ = 0 \bigtriangleup =0 =0。对于这个复杂的命题,也可以有类似的想法。当函数的某个点满足KKT条件,则这个点就是全局最优解(凸函数的局部最优解即全局最优点)。KKT条件包括:

    (i)驻点条件(Stationarity):表示在最优解处,对于变量 w ⃗ \vec{w} w b b b拉格朗日函数的梯度必须为零,即:

▽ w ⃗ L ( w ⃗ , b , α ⃗ ) = w ⃗ − ∑ i = 1 m α i y i x ⃗ i = 0 \bigtriangledown _{\vec{w}}L(\vec{w},b,\vec{\alpha})=\vec{w}-\sum_{i=1}^{m}\alpha_{i}y_{i}\vec{x}_{i}=0 w L(w ,b,α )=w i=1mαiyix i=0
▽ b L ( w ⃗ , b , α ⃗ ) = − ∑ i = 1 m α i y i = 0 \bigtriangledown _{b}L(\vec{w},b,\vec{\alpha})=-\sum_{i=1}^{m}\alpha_{i}y_{i}=0 bL(w ,b,α )=i=1mαiyi=0

    (ii)原问题可行性(Primal Feasibility):约束条件必须满足。即:

y i ( w ⃗ T x i ⃗ + b ) ≥ 1 y_{i}(\vec{w}^{T}\vec{x_{i}}+b) \ge 1 yi(w Txi +b)1 ( i = 1 , 2 , . . . , m ) (i=1,2,...,m) (i=1,2,...,m)

    (iii)对偶可行性(Dual Feasibility):拉格朗日乘子必须非负。即:

α i ≥ 0 \alpha_{i} \ge 0 αi0,   ( i = 1 , . . . , m ) (i=1,...,m) (i=1,...,m)

     (iv)互补松弛性(Complementary Slackness):先定义一个约束条件是活动的(active),当在某个点处该约束刚好达到其允许的最大或最小值(即取等)。而在拉格朗日乘子法中,这些活动的约束条件对应的拉格朗日乘子通常为非零,体现这个约束的重要性;对应的,非活动的(inactive)约束条件对应的拉格朗日乘子通常为零,表明它们在当前解中是冗余的或非限制性的。
     所以,互补松弛性表述为:

α i [ y i ( w ⃗ T x ⃗ i + b ) − 1 ] = 0 \alpha _{i}[y_{i}(\vec{w}^{T}\vec{x}^{i}+b)-1]=0 αi[yi(w Tx i+b)1]=0,   ( i = 1 , . . . , m ) (i=1,...,m) (i=1,...,m)

α i \alpha _{i} αi y i ( w ⃗ T x ⃗ i + b ) − 1 y_{i}(\vec{w}^{T}\vec{x}^{i}+b)-1 yi(w Tx i+b)1至少有一个为0


    以上四个条件描述了最优解应该满足的性质,其中从驻点条件中,我们可以解出 w ⃗ \vec{w} w b b b关于 α ⃗ \vec{\alpha} α 的关系式:

w ⃗ = ∑ i = 1 m α i y i x ⃗ i \vec{w}=\sum_{i=1}^{m}\alpha _{i}y_{i}\vec{x}_{i} w =i=1mαiyix i

    代入 L L L后得到新的函数 g ( α ⃗ ) g(\vec{\alpha}) g(α )

g ( α ⃗ ) = ∑ i = 1 m α i − 1 2 ∑ i = 1 m ∑ j = 1 m α i α j y i y j x ⃗ i T x j ⃗ g(\vec{\alpha})=\sum_{i=1}^{m}\alpha _{i}-\frac{1}{2} \sum_{i=1}^{m}\sum_{j=1}^{m}\alpha_{i}\alpha_{j}y_{i}y_{j}\vec{x}_{i}^{T}\vec{x_{j}} g(α )=i=1mαi21i=1mj=1mαiαjyiyjx iTxj

    当最小化 ∣ ∣ w ∣ ∣ 2 ||w||^{2} ∣∣w2和最大化 g ( α ⃗ ) g(\vec{\alpha}) g(α )这两个命题同时满足了KKT条件,它们解的数值相等。称前者为原命题,后者为对偶命题。于是目标变成求解以下问题:

    max ⁡ α ⃗ g ( α ⃗ ) \max _{\vec{\alpha}}g(\vec{\alpha}) maxα g(α )

s . t . s.t. s.t. α i ≥ 0 \alpha_{i} \ge 0 αi0,   ( i = 1 , . . . , m ) (i=1,...,m) (i=1,...,m)

    ∑ i = 1 m α i y i = 0 \sum_{i=1}^{m}\alpha_{i}y_{i}=0 i=1mαiyi=0

    对比式子可以发现这正是一个二次规划问题。解出 α \alpha α后即可由 w ⃗ = ∑ i = 1 m α i y i x ⃗ i \vec{w}=\sum_{i=1}^{m}\alpha _{i}y_{i}\vec{x}_{i} w =i=1mαiyix i求出最初想要的 w ⃗ \vec{w} w

    注意,条件 y i ( w ⃗ T x i ⃗ + b ) ≥ 1 y_{i}(\vec{w}^{T}\vec{x_{i}}+b) \ge 1 yi(w Txi +b)1 ( i = 1 , 2 , . . . , m ) (i=1,2,...,m) (i=1,2,...,m)会在后续求解中自动满足。

解决

  我们可以用通用的方法解决二次规划问题,但是该问题的规模正比于训练样本数,会造成很大的开销。所以,针对这个特定的问题的特性,人们提出了一些高效的算法。在《机器学习》中提到的是SMO算法

步骤

  (1)初始化。
      ⋅ \cdot 选择一个初始的 α \alpha α值,通常可以随机选取或置为0。

  (2)选择两个变量。
      ⋅ \cdot 选择第一个变量 α 1 \alpha _{1} α1。通常,从违反KKT条件最严重的 α \alpha α开始,也可以随机选择。
      ⋅ \cdot 选择第二个优化变量 α 2 \alpha _{2} α2。这个选择不是随机的,而是基于启发式规则,以加速收敛。常见的策略是选择能够使目标函数最大下降的 α 2 \alpha _{2} α2,也可以说选取的两个变量对应的样本之间的间隔最大。
      SMO算法每次选择两个变量,固定其他变量,这样有利于减少运算的时间和空间(主要体现为避免了大矩阵之间的运算)。

  (3)计算边界
      ⋅ \cdot 确定 α 1 \alpha_{1} α1 α 2 \alpha_{2} α2的上下界 L L L H H H。记 α 1 \alpha_{1} α1 α 2 \alpha_{2} α2对应的样本点为 ( x ⃗ 1 , y 1 ) (\vec{x}_{1}, y_{1}) (x 1,y1) ( x ⃗ 2 , y 2 ) (\vec{x}_{2}, y_{2}) (x 2,y2)
        ⋅ \cdot y 1 ≠ y 2 y_{1}\neq y_{2} y1=y2 α 1 \alpha_{1} α1 α 2 \alpha_{2} α2将朝着相反的方向移动,此时上下界 L L L H H H应该这样计算:

L = max ⁡ ( 0 , α 2 − α 1 ) L=\max (0, \alpha_{2}-\alpha_{1}) L=max(0,α2α1)
H = min ⁡ ( C , C + α 2 − α 1 ) H=\min (C, C+\alpha_{2}-\alpha_{1}) H=min(C,C+α2α1)

C C C是SVM中的惩罚参数,控制了错误分类的惩罚强度。在SVM的优化问题中, α i \alpha_{i} αi的值必须在 0 0 0 C C C之间,这反映了KKT条件中的不等式约束。
 这样定义的原因是确保 α 2 \alpha_{2} α2的更新值不会小到负数,同时也不会超过 C C C

        ⋅ \cdot y 1 = y 2 y_{1} = y_{2} y1=y2 α 1 \alpha_{1} α1 α 2 \alpha_{2} α2将朝着相反的方向移动,此时上下界 L L L H H H应该这样计算:

L = max ⁡ ( 0 , α 1 + α 2 − C ) L=\max (0, \alpha_{1}+\alpha_{2}-C) L=max(0,α1+α2C)
H = min ⁡ ( C , α 1 + α 2 ) H=\min (C, \alpha_{1}+\alpha_{2}) H=min(C,α1+α2)

 这里,下界确保了 α 2 \alpha_{2} α2的值不会低于0(考虑到 α 1 \alpha_{1} α1 α 2 \alpha_{2} α2的增加或减少是同步的),而上界则限制了 α 2 \alpha_{2} α2的值不会超过 C C C

  (4)更新 α 2 \alpha_{2} α2。 在合法区间内找到最优的更新值,若不使用核函数,会用以下式子:

它们的实际类别标签与当前模型预测的结果之间的差距
E 1 = g ( x ⃗ 1 ) − y 1 E_{1}=g(\vec{x}_{1})-y_{1} E1=g(x 1)y1
E 2 = g ( x ⃗ 2 ) − y 2 E_{2}=g(\vec{x}_{2})-y_{2} E2=g(x 2)y2

α 2 ′ = α 2 + y 2 ( E 1 − E 2 ) k 11 + k 22 − 2 k 12 \alpha^{'}_{2}=\alpha_{2}+\frac{y_{2}(E_{1}-E_{2})}{k_{11}+k_{22}-2k_{12}} α2=α2+k11+k222k12y2(E1E2)
其中 k i j = x ⃗ i ⋅ x ⃗ j k_{ij}=\vec{x}_{i} \cdot \vec{x}_{j} kij=x ix j

    然后调整,如果新的 α 2 \alpha_{2} α2超出了 L L L H H H,则裁剪成 L L L H H H

  (5)更新 α 1 \alpha_{1} α1。保持 ∑ i = 1 m α i y i = 0 \sum_{i=1}^{m}\alpha_{i}y_{i}=0 i=1mαiyi=0即可。

  (6)更新 b b b懒得敲公式了
在这里插入图片描述

在这里插入图片描述  以上是GPT给出的方法,不知道对不对,感觉说的很有道理。《机器学习》中则利用支持向量的性质给出更新式:

注意到对于所有支持向量 ( x ⃗ s , y s ) (\vec{x}_{s}, y_{s}) (x s,ys),满足:
y i ( w ⃗ T x i ⃗ + b ) = 1 y_{i}(\vec{w}^{T}\vec{x_{i}}+b)=1 yi(w Txi +b)=1,  即:
y i ( ∑ i = 1 m α i y i x ⃗ i T x s ⃗ + b ) = 1 y_{i}(\sum_{i=1}^{m}\alpha _{i}y_{i}\vec{x}_{i}^{T}\vec{x_{s}}+b)=1 yi(i=1mαiyix iTxs +b)=1

为了模型更好的性能,采用所有的支持向量并取均值,得:
b = 1 ∣ S ∣ ∑ s ∈ S ( 1 y s − ∑ i = 1 m α i y i x ⃗ i T x s ⃗ ) b=\frac{1}{|S|}\sum_{s \in S}^{}(\frac{1}{y_{s}}-\sum_{i=1}^{m}\alpha _{i}y_{i}\vec{x}_{i}^{T}\vec{x_{s}}) b=S1sS(ys1i=1mαiyix iTxs )

  (7)迭代,如果所有 α \alpha α的更新都小于给定的阈值,或者达到最大迭代次数,算法终止。否则,返回步骤2。

后话

  这是支持向量机的基础部分,后续还有核函数、正则化、软间隔、回归等变化。这一块内容真是目前学到的最难的了,到处查资料,以后可能会先出一些简单的内容再来攻克SVM的后续。


http://www.ppmy.cn/news/1525838.html

相关文章

使用C++实现一个支持基本消息传递的TCP客户端和服务器

使用C实现一个支持基本消息传递的TCP客户端和服务器 在网络编程中,TCP(Transmission Control Protocol)是一种常用的协议,用于在计算机之间建立可靠的连接。通过实现一个TCP客户端和服务器,可以深入理解TCP协议的工作…

干货 | Selenium+chrome自动批量下载地理空间数据云影像

1.背景介绍 1.1地理空间数据云 由中国科学院计算机网络信息中心科学数据中心成立的地理空间数据云平台是常见的下载空间数据的平台之一。其提供了较为完善的公开数据,如LANDSAT系列数据,MODIS的标准产品及其合成产品,DEM数据(SR…

社交媒体的未来:Facebook如何通过AI技术引领潮流

在数字化时代的浪潮中,社交媒体平台不断演变,以适应用户需求和技术发展的变化。作为全球领先的社交媒体平台,Facebook在这一进程中扮演了重要角色。尤其是人工智能(AI)技术的应用,正在深刻地改变Facebook的…

HTTP反向代理教学:轻松实现代理IP的妙用

在当今互联网时代,代理IP已经成为了很多人上网必不可少的工具。无论是为了保护隐私,还是为了更好地管理网络流量,代理IP都能发挥重要作用。今天,我们就来聊聊HTTP反向代理这个神奇的东西,教你如何轻松实现代理IP的妙用…

[git] MacBook 安装git

文章目录 1.Mac Git 安装2. 开发者工具安装 CommandLineTools安装完成,错误解决 3. git 账户配置账户设置生成秘钥git 或者 gitee 仓库添加公钥查看全局账户命令多账户设置config文件测试连接clone到本地 1.Mac Git 安装 Mac一般自带Git工具,也就是说已…

4K投影仪选购全攻略:全玻璃镜头的当贝F6,画面细节纤毫毕现

在当今的投影市场上,4K投影仪已经成了主流产品,越来越多家庭开始关注如何选择一款性价比高、口碑好的4K投影仪。4K投影仪其实指的是具备3840*2160像素分辨率投影仪,它能够提供更清晰、更细腻、更真实的画面效果。 那么4K投影仪该怎么选&…

uniapp child.onFieldChange is not a function

uni-forms // 所有子组件参与校验,使用 for 可以使用 awiatfor (let i in childrens) {const child childrens[i];let name realName(child.name);if (typeof child.onFieldChange function) {const result await child.onFieldChange(tempFormData[name]);if (result) {…

EasyExcel拿表头(二级表头)爬坑,invokeHeadMap方法

OK,不废话,直接开干!说实话是有些坑,或者是我不会用吧 模板如下: invokeHeadMap 这个方法其实针对第一行就是表头的完全没问题。针对第二行的,我DEBUG拿到的是这样很明显,他拿到了第一行;既然…

python知识点100篇系列(17)-替换requests的python库httpx

Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,使用Requests可以轻而易举的完成浏览器可有的任何操作。 但是在python3.6之后,出现了一个requests的替代选项; httpx httpx是Python新一代的网络请求库…

【期末复习】软件项目管理

前言: 关于软件项目管理这一科目的重要期末考点,希望对你有帮助。 目录 质量管理可能遇到的问题 软件项目质量管理 软件项目风险管理 进度 题1 题2 题3 成本 题1 题2 题3 质量管理可能遇到的问题 (1)没有制定质量管理计划: (2)…

【STM32】外部中断

当程序正常运行执行main函数,此时如果外部中断来了,执行外部中断函数,实现相应的功能,然后就可以回到main. 一般stm32芯片每个引脚都有自己的外部中断,但是为了限制,会有一个中断线,对应一个中断…

每天五分钟玩转深度学习PyTorch:模型参数优化器torch.optim

本文重点 在机器学习或者深度学习中,我们需要通过修改参数使得损失函数最小化(或最大化),优化算法就是一种调整模型参数更新的策略。在pytorch中定义了优化器optim,我们可以使用它调用封装好的优化算法,然后传递给它神经网络模型参数,就可以对模型进行优化。本文是学习第…

谷歌-BERT-“bert-base-chinese ”

1 需求 2 接口 3 示例 4 参考资料 在Hugging Face上下载并使用Bert-base-Chinese_bert-base-chinese下载-CSDN博客 3 文本分类入门finetune:bert-base-chinese-CSDN博客 4如何对BERT 微调-案例_tokenizer input max length: 1000000000000000019884-CSDN博客 基…

什么是国企和央企

央企和国企是中国经济体系中的两种重要企业类型,它们都是国有企业的一部分,但在管理层级和职能上有所不同。 1. 央企(中央企业) 央企全称为中央直属企业,是指直接由中国国务院国有资产监督管理委员会(国资…

健身管理|基于java的健身管理系统小程序(源码+数据库+文档)

健身管理系统|健身管理系统小程序 目录 基于java的健身管理系统小程序 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师&…

工作流技术(WorkFlow)

什么是工作流 1.使用编程语言完成一套固定的审批流程 例如请假审批流程 订单配送流程 入职,辞职审批流程 2.使用场景 业务类:合同审批流程、订单处理流程、出入库审批流程等。 行政类:请假流程、出差流程、用车流程、办公用品申请流程…

上海亚商投顾:沪指探底回升 华为产业链午后爆发

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日探底回升,深成指、创业板指盘中跌逾1%,午后集体拉升翻红。华为产业链午后走强…

树莓派智能语音助手实现音乐播放

树莓派语音助手从诞生的第一天开始,我就想着让它能像小爱音箱一样,可以语音控制播放音乐。经过这些日子的倒腾,今天终于实现了。 接下里,和大家分享下我的实现方法:首先音乐播放模块用的是我在上一篇博文写的《用sound…

前端用html写excel文件直接打开

源码 <html xmlns:o"urn:schemas-microsoft-com:office:office" xmlns:x"urn:schemas-microsoft-com:office:excel" xmlns"http://www.w3.org/TR/REC-html40"> <head><meta charset"UTF-8"><!--[if gte mso 9]&…

JavaEE:文件内容操作(二)

文章目录 文件内容操作读文件(字节流)read介绍read() 使用read(byte[] b) 使用 read(byte[] b, int off, int len) 使用 写文件(字节流)write介绍write(int b) 使用write(byte[] b) 使用write(byte[] b, int off, int len) 使用 读文件(字符流)read() 使用read(char[] cbuf) 使…