学习视频来源于黑马程序员的python机器学习快速入门,根据视频做的学习笔记,感谢黑马程序员的开源精神。

1.机器学习概述

1.人工智能概述

人工智能、机器学习、深度学习的关系:

  • 机器学习是人工智能的一个实现途径。
  • 深度学习是机器学习的一个方法发展而来。

机器学习、深度学习的应用场景:

  • 传统预测
  • 图像识别
  • 自然语言处理

2.什么是机器学习

通过历史数据训练模型,然后通过训练出来的模型来预测新的数据。

  • 数据
  • 模型
  • 预测

数据集:就是那些历史数据。由特征值和目标值构成。

3.机器学习算法分类

目标值:有 - 监督学习
        目标值:类别 - 分类问题
        目标值:连续型的数据 - 回归问题
目标值:无 - 无监督学习

监督学习:
        分类问题:k-近邻算法、贝叶斯分类、决策树和随机森林、逻辑回归。
        回归问题:线性回归、岭回归。
无监督学习:
        聚类:k-means。

4.机器学习开发流程

  1. 获取数据
  2. 数据处理
  3. 特征工程
  4. 机器学习算法进行训练 - 模型
  5. 模型评估 (如果评估结果不合适则循环2-5步骤,直到通过第五步)
  6. 应用

5.学习框架

  1. 算法是核心,数据与计算是基础。
  2. 找准定位
  3. 学习步骤
            简单应用
            实战类书籍
            理论书籍(机器学习、统计学习方法、深度学习)

2.特征工程

1.数据集

可用数据集:
                scikit-learn链接:数据量较小,方便学习。
                kaggle链接:大数据竞赛平台,真实数据,大量数据。
                UCI数据集链接:收录大量数据集,覆盖科学、生活、经济等领域,数据量大。

scikit-learn:

Python语言的机器学习工具。
        包括绝大多机器学习算法的实现
        文档完善,上手容易,具有丰富的API

数据集API介绍:

sklaern.datasets    加载获取流行数据集datasets.load_*()   (获取小规模数据集)
获取小规模数据集,数据包含在datasets里。datasets.fetch_*(data_home=None)   (获取大规模数据集)
获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是:~/scikit_learn_data/sklearn数据集的使用:load和fetch返回的数据类型:datasets.base.Bunch(继承于字典格式)data:特征数据数组,是[n_samples * n_features]的二维numpy.ndarray数组target:标签数组,是n_samples的一维numpy.ndarray数组DESCR:数据描述feature_names:特征名,新闻数据,手写数字、回归数据集没有。target_names:标签名。

数据集划分API:

数据集的划分:训练数据集:用于训练,构建模型。测试数据集:在模型检验时使用,用于评估模型是否有效。测试集:占20%~30%.sklearn.model_selection.train_test_split(arrays, *options)x:数据集的特征值。y:数据集的标签值。test_size:数据集的大小,一般为float。random_state:随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。return:训练集特征值,测试集特征值;训练集目标值,测试集目标值。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_splitdef datasets_demo():"""sklearn数据集使用:return:"""# 获取鸢尾花数据集iris = load_iris()print("鸢尾花数据集的返回值:\n", iris)# 返回值是一个继承自字典的Benchprint("鸢尾花的特征值:\n", iris["data"])print("鸢尾花的目标值:\n", iris.target)print("鸢尾花特征的名字:\n", iris.feature_names)print("鸢尾花目标值的名字:\n", iris.target_names)print("鸢尾花的描述:\n", iris.DESCR)# 训练集划分x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)print("训练集的特征值:\n", x_train, x_train.shape)return Noneif __name__ == "__main__":# 代码1:sklearn数据集的使用datasets_demo()

2.特征工程介绍

为什么要做特征工程?
        数据和特征决定了机器学习的上线,而算法和模型只是逼近这个上限而已。

特征工程:

使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
        能够直接影响机器学习的效果。

pandas: 数据读取非常方便以及基本的处理格式的工具。
sklearn: 对于特征的处理提供了强大的接口。

3.特征抽取

机器学习算法 - 统计方法 - 数学公式

