从协方差的角度详解线性判别分析原理+Python实现

2023-05-16

目录

写在前面

机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量机、贝叶斯与马尔科夫决策、强化学习等。

1 什么是线性判别分析?

线性判别分析(Linear Discriminant Analysis, LDA) 的核心思想是: 将给定训练集投影到特征空间的一个超平面上,并设法使同类样本投影点尽可能接近,异类样本投影点尽可能远离 。

线性判别分析是一种将样本投影到低维空间进行分类的方法,因此它既是分类技术又是降维技术,本文主要讨论LDA进行分类的原理:在对新样本进行分类时,将其投影到同样的分类平面上,根据投影点的位置确定新样本的类别

如图所示是LDA算法分类的直观图示,很显然右图分类效果更好,接下来我们讨论如何找到超平面实现以下两个目标:

  • 同类样本投影点尽可能接近
  • 异类样本投影点尽可能远离

2 协方差与协方差矩阵

LDA算法的实现离不开样本协方差矩阵,本节简单介绍什么是协方差和协方差矩阵。

协方差(covariance) 定义为

c o v ( x 1 , x 2 ) = E [ ( x 1 − E [ x 1 ] ) ( x 2 − E [ x 2 ] ) ] cov\left( x_1,x_2 \right) =\mathbb{E} \left[ \left( x_1-\mathbb{E} \left[ x_1 \right] \right) \left( x_2-\mathbb{E} \left[ x_2 \right] \right) \right] co v ( x 1 ​ , x 2 ​ ) = E [ ( x 1 ​ − E [ x 1 ​ ] ) ( x 2 ​ − E [ x 2 ​ ] ) ]

其中 x 1 x_1 x 1 ​ 与 x 2 x_2 x 2 ​ 是随机变量。 协方差反映随机变量间的相关情况,协方差越大表明随机变量变化趋势越接近,相关性越强 。特别地,当 x 1 = x 2 x_1=x_2 x 2 ​ 时协方差退化为方差,反映随机变量自身变化的稳定性。

样本协方差 是在给定样本集的情况下对协方差的无偏估计量

c o v ( x 1 , x 2 ) = 1 n − 1 ∑ i = 1 n ( x 1 ( i ) − x ˉ 1 ) ( x 2 ( i ) − x ˉ 2 ) cov\left( x_1,x_2 \right) =\frac{1}{n-1}\sum_{i=1}^n{\left( x_{1}^{\left( i \right)}-\bar{x}_1 \right) \left( x_{2}^{\left( i \right)}-\bar{x}_2 \right)} co v ( x 1 ​ , x 2 ​ ) = i = 1 ∑ n ​ ( x 1 ( i ) ​ − x ˉ 1 ​ ) ( x 2 ( i ) ​ − x ˉ 2 ​ )

为便于计算通常将样本集 X X X 中心化,即使样本均值为0,记 X ~ = [ x ~ ( 1 ) x ~ ( 2 ) ⋯ x ~ ( n ) ] \boldsymbol{\tilde{X}}=\left[ \begin{matrix} \boldsymbol{\tilde{x}}^{\left( 1 \right)}& \boldsymbol{\tilde{x}}^{\left( 2 \right)}& \cdots& \boldsymbol{\tilde{x}}^{\left( n \right)}\\\end{matrix} \right] [ x ~ ( 1 ) ​ x ~ ( 2 ) ​ ⋯ ​ x ~ ( n ) ​ ] ,其中样本都为中心化样本,此时协方差矩阵可写为

C = 1 n − 1 X ~ X ~ T C=\frac{1}{n-1}\boldsymbol{\tilde{X}\tilde{X}}^T X ~ X ~ T

如图所示为不同协方差矩阵情况下的样本分布情况。方差大小决定了数据在特征方向上的聚合情况—— 方差越大,数据在该特征方向分布越散 ;协方差决定了两个原始维度的相关性, 协方差越大,原始维度相关性越强

3 LDA原理推导

3.1 约束条件