特征提取:sklearn.feature_extraction字典特征提取:将属于类别的转换成 one-hot编码。sklearn.feature_extraction.DictVectorizer(sparse=True,...)DictVectorizer.fit_transform(X)   X:字典或者包含字典的迭代器返回值:返回sparse矩阵。DictVectorizer.inverse_transform(X)   X:array数组或者sparse矩阵  返回值:转换之前数据格式。DictVectorizer.get_feature_names_out()  返回类别名称。应用场景:1. pclass,sex 数据集当中类别特征比较多。1. 将数据集的特征 --> 字典类型。2. DictVectorizer转换。2. 本身拿到的数据就是字典类型。文本特征抽取:对文本数据进行特征值化。sklearn.feature_extraction.text.CountVectorizer(stop_words=[])  :返回词频矩阵。  stop_words:停用词。CountVertorizer.fit_transform(X)  X:文本或者包含文本字符串的可迭代对象。 返回值:sparse矩阵。CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵  返回值:转换之前数据格式。CountVectorizer.get_feature_names_out()  返回类别名称。tf-idf文本特征提取:(分类机器学习算法进行文章分类中前期数据处理方式)用于评估一字词对于一个文件集或一个语料库中的其中一个文件的重要程度。
公式:词频(tf):某一个给定的词语在该文件中出现的频率。逆向文档频率(idf):一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到。
关键词:在某一个类别的文章中出现的次数很多,但是在其他类别的文章中出现的次数很少。sklearn.feature_extraction.text.TfidfVectorizer

tfidfi,j=tfi×idfi,jtfidf_{i,j} = tf_i \times idf_{i,j}tfidfi,j=tfi×idfi,j

from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jiebadef dict_demo():"""字典特征抽取:return:"""data = [{'city': '北京', 'temperature': 100}, {'city': '上海', 'temperature': 60}, {'city': '深圳', 'temperature': 30}]# 实例化一个转换器类transfer = DictVectorizer(sparse=False)"""sparse=True(默认)data_new:(0, 1) 1.0(0, 3)   100.0(1, 0) 1.0(1, 3)   60.0(2, 2)  1.0(2, 3)   30.0默认返回一个sparse矩阵:也就是一个稀疏矩阵,就是将下面的二维矩阵将非零位置表示出来。使用稀疏矩阵的优点:当类别特别大的时候,可以节省内存空间sparse=Falsedata_new:[[  0.   1.   0. 100.][  1.   0.   0.  60.][  0.   0.   1.  30.]]"""# 调用fit_transform()data_new = transfer.fit_transform(data)print("data_new:\n", data_new)print("特征名字:\n", transfer.get_feature_names_out())return Nonedef count_demo():"""文本特征值抽取:CountVectorizer:return:"""data = ["life is short, i like like python", "life is too long , i dislike python"]# 1.实例化一个转换器transfer = CountVectorizer()# 2.调用fit_transformdata_new = transfer.fit_transform(data)print("data_new:\n", type(data_new))print("data_new:\n", data_new)print("data_new:\n", data_new.toarray())"""data_new:[[0 1 1 2 0 1 1 0][1 1 1 0 1 1 0 1]]特征值的名字:['dislike' 'is' 'life' 'like' 'long' 'python' 'short' 'too']作用:统计每个样本特征值出现的个数"""print("特征值的名字:\n", transfer.get_feature_names_out())"""<class 'scipy.sparse.csr.csr_matrix'>此类型可以直接使用 .toarray() 转换成数组"""return Nonedef cut_words(text):"""进行中文分词:return:"""text = ' '.join(list(jieba.cut(text)))return textdef count_chinese_demo():"""中文文本特征抽取,自动分词:return:None"""# 1.将中文文本进行分词data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]data_new = []for sent in data:data_new.append(cut_words(sent))# 2.实例化一个转换器transfer = CountVectorizer(stop_words=["一种", "所以"])# 3.调用fit_transformdata_new = transfer.fit_transform(data)print("data_new:\n", data_new.toarray())print("特征值的名字:\n", transfer.get_feature_names_out())return Nonedef tfidf_demo():"""用tf-idf方法进行文本特征提取:return:"""# 1.将中文文本进行分词data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]data_new = []for sent in data:data_new.append(cut_words(sent))# 2.实例化一个转换器transfer = TfidfVectorizer(stop_words=["一种", "所以"])# 3.调用fit_transformdata_new = transfer.fit_transform(data)print("data_new:\n", data_new.toarray())print("特征值的名字:\n", transfer.get_feature_names_out())return Noneif __name__ == "__main__":# 代码1:字典特征抽取dict_demo()# 代码2:文本特征抽取count_demo()# 代码3:中文文本分词count_chinese_demo()# 代码4:TF-IDF进行文本特征提取tfidf_demo()

4.特征预处理

什么是特征预处理: 通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程。

特征预处理API

sklearn.preprocessing

数值型数据的无量纲化:

  • 归一化

为什么要进行归一化/标准化: 要进行无量纲化,是不同规格的数据转化为同一规格。(就是让每一类数据在之后的计算中,所占的权重一样,不会出现某一个的单位太大,导致最终结果几乎由这一项数据所影响。)

定义: 通过对原始数据进行变换把把数据映射到(默认为[0,1])之间。

公式:
X′=x−minmax−minX′′=X′×(mx−mi)+miX'=\frac{x-min}{max-min} \,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\, X''=X'\times (mx-mi)+mi X=maxminxminX=X×(mxmi)+mi
        作用于每一列,max为一列的最大值,min为一列的最小值,X’'为最终结果。mx,mi分别为指定区间mx=1,mi=0。

API
        sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)…)
                MinMaxScaler.fit_transform(X)
                        X:numpy array格式的数据[n_samples, n_features]
                返回值:转换后的形状相同的array。

  • 标准化

定义: 通过对原始数据进行变换把数据变换到均值为0,标准差为1的范围内。

公式:
X′=x−meanσX'=\frac{x-mean}{\sigma } X=σxmean
        作用于每一列,mean为平均值,σ\sigmaσ为标准差。
API
        sklearn.preprocessing.StandardScaler()
                处理之后,对每列来说,所有数据都聚集在均值为0附近,标准差为1.
                StandardScaler.fit_transform(X)
                        X:numpy array格式的数据[n_samples, n_features]
                返回值:转换后的形状相同的array。
                标准化适合大量数据的场景。

  • 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变。
  • 对于标准化来说:如果出现异常点,由于具有一定的数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
from sklearn.preprocessing import MinMaxScaler, StandardScaler
import pandas as pddef minmax_demo():"""归一化:return:"""# 1.获取数据data = pd.read_csv("dating.txt")data = data.iloc[:, : 3]print("data:\n", data)# 2.实例化一个转换器类transfer = MinMaxScaler()# 3.调用fit——transformdata_new = transfer.fit_transform(data)print("data_new:\n", data_new)return Nonedef stand_demo():"""标准化:return:"""# 1.获取数据data = pd.read_csv("dating.txt")data = data.iloc[:, : 3]print("data:\n", data)# 2.实例化一个转换器类transfer = StandardScaler()# 3.调用fit——transformdata_new = transfer.fit_transform(data)print("data_new:\n", data_new)return Noneif __name__ == "__main__":# 代码1:归一化minmax_demo()# 代码2:标准化stand_demo()

5.降维

什么是降维: 在某些限定条件下,降低随机变量(特征)个数,得到一组 “不相关” 主变量的过程。

维数:数组嵌套的层数
        此处的降维:降低特征的个数。
        相关特征:类似于湿度和降雨量之间的关系。

降维的两种方式:

  • 特征选择降维
  • 主成分分析降维

5.1特征降维

定义: 数据中包含冗余或相关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征。

方法:

  • Filter(过滤式):主要探究特征本身特点、特征于特征和目标值之间的关系。

    • 方差选择法:低方差特征过滤。
    • 相关系数
  • Embedded(嵌入式):算法自动选择特征(特征于目标值之间的关联)
    • 决策树:信息熵、信息增益。
    • 正则化:L1、L2
    • 深度学习:卷积等。

模块: sklearn.feature_selection

5.1.1过滤式

低方差特征过滤

删除低方差的一些特征,再结合方差的大小来考虑。
                特征方差小:某个特征大多样本的值比较相近。
                特征方差大:某个特征很多样本的值都有差别
API

  • sklearn.feature_selection.VarianceThreshold(threshold = 0.0)

    • 删除所有低方差特征
    • Variance.fit_transform(X)
      • X:numpy array格式的数据[n_samples, n_features]
      • 返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。

数据计算

相关系数

  • 皮尔逊相关系数

    • 反映变量之间相关关系密切程度的统计指标

公式
r=n∑xy−∑x∑yn∑x2−(∑x)2n∑y2−(∑y)2r=\frac{n\sum xy-\sum x\sum y}{\sqrt{n\sum x^{2}-(\sum x)^{2}} \sqrt{n\sum y^{2}-(\sum y)^{2}}} r=nx2(x)2

ny2(y)2

nxyxy
相关系数的取值:−1≤r≤1-1\le r\le 11r1

  • r>0r>0r>0时,表示两变量正相关,r<0r<0r<0时,两变量负相关。
  • ∣r∣=1|r|=1r=1时,表示两变量为完全相关,当r=0r=0r=0时,表示两变量间无相关关系。
  • 0<∣r∣<10<|r|<10<r<1时,表示两变量存在一定程度的相关关系,且∣r∣|r|r越接近1,两变量间线性关系越密切;∣r∣|r|r越接近于0,表示两变量间线性关系越弱。
  • 一般可按三级划分:∣r∣<0.4|r|<0.4r<0.4为低度相关;0.4<∣r∣<0.70.4<|r|<0.70.4<r<0.7为显著性相关;0.7<∣r∣<10.7<|r|<10.7<r<1为高度线性相关。