在二分类问题上,设训练集中两个类别样本集、样本中心、协方差矩阵分别为 X k \boldsymbol{X}_k X k ​ 、 μ k \boldsymbol{\mu }_k μ k ​ 、 Σ k \boldsymbol{\varSigma }_k Σ k ​ ( k = 0 , 1 ) (k=0,1) ( k = 0 , 1 ) 。要使同类样本尽可能接近,即使同类样本投影点的协方差尽可能小

w = a r g min ⁡ w ∑ x ∈ X k ( w T x − w T μ k ) ( w T x − w T μ k ) T = a r g min ⁡ w w T Σ k w \boldsymbol{w}=\underset{\boldsymbol{w}}{\mathrm{arg}\min}\sum_{\boldsymbol{x}\in \boldsymbol{X}_k}{\left( \boldsymbol{w}^T\boldsymbol{x}-\boldsymbol{w}^T\boldsymbol{\mu }_k \right) \left( \boldsymbol{w}^T\boldsymbol{x}-\boldsymbol{w}^T\boldsymbol{\mu }_k \right) ^T}=\underset{\boldsymbol{w}}{\mathrm{arg}\min}\boldsymbol{w}^T\boldsymbol{\varSigma }_k\boldsymbol{w} w arg min ​ x ∈ X k ​ ∑ ​ ( w T x − w T μ k ​ ) ( w T x − w T μ k ​ ) T = w arg min ​ w T Σ k ​ w

我们从协方差的物理意义上思考一下为什么协方差小同类样本就接近。如下图所示,是同一个三维样本在两个二维平面的投影,结合第二节对协方差的介绍,可以看出协方差大的样本越细长分散,协方差小则反之。所以协方差小可以使样本更聚合,也即样本投影点尽可能接近。

要使异类样本投影点尽可能远离,即使异类中心投影尽可能远离

w = a r g max ⁡ w ∥ w T μ 0 − w T μ 1 ∥ 2 2 = a r g max ⁡ w w T ( μ 0 − μ 1 ) ( μ 0 − μ 1 ) T w \boldsymbol{w}=\underset{\boldsymbol{w}}{\mathrm{arg}\max}\left\| \boldsymbol{w}^T\boldsymbol{\mu }_0-\boldsymbol{w}^T\boldsymbol{\mu }_1 \right\| _{2}^{2}=\underset{\boldsymbol{w}}{\mathrm{arg}\max }\boldsymbol{w}^T\left( \boldsymbol{\mu }_0-\boldsymbol{\mu }_1 \right) \left( \boldsymbol{\mu }_0-\boldsymbol{\mu }_1 \right) ^T\boldsymbol{w} w arg max ​ ∥ ∥ ​ w T μ 0 ​ − w T μ 1 ​ ∥ ∥ ​ 2 2 ​ = w arg max ​ w T ( μ 0 ​ − μ 1 ​ ) ( μ 0 ​ − μ 1 ​ ) T w

在同类样本聚合的基础上,中心样本的相斥直观上会使异类样本集合互相远离

3.2 数值优化

注意到前面提到的两个约束条件优化方向相反——一个要求最大,一个要求最小,因此我们可以将目标函数综合为

w ∗ = a r g max ⁡ w J ( w ) , J ( w ) = w T S b w w T S w w \boldsymbol{w}^*=\underset{\boldsymbol{w}}{\mathrm{arg}\max}J\left( \boldsymbol{w} \right) , J\left( \boldsymbol{w} \right) =\frac{\boldsymbol{w}^T\boldsymbol{S}_b\boldsymbol{w}}{\boldsymbol{w}^T\boldsymbol{S}_w\boldsymbol{w}} w arg max ​ J ( w ) , J ( w ) = w T S w ​ w w T S b ​ w ​

其中 S w = Σ 0 + Σ 1 \boldsymbol{S}_w=\boldsymbol{\varSigma }_0+\boldsymbol{\varSigma }_1 Σ 1 ​ 称为 类内散度矩阵(within-class scatter matrix) , S b = ( μ 0 − μ 1 ) ( μ 0 − μ 1 ) T \boldsymbol{S}_b=\left( \boldsymbol{\mu }_0-\boldsymbol{\mu }_1 \right) \left( \boldsymbol{\mu }_0-\boldsymbol{\mu }_1 \right) ^T ( μ 0 ​ − μ 1 ​ ) ( μ 0 ​ − μ 1 ​ ) T 称为 类间散度矩阵(between-class scatter matrix) 。名字起什么不重要,这个目标函数的本质就是两个约束条件之比。