API

  • from scipy.stats import pearsonr

    • x:(N,) array_like
    • y:(N,) array_like Returns: (pearson’s correlation coefficient, pvalue)

特征与特征之间相关性很高:

  • 选取其中一个为代表
  • 加权求和
  • 主成分分析
from sklearn.feature_selection import VarianceThreshold
import pandas as pddef variance_demo():"""过滤低方差特征:return:"""# 1.获取数据data = pd.read_csv("factor_returns.csv")print("data:\n", data)data = data.iloc[:, 1:-2]# 2.实例化一个转换器类transfer = VarianceThreshold(threshold=20)# 3.调用fit_transformdata_new = transfer.fit_transform(data)print("data_new:\n", data_new, data_new.shape)# 4.计算某两个变量之间的相关系数r = pearsonr(data["pe_ratio"], data["pb_ratio"])print("r:\n", r)return Noneif __name__ == "__main__":# 代码:过滤低方差特征variance_demo()

5.2主成分分析降维

定义: 高维数据转换为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量。

作用: 是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。

应用: 回归分析或者聚类分析中。

API

  • sklearn.decomposition.PCA(n_components=None)

    • 将数据分解为较低维数空间
    • n_components:
      • 小数:表示百分之多少的信息
      • 整数:减少到多少特征
    • PCA.fit_transform(X) X:numpy array格式的数据[n_samples, n_features]。
    • 返回值:转换后指定维数的array。
from sklearn.decomposition import PCAdef pca_demo():"""PCA降维:return:"""data = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]# 实例化一个转换器类transfer = PCA(n_components=0.99)# 调用fit_transformdata_new = transfer.fit_transform(data)print("data_new:\n", data_new)return Noneif __name__ == "__main__":# 代码:过滤低方差特征pca_demo()

5.3简单案例:探究用户对物品类别的喜好细分

数据:

  • order_products_prior.csv:订单与商品信息。

    • 字段:order_id,product_id,add_to_cart_order,reordered
  • products.csv:商品信息。
    • 字段:product_id,product_name,aisle_id,department_id
  • orders.csv:用户的订单信息。
    • 字段:order_id,user_id,eval_set,order_number,…
  • aisles.csv:商品所属具体物品类别。
    • 字段:aisle_id,aisle

要处理一下数据:

  • 将user_id和aisle放在同一个表中 - 合并
  • 找到user_id和aisle - 交叉表和透视表
  • 特征冗余过度 - PCA降维
from sklearn.decomposition import PCA
import pandas as pd# 1.获取数据
aisles = pd.read_csv("aisles.csv")
order_products_prior = pd.read_csv("order_products__prior.csv")
orders = pd.read_csv("orders.csv")
products = pd.read_csv("products.csv")# 2.合并表
# 合并aisles和products
table1 = pd.merge(aisles, products, on=["aisle_id", "aisle_id"])
table2 = pd.merge(table1, order_products_prior, on=["product_id", "product_id"])
table3 = pd.merge(table2, orders, on=["order_id", "order_id"])# 3.找到user_id和aisle之间的关系
table = pd.crosstab(table3["user_id"], table3["aisle"])# 1.实例化一个转换器类
transfer = PCA(n_components=0.95)
# 2.调用transform
data_new = transfer.fit_transform(table)print(data_new)

有可能会报错

  • numpy.core._exceptions.MemoryError: Unable to allocate 742. MiB for an array with shape (3, 32434489) and data type int64

这个是由于数据量太大了,也就是cpu内存小导致的,解决方法:修改pycharm的运行内存。

  • 点击Help ——》下拉菜单选择 Find Action ——》输入 VM Options ——》选择 Edit Custom VM Options ——》将-Xmx**m 修改为 -Xmx4096m(4G运行,按情况自行分配)