值得注意的是,优化可行解在直线 α w ∗ \alpha \boldsymbol{w}^* α w ∗ 上,可以不失一般性地约束 w T S w w = 1 \boldsymbol{w}^T\boldsymbol{S}_w\boldsymbol{w}=1 w T S w ​ w = 1 ,从而优化问题转变为

{ w ∗ = a r g min ⁡ w − w T S b w s . t . w T S w w = 1 \begin{cases} \boldsymbol{w}^*=\underset{\boldsymbol{w}}{\mathrm{arg}\min}\,\,-\boldsymbol{w}^T\boldsymbol{S}_b\boldsymbol{w}\\ \mathrm{s}.\mathrm{t}. \boldsymbol{w}^T\boldsymbol{S}_w\boldsymbol{w}=1\\\end{cases} ⎩ ⎨ ⎧ ​ w ∗ = w arg min ​ − w T S b ​ w s . t . w T S w ​ w = 1 ​

由拉格朗日乘子法设拉格朗日函数 L ( w , λ ) = − w T S b w + λ ( w T S w w − 1 ) L\left( \boldsymbol{w}, \lambda \right) =-\boldsymbol{w}^T\boldsymbol{S}_b\boldsymbol{w}+\lambda \left( \boldsymbol{w}^T\boldsymbol{S}_w\boldsymbol{w}-1 \right) L ( w , λ ) = − w T S b ​ w + λ ( w T S w ​ w − 1 ) ,则

∂ L ( w , λ ) ∂ w = − 2 S b w + 2 λ S w w = 0 ⇒ S w − 1 S b w ∗ = λ w ∗ \frac{\partial L\left( \boldsymbol{w}, \lambda \right)}{\partial \boldsymbol{w}}=-2\boldsymbol{S}_b\boldsymbol{w}+2\lambda \boldsymbol{S}_w\boldsymbol{w}=0\Rightarrow \boldsymbol{S}_{w}^{-1}\boldsymbol{S}_b\boldsymbol{w}^*=\lambda \boldsymbol{w}^* ∂ w ∂ L ( w , λ ) ​ = − 2 S b ​ w + 2 λ S w ​ w = S w − 1 ​ S b ​ w ∗ = λ w ∗

考虑到 S w − 1 S b w ∗ = S w − 1 ( μ 0 − μ 1 ) ( μ 0 − μ 1 ) T w ∗ \boldsymbol{S}_{w}^{-1}\boldsymbol{S}_b\boldsymbol{w}^*=\boldsymbol{S}_{w}^{-1}\left( \boldsymbol{\mu }_0-\boldsymbol{\mu }_1 \right) \left( \boldsymbol{\mu }_0-\boldsymbol{\mu }_1 \right) ^T\boldsymbol{w}^* S w − 1 ​ S b ​ w ∗ = S w − 1 ​ ( μ 0 ​ − μ 1 ​ ) ( μ 0 ​ − μ 1 ​ ) T w ∗ ,其中 ( μ 0 − μ 1 ) T w ∗ \left( \boldsymbol{\mu }_0-\boldsymbol{\mu }_1 \right) ^T\boldsymbol{w}^* ( μ 0 ​ − μ 1 ​ ) T w ∗ 是常数,因此 w ∗ \boldsymbol{w}^* w ∗ 与 S w − 1 ( μ 0 − μ 1 ) \boldsymbol{S}_{w}^{-1}\left( \boldsymbol{\mu }_0-\boldsymbol{\mu }_1 \right) S w − 1 ​ ( μ 0 ​ − μ 1 ​ ) 共线,前面说到这一条线上的解都是可行的最优解,所以可选择

w ∗ = S w − 1 ( μ 0 − μ 1 ) {\boldsymbol{w}^*=\boldsymbol{S}_{w}^{-1}\left( \boldsymbol{\mu }_0-\boldsymbol{\mu }_1 \right) } w ∗ = S w − 1 ​ ( μ 0 ​ − μ 1 ​ )

4 Python实现

4.1 计算类内散度矩阵

根据定义 S w = Σ 0 + Σ 1 \boldsymbol{S}_w=\boldsymbol{\varSigma }_0+\boldsymbol{\varSigma }_1 Σ 1 ​ 编程

<span style="color:#444444"><span style="background-color:#f6f6f6"><span style="color:#333333"><strong>def</strong></span> <span style="color:#880000"><strong>__calSw</strong></span>(<span style="color:#333333"><strong>self</strong></span>):
     <span style="color:#888888"># 类样本数</span>
     N1, N2 = np.size(<span style="color:#333333"><strong>self</strong></span>.X1, <span style="color:#880000">1</span>), np.size(<span style="color:#333333"><strong>self</strong></span>.X2, <span style="color:#880000">1</span>)
     <span style="color:#888888"># 类协方差矩阵</span>
     sigma1 = np.zeros((np.size(<span style="color:#333333"><strong>self</strong></span>.X, <span style="color:#880000">0</span>), np.size(<span style="color:#333333"><strong>self</strong></span>.X, <span style="color:#880000">0</span>)))
     sigma2 = np.zeros((np.size(<span style="color:#333333"><strong>self</strong></span>.X, <span style="color:#880000">0</span>), np.size(<span style="color:#333333"><strong>self</strong></span>.X, <span style="color:#880000">0</span>)))
     <span style="color:#333333"><strong>for</strong></span> i <span style="color:#333333"><strong>in</strong></span> range(N1):
         sigma1 = sigma1 + (<span style="color:#333333"><strong>self</strong></span>.X1[<span style="color:#bc6060">:</span>, i] - <span style="color:#333333"><strong>self</strong></span>.miu1).dot(
             (<span style="color:#333333"><strong>self</strong></span>.X1[<span style="color:#bc6060">:</span>, i] - <span style="color:#333333"><strong>self</strong></span>.miu1).T)
     <span style="color:#333333"><strong>for</strong></span> i <span style="color:#333333"><strong>in</strong></span> range(N2):
         sigma2 = sigma2 + (<span style="color:#333333"><strong>self</strong></span>.X2[<span style="color:#bc6060">:</span>, i] - <span style="color:#333333"><strong>self</strong></span>.miu2).dot(
             (<span style="color:#333333"><strong>self</strong></span>.X2[<span style="color:#bc6060">:</span>, i] - <span style="color:#333333"><strong>self</strong></span>.miu2).T)
     <span style="color:#333333"><strong>return</strong></span> sigma1 + sigma2</span></span>

4.2 计算模型参数

根据公式 w ∗ = S w − 1 ( μ 0 − μ 1 ) {\boldsymbol{w}^*=\boldsymbol{S}_{w}^{-1}\left( \boldsymbol{\mu }_0-\boldsymbol{\mu }_1 \right) } w ∗ = S w − 1 ​ ( μ 0 ​ − μ 1 ​ ) 编程

<span style="color:#444444"><span style="background-color:#f6f6f6"><span style="color:#888888"># 类均值向量</span>
<span style="color:#333333"><strong>self</strong></span>.miu1 = np.mean(<span style="color:#333333"><strong>self</strong></span>.X1, <span style="color:#880000">1</span>).reshape(-<span style="color:#880000">1</span>, <span style="color:#880000">1</span>)
<span style="color:#333333"><strong>self</strong></span>.miu2 = np.mean(<span style="color:#333333"><strong>self</strong></span>.X2, <span style="color:#880000">1</span>).reshape(-<span style="color:#880000">1</span>, <span style="color:#880000">1</span>)
<span style="color:#888888"># 权重参数 [w1, w2, ..., wd]^T</span>
<span style="color:#333333"><strong>self</strong></span>.w = np.linalg.inv(<span style="color:#333333"><strong>self</strong></span>.Sw).dot(<span style="color:#333333"><strong>self</strong></span>.miu1 - <span style="color:#333333"><strong>self</strong></span>.miu2)</span></span>

4.3 可视化

采用西瓜数据集进行本次LDA实验数据,可视化如下

今天就到这啦!关注我,后续更多有趣学习知识哦~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从协方差的角度详解线性判别分析原理+Python实现 的相关文章

  • 使用 Python Multiprocessing Pool.map() 的问题在 Python 3.7.2 中变得棘手,但在 3.6.2 中很快完成

    我刚刚将Python从3 6 2 gt 3 7 2并且遇到了问题multiprocessing图书馆 我在 Django 应用程序中使用它 该应用程序在工作函数中使用 Django 特定的函数 见下文 在我的代码中 我有以下内容 impor
  • sklearn 估计器管道的参数无效

    我正在实现 O Reilly 书中的一个示例 Python 机器学习简介 使用 Python 2 7 和 sklearn 0 16 我正在使用的代码 pipe make pipeline TfidfVectorizer LogisticRe
  • 如何在 Debian 上的 virtualenv 中安装 numpy?

    注 参见这另一篇文章 https stackoverflow com questions 6442754 how to install h5py numpylibhdf5 as non root on a debian linux syst
  • 如何(重新)命名 pandas 数据框中的空列标题而不导出到 csv

    我有一个熊猫数据框df1带有一个索引列和一系列未命名的值 我想为未命名的系列指定一个名称 到目前为止 我知道的唯一方法是导出到df1 csv using df1 to csv df1 csv header Signal 然后使用以下命令重新
  • 来自 pandas 数据帧的烛台图,用日期替换索引

    此代码给出了带有移动平均线的烛台图 但 x 轴位于索引中 我需要 x 轴位于日期中 需要做什么改变 import numpy as np import pandas as pd import matplotlib pyplot as plt
  • 使用pathlib获取主目录

    翻看新的pathlib在 Python 3 4 中 我注意到没有任何简单的方法来获取用户的主目录 我能想到的获取用户主目录的唯一方法是使用旧的os path像这样的库 import pathlib from os import path p
  • 如何从hdfs读取文件[重复]

    这个问题在这里已经有答案了 我在 project1目录下的hadoop文件系统中有一个文本文件名mr txt 我需要编写 python 代码来读取文本文件的第一行 而不将 mr txt 文件下载到本地 但我无法从 hdfs 打开 mr tx
  • Python - Unicode 到 ASCII 的转换

    我无法在不丢失数据的情况下将以下 Unicode 转换为 ASCII u ABRA xc3O JOS xc9 I tried encode and decode他们不会这么做 有人有建议吗 Unicode 字符u xce0 and u xc
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • 数据框中 .map(str) 和 .astype(str) 有什么区别

    我有一个数据框 其列名为 col1 和 col2 的整数类型条目 我想将 col1 和 col2 的条目以及其间的 点 连接起来 我搜索并发现添加两个列条目 df col df col1 map str df col2 map str 并添
  • 将 window.location 传递给 Flask url_for

    我正在使用 python 在我的页面上 当匿名用户转到登录页面时 我想将一个变量传递到后端 以便它指示用户来自哪里 发送 URL 因此 当用户单击此锚链接时 a href Sign in a 我想发送用户当前所在页面的当前 URL
  • Python:在字典中查找具有唯一值的键?

    我收到一个字典作为输入 并且想要返回一个键列表 其中字典值在该字典的范围内是唯一的 我将用一个例子来澄清 假设我的输入是字典 a 构造如下 a dict a cat 1 a fish 1 a dog 2 lt unique a bat 3
  • 如何按 pandas 中的值对系列进行分组?

    我现在有一只熊猫Series与数据类型Timestamp 我想按日期对其进行分组 并且每组中有许多行具有不同的时间 看似显而易见的方法类似于 grouped s groupby lambda x x date 然而 熊猫的groupby按索
  • 无法导入QUERY_TERMS

    我正在运行一个网站Python and Django Django filters 2 1 installed Django 2 1 installed 当我运行时 我收到以下错误 importError Could not import
  • 如何创建用于霍夫曼编码和解码的树?

    对于我的作业 我将对霍夫曼树进行编码和解码 我在创建树时遇到问题 并且陷入困境 不要介意打印语句 它们只是让我测试并查看函数运行时的输出是什么 对于第一个 for 循环 我从主块中用于测试的文本文件中获取了所有值和索引 在第二个 for 循
  • Python:如何在不先创建整个列表的情况下计算列表的总和?

    通常我们必须 1 声明一个列表 2 使用以下方法计算该列表的总和sum 但现在我希望指定一个以 1 开头 间隔为 4 100 个元素的列表 如下所示 1 5 9 13 17 21 25 29 33 37 我不想涉及数学公式 所以 1 如何在
  • python中有没有一种方法可以将存储在列表中的正则表达式模式列表应用到单个字符串?

    我有一个正则表达式模式列表 存储在列表类型中 我想将其应用于字符串 有谁知道一个好方法 将列表中的每个正则表达式模式应用于字符串 和 如果匹配 则调用与列表中该模式关联的不同函数 如果可能的话我想用 python 来做这件事 提前致谢 im
  • Python 相当于 Scala 案例类

    Python 中是否有与 Scala 的 Case Class 等效的东西 就像自动生成分配给字段而无需编写样板的构造函数一样 当前执行此操作的现代方法 从 Python 3 7 开始 是使用数据类 https www python org
  • MoviePY 无法在 Windows 上检测 ImageMagick 二进制文件

    我刚买了一台新笔记本电脑 想要设置MoviePY在那新的Windows 64x Python3 7 0 机器 我对所有内容都进行了三次检查 但是当涉及到我的代码的文本部分时 它向我抛出了这个错误 OSError MoviePy Error
  • Biopython 可以执行 Seq.find() 来解释歧义代码吗

    我希望能够在 Seq 对象中搜索考虑歧义代码的子序列 Seq 对象 例如 以下内容应该是正确的 from Bio Seq import Seq from Bio Alphabet IUPAC import IUPACAmbiguousDNA

随机推荐

  • 玩转你的开发板-1.4.第1季第4部分-朱有鹏-专题视频课程

    玩转你的开发板 1 4 第1季第4部分 1586人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第1季第4个课程 xff0c 主要内容是带领大家玩转课程配套开发板 xff0c 包括 xff1a 开发板的整体配件认识 检测 程
  • Invalid <param> tag: Cannot load command parameter [robot_description]: command [[‘/opt/ros/noetic/l

    Ubuntu20 04 运行LIO SAM遇到这个错误 xff0c 一直解决不掉 xff0c 好像是xacro文件的问题 xff0c 有大佬帮忙看一下吗 xff1f 求求了
  • MDK5 Debug调试方法总结

    常见的Debug方法 连接好硬件DAP之后 xff0c 需要进行一些设置 Debug调试按钮分别对应的功能 按钮1 gt reset复位按钮 按钮2 gt run按钮 xff0c 程序运行按钮 按钮3 gt stop按钮 xff0c 程序停
  • 51单片机(DHT11温湿度传感器)

    一 产品介绍 1 运用场景 xff08 温湿度检测系统 xff09 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器 xff0c 应用领域 xff1a 暖通 空调 xff1b 汽车 xff1b 消费品 xff1b 气
  • 单片机毕设分享 智能窗户系统(源码+硬件+论文)

    文章目录 0 前言1 主要功能2 硬件设计 原理图 3 核心软件设计4 实现效果5 最后 0 前言 x1f525 这两年开始毕业设计和毕业答辩的要求和难度不断提升 xff0c 传统的毕设题目缺少创新和亮点 xff0c 往往达不到毕业答辩的要
  • Linux——实施高级存储功能(VDO)

    一 stratis存储 xff1a stratis存储是一种高效率管理存储的方式 xff0c 可实施灵活的文件系统 xff0c 使之随数据动态增长 需要安装stratus cli和stratisd软件包 stratis pool creat
  • 毕业设计 基于单片机的智能窗户系统(源码+硬件+论文)

    文章目录 0 前言1 主要功能2 硬件设计 原理图 3 核心软件设计4 实现效果5 最后 0 前言 x1f525 这两年开始毕业设计和毕业答辩的要求和难度不断提升 xff0c 传统的毕设题目缺少创新和亮点 xff0c 往往达不到毕业答辩的要
  • 立创EDA怎么批量处理元器件

    1 点击编辑 点击查找相似对象 xff08 也可以按快捷键Ctrl 43 Shift 43 F xff09 2 之后弹出这个对话框 xff0c 搜索你需要的条件 种类 xff1a 选择你需要批量查找的元素类型 范围 xff1a 在当前原理图
  • 超声波模块工作原理

    超声波测距模块工作原理 xff08 1 xff09 采用IO口TRIG触发测距 xff0c 给至少10us的高电平信号 xff08 2 xff09 模块自动发送8个40khz的方波 xff0c 自动检测是否有信号返回 xff1b xff08
  • GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=(u32)8<<12;(学习笔记)

    看原子哥的IIC h文件看到这两个语句有点懵 xff0c 去找了半天资料才懵懵懂懂 xff0c 下面简单记录一下 xff0c 以防下次又忘了 就拿这个举例把 xff0c GPIO一组有 xff08 0 15 xff09 一共16个 前 xf
  • C#public,protected,private,internal,protected internal学习笔记

    比如说 xff1a 一个人A为父类 xff0c 他的儿子B xff0c 妻子C xff0c 私生子D xff08 注 xff1a D不在他家里 xff09 如果我们给A的事情增加修饰符 xff1a 1 public事件 xff1a 地球人都
  • 动手写代码之前必须的准备工作-1.5.第1季第5部分-朱有鹏-专题视频课程

    动手写代码之前必须的准备工作 1 5 第1季第5部分 2423人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第1季第5个课程 xff0c 主要内容是开发环境的搭建 C语言基础知识 数据手册的带读等编程前导知识 学习本课程的
  • Ubuntu:gcc编译报错 fatal error: stdio.h 没有那个文件或目录解决方法

    跟着火哥学习liunx xff0c 在跟着视频学习到第13讲的时候遇到了gcc编译hello c报错的问题 xff0c 也是搞了半天查了很多解决方案都是叫我安装C C 43 43 环境什么的 xff0c 但试了并没有用 xff0c 可能是我
  • 一文教你实现Spring动态启停定时任务

    为什么需要定时任务 定时任务的应用场景十分广泛 xff0c 如定时清理文件 定时生成报表 定时数据同步备份等 Java定时任务的原理 jdk自带的库中 xff0c 有两种技术可以实现定时任务 xff0c 一种是Timer 另一种是 Sche
  • 市面上主流TPMS胎压芯片介绍

    今天的汽车胎压芯片市场是算热闹的 xff0c 相对于2016年时 xff0c 国产 国外的都有了新的变化 xff0c 对产品开发者或者说使用者来说 xff0c 无疑是福音 xff0c 要想国内胎压市场从2005年左右到2016年 xff0c
  • Hbase的安装与配置

    文章目录 Hbase 安装配置一 xff0c 测试Hadoop 安装1 xff0c ssh 免密测试2 xff0c jps 查看进程 二 xff0c 安装Hbase1 xff0c 拷贝Hbase 2 5 0 到 opt 目录下 三 xff0
  • Python 数据可视化的三大步骤

    1 首先 xff0c 要知道我们用哪些库来画图 matplotlib Python中最基本的作图库就是matplotlib xff0c 是一个最基础的Python可视化库 xff0c 一般都是从matplotlib上手Python数据可视化
  • 本文一步一步地教你如何将Python程序打包成exe文件—赶紧进来学习吧

    先来看看几个问题 一 什么是exe可执行文件 xff1f exe文件英文全名是executable file xff0c 翻译为可执行文件 xff08 但它不等于可执行文件 xff09 xff0c 可执行文件包含两种 xff0c 文件扩展名
  • 用python代码画爱心,来自程序猿的浪漫

    不相信python代码可以画爱心 xff1f 先来一张效果图来看看效果吧 xff01 用python代码画爱心的思路是怎样的 xff1f 1 怎么画心形曲线 2 怎么填满心形曲线 3 怎么用 python 画出爱心 接下来看好了 xff0c
  • 从协方差的角度详解线性判别分析原理+Python实现

    目录 写在前面 机器学习强基计划聚焦深度和广度 xff0c 加深对机器学习模型的理解与应用 深 在详细推导算法模型背后的数学原理 xff1b 广 在分析多个机器学习模型 xff1a 决策树 支持向量机 贝叶斯与马尔科夫决策 强化学习等 1