快速入门机器学习——特征抽取相关推荐

  1. 一文读懂:快速入门机器学习,基础向

    [提前声明] 文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章 写作不易,转载请注明,谢谢! 代码案例地址: ?https://github.com/Mydreamandrea ...

  2. 快速入门机器学习!最受欢迎AI霸榜书最新版来了!国内外好评率超90%!

    传说中的机器学习"四大名著"中最适合入门的一本--"蜥蜴书"新版来了! 这本书的英文原版是美国亚马逊AI霸榜图书,在人工智能.计算机神经网络.计算机视觉和模式识 ...

  3. 课程 | 中科院教授带你快速入门机器学习

    机器学习,说简单就简单,说难还真难,对于还没入行的同学,大概最难的是如何入门机器学习?应该掌握哪些知识?看什么书最高效?如何避免绕弯?如何利用已有基础进一步提高水平?

  4. 靠谱的快速入门机器学习和深度学习路线

    『运筹OR帷幄』原创 作者:霍华德 编者按: 入门机器学习和深度学习并不是一件容易的事情.需要学习大量的知识,初学者常常会迷茫不知所措.现在我们给你带来一篇纯干货,帮助你入门机器学习和深度学习. 什么 ...

  5. 模式识别和机器学习有必要学么_【赠书】快速入门机器学习!最受欢迎AI霸榜书最新版来了!送2本!...

    快周末了,这次给大家赠送2本机器学习好书,请看细节. 这是一本什么书 这本书的英文原版是美国亚马逊AI霸榜图书,在人工智能.计算机神经网络.计算机视觉和模式识别三大榜单中,均为榜首! 如果你是是AI初 ...

  6. 【机器学习】快速入门机器学习

    机器学习概述 特征工程 特征工程是指从原始数据转换为特征向量的过程.特征工程是机器学习中最重要的起始步骤,会直接影响机器学习的效果,并通常需要大量的时间.典型的特征工程包括数据清理.特征提取.特征选择 ...

  7. python机器学习快速入门

    机器学习快速入门 这是机器学习小白在csdn更新的第一篇文,课程学习资料来源于黑马程序员的3天快速入门python机器学习课程.由于本小白在学完特征工程后转去看吴恩达在coursera的机器学习课程 ...

  8. sklearn快速入门教程:(三)机器学习的通用模式及实现方法

    一.从线性回归总结机器学习的通用模式 从上篇博客我们详细讲述了线性回归的实现方式.线性回归的调用方式实际上是sklearn的典型方式,在掌握这个方法之后我们继续进一步深入,探索其它的模型的使用. 回顾 ...

  9. 机器学习——Google 快速入门课程(综合版)

    前言 本文参考 Google 谷歌官网机器学习的快速入门课程,整体课程比较好理解,供大家学习参考:文章也会结合自己的理解进行优化.看到官网的消息2021/7之后就不提供中文版的机器学习快速入门课程了, ...

  10. 集锦分享 | 200篇原创笔记,帮助你快速入门Python与机器学习

    「Python与算法社区」号主现就职于某知名互联网公司,5年算法工程师,从事机器学习.深度学习.数据分析等相关工作.Pandas开源库贡献者. 这位大佬喜欢分享,在过去的两年中,已原创并分享 280 ...

最新文章

  1. zabbix1.8和2.0版本通用的安装脚本
  2. 组复制官方翻译五、Group Replication Security
  3. 【双十二】电商们的文案大战,猫狗快被玩坏了!
  4. Unity UGUI - Canvas / Camera
  5. ASP.NET与ASP.NET Core用户验证Cookie并存解决方案
  6. linux下日志晒选打包,Linux 文件日志筛选操作
  7. 6 WM配置-主数据-定义存储区(Storage Section)
  8. 获取python安装路径
  9. Lumia 800 7.10.8783.12
  10. 【Linux】后台 nohup 运行 python 程序
  11. Maven经验分享(一)安装部署
  12. 关于NLPIR在MAC上的使用
  13. AI玩游戏系列,机器学习玩游戏(1) 一维游戏
  14. ar 华为路由器 端口映射_华为AR1220-S路由器WEB界面鸡肋使用命令映射多端口方法...
  15. 从零开始修炼电脑维修秘籍
  16. 思想改变命运,95后脑瘫小伙转型网络工程师,你为什么不可以?
  17. 量化选股——基于动量因子的行业风格轮动策略(第2部分—策略回测)
  18. G1-007 小鲁摘苹果 (10 分)(2022/3/15天梯赛校内选拔赛)
  19. Android VideoView播放网络视频
  20. 嵌入式培训学费贵不贵?

热门文章

  1. 怎样把excel中的图表插入PPT并且可以在PPT中编辑图表
  2. pdf照片显示正常打印时被翻转_现场确认完没事了?准考证打印要注意哪些细节!...
  3. SAP中英文转换--中文转英文
  4. android构建系统总览
  5. AT91SAM9260搭建LINUX操作系统
  6. 汇总报表与合并报表之如何汇总报表
  7. matlab拉格朗日插值法程序框图,MATLAB实现拉格朗日插值法
  8. 8、乐趣国学—“不迁怒,不贰过”
  9. 解决wps公式编辑器上移情况
  10. 51单片机引脚内部电路