admin管理员组

文章数量:1570208

hello,最近秋招已经开了一部分了,我本科是信息安全,研究生是网络空间安全,本来想走安全,但是由于种种原因还是后面走了另一个课题——深度学习中计算机视觉相关的数据处理,实习有测试和开发两段,所以投递的岗位目前有测试开发、数据科学家和后端开发,其实有人会觉得这个岗位投的太散了,我个人觉得没有,因为数据科学其实是我的课题,而测开这些是我有的实习经验,所以这两个面试并不冲突,面试软件开发和测试开发的时候肯定也会问到我的课题,所以准备数据科学的时候也相当于在复习我的课题,而数据科学可能关注开发问题比较少,但是你有开发这个经验,他会觉得你的代码应该还不错。总之~根据现在面试的岗位总结了一下最近遇到的高频面试问题以及看到别人牛客发的一些面经~后面将会持续更新!

目录

基础八股

1.GET和POST的区别?

2.列表和元组的区别?

3.几种集合的区别?(集合分单列集合和双列集合)

4. 队列、堆和栈,数据结构的实现?

5.cookie和session?

6.怎么解析Http响应?

7.说一下tcp三次握手和四次挥手?如何进行错误处理?

8.指针常量和常量指针?(笔试)

9.二叉树的前中后序?

10.结构体对齐问题(笔试)

11.http状态码?

12.url到网页显示过程?域名解析过程?

13.http和rpc的区别是什么?

14.OSI七层模型?

15.vector和list的区别?

测试开发

1.python中的多进程和多线程?除了threading 还会什么库?如何设计线程数量的?

2.为什么有的时候多线程被认为是没有用的?

3.黑盒测试和白盒测试区别,以及如何选择?

4.覆盖率是什么?

5.python实际开发过什么测试脚本,完整的?

6.协程是什么?和线程的区别?线程和线程池、线程创建方式、run()和start()的区别?

7.如何判断链表是否有环?

利用第三个指针找到环的位置

8.介绍一下如何避免死锁?读写锁和互斥锁模式区别?

9.介绍一下熟悉的排序算法?

10.pcie switch和 expander的区别?

11.linux如何查看cpu和内存使用情况?

12.linux常用命令?

13.python如何进行ssh连接?

14.异常情况很多的情况下怎么覆盖?

1. 识别异常类型

2. 划分异常场景

3. 编写详细的测试用例

4. 使用自动化测试工具

15.登陆页面如何测试/如何测试一个水杯?

16.互斥除了锁能实现还有什么?

17.STL用过什么容器?

18.python中的深拷贝和浅拷贝?

19.python匿名函数

20.python中的生成器和迭代器?

21.不同隔离级别下有哪些锁?

22.事务传播机制?默认的事务传播机制?(Java)

23.python中的ORM?

24.垃圾回收机制、gil锁,如何规避gil锁?

25. redis的了解程度?其他的sql?写个查询出来:一张表里有学生名字和三门科目成绩,查询学生大于80成绩的科目和成绩以及学生姓名?

车企及芯片

1.CAN报文?H264协议?

2.CAN报文是如何交互的?

3.WIFI芯片如何实现网络连接?

机器学习

1.你知道的激活函数有哪些,怎么看待sigmoid()?

2.transformer的结构和注意力机制?

Transformer结构

编码器(Encoder)

解码器(Decoder)

注意力机制

多头注意力(Multi-Head Attention)

自注意力(Self-Attention)

掩码自注意力(Masked Self-Attention)

3.分类问题算法有哪些?

1. 逻辑回归(Logistic Regression)

2. 支持向量机(Support Vector Machine, SVM)

3. 决策树(Decision Tree)

4. 随机森林(Random Forest)

5. 朴素贝叶斯(Naive Bayes)

6. K最近邻(K-Nearest Neighbors, KNN)

7. 梯度提升决策树(Gradient Boosting Decision Trees, GBDT)

4.logistic回归属于线性回归还是分类算法?

5.介绍一下经常使用的库,pandas库了解哪些?

6.pytorch中的dataloader除了用来加载数据还可以用来干什么?

7.准确率和召回率?

8.numpy中的array和torch中的tensor有什么区别?

1. 性能

2. 内存管理

3. GPU 支持

4. 深度学习应用

5. 兼容性

9.如何看待前几年虽然已经有深度学习了,但是近年突然大火?

一、技术积累与突破

二、数据量的增加

三、产业应用的推广

四、社会认知的提升

10.transformer中图像的时序性如何实现的?

1. 序列化处理图像

2. 位置编码

3. 注意力机制

4. 特定领域的Transformer变体

5. 结合其他模型

11.nlp中的单词如何处理的,图像预测中怎么处理文本信息?

1. 数据预处理

2. 模型构建

3. 训练与优化

4. 评估与测试

12.分类和回归算法常用的损失函数有哪些?

13.优化策略有哪些?

1. 数据预处理

2. 模型选择

3. 模型训练

4. 参数调优

5. 特征工程

6. 架构优化

7. 评估与反馈

14.评估指标?

15.降维和PCA主成分分析?

16.偏差和方差

17.有监督学习和无监督学习?

18.标准化和归一化是什么?

19.随机森林和决策树的区别?随机森林比决策树稳定的原因?

随机森林与决策树的区别

随机森林比决策树稳定的原因

20.项目中使用的模型有哪些维度的特征?为什么会选择这些特征?

1.手部关键点特征

2.上下文特征

3.深度特征

21.P值和显著性水平的含义?p值>0.05可能的原因?什么是一二类错误?什么是统计功效?影响统计功效的因素?

P值和显著性水平的含义

p值>0.05可能的原因

一二类错误的定义

统计功效的定义

影响统计功效的因素

22.ROC曲线和AUC值的原理?为什么AUC可以评价一个模型的好坏?

ROC曲线

23.项目的核心指标?如何衡量ROI?说说数据分析如何推动策略?

项目核心指标

ROI的计算公式

衡量ROI的步骤

24.项目难点?项目中遇到的问题?

25.什么是假设检验?假设检验和AB Test的基本原理?假设检验的步骤?

假设检验的定义

基本原理

假设检验的步骤

26.介绍boosting 算法原理?和bagging的区别?

27.数据科学的定位?数据科学家需要具备什么能力?你觉得自己身上最符合的特质是什么?

数据科学家需要具备的能力

自己最符合的特质

外企

准备英文简历和英语自我介绍


基础八股

1.GET和POST的区别?

get和post是HTTP协议中两种常用的请求方法。

GET请求:适合用于获取资源、查询操作等场景。适合传输少量数据,通常用于获取资源,如页面、图片、视频等。由于参数直接附加在URL中,因此GET请求的参数是可见的,并且不适合传输敏感信息。‌由于GET请求只是请求数据,并不对服务器的状态进行修改,因此GET请求可以被缓存,以提高页面加载速度。‌

POST请求:适合用于提交数据、修改服务器状态的场景。适合传输大量数据或复杂数据结构,如提交表单、上传文件等。POST请求将参数放在请求体中,因此相对更加安全,适合传输敏感信息。‌由于POST请求可能对服务器的状态产生影响,每次请求都需要重新获取最新数据,因此POST请求不能被缓存。

2.列表和元组的区别?

元组是不可变的序列,使用圆括号()表示。它可以包含任意类型的元素,如整数、字符串、浮点数等。由于元组是不可变的,一旦创建后,其元素不能被修改、添加或删除。元组是用于存储不可变数据的理想选择,它具有固定长度和不可变性的特点。

列表是可变的序列,使用方括号[]表示。与元组不同,列表的元素可以被修改、添加或删除。列表也可以包含不同类型的元素,并且长度可以动态调整

3.几种集合的区别?(集合分单列集合和双列集合)

单列集合:Collection接口:list、set

  list:LinkedList

          ArrayList

          Vector

  set:HashSet

双列集合:Map接口 :Hashtable、HashMap

1、List,Set都是继承自Collection接口,Map则不是

2、List特点:元素有放入顺序,元素可重复,无需设置长度;另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,

3、Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,但是set只能用迭代,因为他无序,无法用下标来取得想要的值)

4、Map以键值(key-value)的形式来存储数据的,Map 不允许重复键但允许重复值;map存在的意义就是为了快速查找,通过键的直接找到值,因为键是不可重复的。

4. 队列、堆和栈,数据结构的实现?

线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。而与它相对立的概念是非线性表,比如二叉树、堆、图等。

堆:topk排序、桶排序。

栈:维护程序虚拟栈

5.cookie和session?

Session和Cookie是用于跟踪用户会话的技术。cookie 侧重信息的存储主要是客户端行为session 和 token 侧重于身份验证主要是服务端行为。

  • Cookie适用于存储少量简单信息且需要长期保存的场景如用户登录状态保持、个性化设置等;

  • Session适用于存储大量复杂信息且只需要短期保存的场景如购物车功能、表单提交等;

  • 在安全性要求较高的情况下应优先考虑使用Session来跟踪用户会话并采取必要的安全措施来保护Session数据的安全;

  • 在处理大量并发请求时应合理控制服务器上存储的Session数量以避免对服务器性能造成过大影响。

  • Session会有一个超时时间(默认通常是30分钟),如果在这个时间内没有收到来自该session ID的任何请求,那么服务器就会认为该Session已经过期并会将其销毁。

Cookie和Session详解_cookie session-CSDN博客

6.怎么解析Http响应?

与HTTP的请求一样,HTTP响应的数据也分为3部分:响应行响应头响应体。

  •     响应行(以上图中红色部分):响应数据的第一行。响应行由协议及版本、响应状态码、状态码描述组成

        协议/版本:HTTP/1.1
        响应状态码:200
        状态码描述:OK

  •     响应头(以上图中黄色部分):响应数据的第二行开始。格式为key:value形式

    http是个无状态的协议,所以可以在请求头和响应头中设置一些信息和想要执行的动作,这样,对方在收到信息后,就可以知道你是谁,你想干什么

    常见的HTTP响应头有:

    Content-Type:表示该响应内容的类型,例如text/html,image/jpeg ;

    Content-Length:表示该响应内容的长度(字节数);

    Content-Encoding:表示该响应压缩算法,例如gzip ;

    Cache-Control:指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒 ;

    Set-Cookie: 告诉浏览器为当前页面所在的域设置cookie 

  •     响应体(以上图中绿色部分): 响应数据的最后一部分。存储响应的数据

        响应体和响应头之间有一个空行隔开(作用:用于标记响应头结束)

7.说一下tcp三次握手和四次挥手?如何进行错误处理?

正常的三次握手的流程:

   正常的四次挥手流程:


原文链接:https://blog.csdn/ArtAndLife/article/details/120004631

8.指针常量和常量指针?(笔试)

常量指针:

int const *p1;

指向常量的指针。指向地址可变,但内容不可重新赋值,内容的改变智能通过修改地址。

指针常量:

int *const p2;

指向的地址不可重新赋值,不能指向其他地址,但内容可变。

9.二叉树的前中后序?

前:根左右

中:左根右

后:左右根

10.结构体对齐问题(笔试)

条件1:结构体当前大小%自身有效对齐数=0,若无法对齐,填充字节

条件2:结构体总大小%结构体最大对齐字节数=0,若无法对齐,填充字节

11.http状态码?

1XX(临时响应信息提示 )
这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个1xx。
100(继续)- 请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
101(切换协议) - 服务器将遵从客户的请求转换到另外一种协议

2XX(成功)
表示成功处理了请求的状态代码。
200(成功) - 服务器已成功处理了请求。
201(已创建) - 请求成功并且服务器创建了新的资源。
202(已接受) - 服务器已接受请求,但尚未处理。
203(非授权信息) - 服务器已成功处理了请求,但返回的信息可能来自另一来源。
204(无内容) - 服务器成功处理了请求,但没有返回任何内容。
205(重置内容) - 服务器成功处理了请求,但没有返回任何内容。与 204响应不同,此响应要求请求者重置文档视图(例如,清除表单内容以输入新内容)。
206(部分内容) - 服务器成功处理了部分 GET 请求。

3XX - 重定向
表示要完成请求,需要进一步操作。客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求。 建议在每次请求中使用重定向不要超过 5次。 通常,这些状态代码用来重定向。
300(多种选择)- 针对请求,服务器可执行多种操作。服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
301(永久移动)- 请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302(临时移动)- 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303(查看其他位置)- 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304(未修改)- 自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。
305(使用代理)- 请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理。
307(临时重定向)- 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

4XX(客户端错误)
这些状态码表示请求可能出错,客户端似乎有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。 妨碍了服务器的处理。
400(错误请求)- 服务器不理解请求的语法。
401(未授权)- 请求要求身份验证。对于登录后请求的网页,服务器可能返回此响应。
403(禁止)- 服务器拒绝请求。如果您在 Googlebot 尝试抓取您网站上的有效网页时看到此状态码(您可以在 Google网站管理员工具诊断下的网络抓取页面上看到此信息),可能是您的服务器或主机拒绝了 Googlebot 访问。
404(未找到)- 服务器找不到请求的网页。例如,对于服务器上不存在的网页经常会返回此代码。
405(方法禁用)- 禁用请求中指定的方法。
406(不接受)- 无法使用请求的内容特性响应请求的网页。
407(需要代理授权)- 此状态码与 401(未授权)类似,但指定请求者应当授权使用代理。如果服务器返回此响应,还表示请求者应当使用代理。
408(请求超时)- 服务器等候请求时发生超时。
409(冲突)- 服务器在完成请求时发生冲突。服务器必须在响应中包含有关冲突的信息。服务器在响应与前一个请求相冲突的 PUT请求时可能会返回此代码,以及两个请求的差异列表。
410(已删除)- 如果请求的资源已永久删除,服务器就会返回此响应。该代码与404(未找到)代码类似,但在资源以前存在而现在不存在的情况下,有时会用来替代 404 代码。如果资源已永久移动,您应使用 301指定资源的新位置。
411(需要有效长度)- 服务器不接受不含有效内容长度标头字段的请求。
412(未满足前提条件)- 服务器未满足请求者在请求中设置的其中一个前提条件。
413(请求实体过大)- 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414(请求的 URI 过长)- 请求的 URI(通常为网址)过长,服务器无法处理。
415(不支持的媒体类型)- 请求的格式不受请求页面的支持。
416(请求范围不符合要求)- 如果页面无法提供请求的范围,则服务器会返回此状态码。
417(未满足期望值)- 服务器未满足”期望”请求标头字段的要求。

5XX(服务器错误)
这些状态码表示服务器在处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。
500 (服务器内部错误)- 服务器遇到错误,无法完成请求。
500.12- 应用程序正忙于在 Web 服务器上重新启动。
500.13- Web 服务器太忙。
500.15- 不允许直接请求 Global.asa。
500.16- UNC 授权凭据不正确。这个错误代码为 IIS 6.0 所专用。
500.18- URL 授权存储不能打开。这个错误代码为 IIS 6.0 所专用。
500.100- 内部 ASP 错误。
501 (尚未实施)- 服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。
502 (错误网关)- 服务器作为网关或代理,从上游服务器收到无效响应。
503 (服务不可用)- 服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
504 (网关超时)- 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 (HTTP 版本不受支持)- 服务器不支持请求中所用的 HTTP 协议版本。

12.url到网页显示过程?域名解析过程?

  • URL输入:url(Uniform Resource Locator)统一资源定位符。协议+域名+路径+查询参数
  • DNS解析:
    • 向本地DNS缓存中查找是否已存在相应的IP地址
    • 向根域名请求获取顶级域名服务器IP地址,然后逐级往下查询,直到查询到相应的本地DNS服务器。(根域名->顶级域名->次级域名)
  • 建立TCP连接:浏览器通过IP地址和端口号向服务器发起连接请求,在建立TCP连接后,浏览器会发送HTTP请求报文给服务器。
  • 解析HTTP/HTTPS请求:服务器收到HTTP请求报文后,会处理请求并生成相应HTTP响应报文,然后将HTTP响应报文发送回浏览器。
  • 服务器响应请求,后端处理完请求后,将结果封装成JSON格式返回前端。
  • 浏览器解析渲染页面:
    • 使用HTML解析器将HTML文档解析成DOM树
    • 使用CSS解析器将CSS文件解析成样式规则
    • 根据DOM树和样式规则进行渲染
  • HTTP请求结束,TCP断开连接。

13.http和rpc的区别是什么?

1. RPC是什么

RPC(Remote Procedure Call)是一种远程过程调用协议,它允许程序调用另一个地址空间(通常是在另一台计算机上)的过程或方法。流行的PRC框架很多,例如gRPC。

gRPC是Google开发的一个高性能、开源的通用RPC框架,支持多种编程语言。gRPC使用Protocol Buffers(简称Protobuf)作为IDL(接口定义语言)和二进制数据传输格式,这使得gRPC具有高性能、跨语言支持和强类型安全等优点。

2. 为什么使用RPC而不是HTTP

在服务端渲染场景中,前端应用需要频繁地与后端服务进行通信以获取数据。使用HTTP协议可能会遇到以下问题:

  1. 性能较低:HTTP协议使用文本格式传输数据,这会导致数据冗余和传输效率较低。
  2. 传输数据冗余较大:HTTP协议的头部字段通常包含大量重复信息,这会增加传输数据的冗余。

使用RPC(如gRPC)可以解决这些问题:

  1. 高性能、低延迟:gRPC使用二进制格式传输数据,减少数据冗余和提高传输效率。同时,gRPC默认使用HTTP/2协议,支持多路复用、头部压缩等特性,降低延迟并提高传输性能。
  2. 更紧凑的数据传输:gRPC使用Protobuf作为数据传输格式,它具有更紧凑的数据表示,降低了传输数据的冗余。

具体的业务场景下,如果使用http调用后台服务,一般需要经过后台的一个rpc-http中转服务(因为后台基本都是rpc服务,需要一个类似网关的存在让http与rpc可以互相调用),加上http本来存在的性能问题。直接调用rpc比调用http,可以有较为明显的耗时减少(我的接口有大概20-30%的耗时减少)

除了更低的耗时,直接调用RPC服务,可以减少rpc-http中转服务这层的调用,降低了调用链路的复杂度和服务器资源的消耗。

很多公司的RPC服务都有成熟的服务间调用监控和链路追踪,日志打印等服务,直接调用RPC可以享受到这些既有框架的技术成果。

3. HTTP与RPC对比

服务端渲染场景无疑是使用RPC是优于HTTP的,但是HTTP与RPC其实各有优缺点,下面我们分几个维度对比下HTTP与RPC的优缺点。

  1. 通信效率:HTTP协议的无状态性质和文本数据传输,它在处理大量请求时可能效率较低。而RPC协议通常使用二进制数据传输,能够更高效地处理请求和响应
  2. 数据传输: HTTP协议通常使用JSON或XML等文本格式进行数据传输,而RPC协议可以使用多种数据传输格式,如二进制、JSON、XML等,具体取决于所使用的RPC框架和协议
  3. 接口定义:HTTP协议通常需要遵循约定(如RESTful规范)或使用额外的描述语言(如OpenAPI)来描述API接口;RPC协议使用跨语言的IDL(如Protobuf)来描述接口,具有更强的类型安全性。
  4. 异常处理: HTTP协议使用HTTP状态码来表示请求的状态,如200表示成功,404表示资源不存在等。而RPC协议通常使用自定义的异常处理机制,可以更细粒度地处理各种异常情况
  5. 适用场景:HTTP协议主要用于Web应用(浏览器环境,不支持RPC,只能使用HTTP),适用于构建RESTful API和前后端分离的项目;RPC协议主要用于分布式系统,适用于构建高性能、低延迟的微服务架构。
  6. 复杂性: HTTP协议基于简单的请求-响应模式,易于理解和实现。RPC协议的抽象层次较高,学习成本相对较高。开发者需要了解RPC协议的原理和具体实现,以及如何使用IDL描述接口

14.OSI七层模型?

物理层:ISO2110、IEEE802、IEEE802.2

数据链路层:以太网协议、PPP协议、ARP、RARP

  • 在以太网首部找到MAC地址判断是否为自己,不是就丢弃。如果是,就在以太网首部找到数据类型传给IP/ARP

网络层:IP、RIP、ICMP、OSPF、BGP、IGMP

  • 决定接收此包的路由/主机,判断IP对否,传给TCP/UDP

传输层:TCP、UDP

  • 计算校验和,判断是否被破坏,然后检查是否按序号发送,完整接收后检查端口号,传给具体的应用程序。

会话层:RPC、NetBIOs

表示层:ASCII、JPEG

应用层:HTTP、FTP、SMTP、DNS、Telnet

15.vector和list的区别?

1. Vector和List容器的特性对比

    底层数据结构:
        vector: 基于动态数组实现,元素在内存中是连续存储的。
        list: 基于双向链表实现,元素在内存中不是连续存储的,每个节点包含指向前一个和后一个节点的指针。

    随机访问效率:
        vector: 支持常数时间复杂度的随机访问,因为元素在内存中是连续存储的。
        list: 不支持随机访问,访问中间元素的效率较低。

    插入/删除效率:
        vector: 在尾部进行插入和删除操作高效,但在中间插入和删除操作需要移动后续元素,效率较低。
        list: 在任意位置插入和删除操作都很高效,不会涉及到元素的移动。

    迭代器失效:
        vector: 在插入和删除操作后,可能会导致迭代器失效。
        list: 插入和删除操作不会导致迭代器失效,可以安全地在遍历过程中进行这些操作。

2. Vector和List容器的优缺点对比

    Vector优点:
        高效的随机访问。
        内存占用更小,没有额外的指针开销。
        在尾部插入和删除操作高效。

    Vector缺点:
        中间插入和删除操作效率低。
        插入和删除元素可能导致迭代器失效。

    List优点:
        高效的插入和删除操作。
        不会导致迭代器失效。
        适合频繁进行插入和删除操作的场景。

    List缺点:
        不支持随机访问,访问中间元素效率低。
        占用更多的内存空间,每个节点都需要额外的指针开销。

3. Vector和List容器的适用场景对比

    选择Vector的场景:
        需要高效的随机访问。
        需要在尾部进行频繁的插入和删除操作。
        数据量较大且内存占用敏感的场景。

    选择List的场景:
        需要频繁在中间进行插入和删除操作。
        不确定插入和删除位置的场景。
        不需要频繁进行随机访问的场景。

16. 完全二叉树的性质?

‌完全二叉树的基本性质‌:

完全二叉树‌是一种特殊的二叉树结构,其中所有层次都是完全填充的,除了可能最底层,在最底层上元素从左侧开始填充。完全二叉树的叶子结点只可能在最大的两层出现,且最后一层的节点都集中在该层最左边的若干位置。‌

完全二叉树的深度和节点数量关系

具有n个节点的完全二叉树的深度为k=log2n+1。这是因为完全二叉树的每一层最多有2^i个节点(i为层数),而最后一层的节点数不超过2^k-1。因此,完全二叉树的深度可以通过计算节点数量来确定。‌

完全二叉树与满二叉树的区别

完全二叉树与满二叉树的主要区别在于最后一层的填充情况。满二叉树的每一层都完全填充,而完全二叉树在最后一层可能不是完全填充的,且最后一层的节点从左侧开始填充。此外,完全二叉树不一定是满二叉树,因为它的最后一层可能缺少连续的节点。‌

延伸问题:一颗完全二叉树一共有13层,倒数第二层的叶子节点有532个,问总共多少个节点?

首先,我们计算前12层的节点总数,这确实是一个等比数列的和,如之前所述,为 212−1=4095。

第12层的总节点数是 211=2048。

第12层的叶子节点数是532。

因此,第12层的非叶子节点数是 2048−532=1516。

第13层的节点数应该是第12层非叶子节点数的两倍,即 2×1516=3032。

最后,整棵完全二叉树的总节点数为前12层的节点数加上第13层的节点数,即 4095+3032=7127。

测试开发

1.python中的多进程和多线程?除了threading 还会什么库?如何设计线程数量的?

多线程:IO密集型

多进程:CPU密集型

threading->简单多线程

cocurrent.futures:  threadPoolExecutor,  ProcessPoolExecutor

multiprocessing:多进程

根据IO等待时间和CPU处理时间进行线程数量设置。

2.为什么有的时候多线程被认为是没有用的?

Python的多线程在某些情况下被认为是“没用”的,主要是因为全局解释器锁(Global Interpreter Lock,GIL)

1. 全局解释器锁(GIL):Python的标准实现,CPython,有一个全局解释器锁。GIL确保任何时候只有一个线程在解释器中执行Python字节码。这意味着即使在多核处理器上,多个线程也不能有效地并行执行Python代码。

2. 多线程和I/O密集型任务:对于I/O密集型任务(如文件读写、网络通信等),多线程在Python中仍然很有用。在这些情况下,线程可能会在等待I/O操作完成时让出GIL,使得其他线程可以执行。

3. CPU密集型任务:对于CPU密集型任务,Python的多线程通常不如多进程,因为多进程可以绕过GIL的限制,在多核处理器上实现真正的并行计算。

4. 其他实现和解决方案:一些Python的其他实现,如Jython和IronPython,没有GIL的限制。此外,使用多进程、协程(如asyncio)或使用C扩展编写的代码,也是绕过GIL限制的常见方法。

3.黑盒测试和白盒测试区别,以及如何选择?

黑盒(功能性)测试和白盒(结构性)测试,

        黑盒测试实际上是检查以下几点是否满足要求:

  • 正确性 (Correctness):计算结果,命名等方面。
  • 可用性 (Usability):是否可以满足软件的需求说明。
  • 边界条件 (Boundary Condition):输入部分的边界值,就是使用等价类划分,试试最大最小和非法数据等等。
  • 性能 (Performance):程序的性能取决于两个因素:运行速度的快慢和需要消耗的系统资源。如果在测试过程中发现性能问题,修复起来是非常艰难的,因为这常常意味着程序的算法不好,结构不好,或者设计有问题。因此在产品开发的开始阶段,就要考虑到软件的性能问题。
  • 压力测试 (Stress):多用户情况可以考虑使用压力测试工具,建议将压力和性能测试结合起来进行。如果有负载平衡的话还要在服务器端打开监测工具 , 查看服务器 CPU 使用率,内存占用情况,如果有必要可以模拟大量数据输入,对硬盘的影响等等信息。
  • 错误恢复 (Error Recovery):错误处理,页面数据验证,包括突然间断电,输入错误数据等。
  • 安全性测试 (Security):特别是一些商务网站,或者跟钱有关,或者和公司秘密有关的 web 更是需要这方面的测试。
  • 兼容性 (Compatibility):不同浏览器,不同应用程序版本在实现功能时的表现。应用黑盒测试技术,能够设计出满足下述标准的测试用例集:a.所设计出的测试用例能够减少为达到合理测试所需要设计的测试用例总数;b.所设计出的测试用例能够告诉我们,是否存在某些类型的错误,而不仅仅指出与特定测试相关的错误是否存在。

        白盒测试也称结构测试或逻辑驱动测试,是一种以理解软件内部结构和程序运行方式为基础的软件测试技术,通常需要跟踪一个输入经过了哪些处理,这些处理方式是否正确。

  • 语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖、路径覆盖等
  • 它是深入到代码一级的测试,使用这种技术发现问题最早,而且效果也是最好的。

白盒测试和黑盒测试都是非常重要的环节,不存在技术含量谁高谁低的问题,只是两者的偏重不同,使用的技术也不同。

黑盒测试人员偏重于业务方面,而白盒测试人员侧重于实现方式;

黑盒测试注重整体,而白盒测试则更注重局部;

白盒测试是对过程的测试,黑盒测试是对结果的测试。

既用到黑盒的,又用到白盒的,因此称为灰盒测试。

首先要用黑盒测试来验证结果是否正确,或者说目标是否正确,如果结果正确,然后再用白盒测试来验证,这个正确的结果是不是由于正确的过程产生的。

4.覆盖率是什么?

覆盖率是用来度量测试完整性的一个手段,是测试技术有效性的一个度量。表明我们的测试用例是否真正完全覆盖了应用程序代码中的各种可能以及在运行这些测试用例时执行了多少代码。

如果有10个需求并创建了100个场景测试用例,并且执行了90个测试用例,则测试覆盖率为90%。分为:白盒覆盖、灰盒覆盖和黑盒覆盖;测试用例设计不能一味追求覆盖率,因为测试成本随覆盖率的增加而增加。

覆盖率=(至少被执行一次的item数)/item的总数

5.python实际开发过什么测试脚本,完整的?

6.协程是什么?和线程的区别?线程和线程池、线程创建方式、run()和start()的区别?

协程:编程者自己控制,可以设置优先级,非抢占式。

线程:操作系统调度,抢占式

yield、await、async

7.如何判断链表是否有环?

存在环就说明链表的尾节点不是指向 null,而是指向了链表中的另一个节点,只有这样才会构成环,如下图所示就是一个存在环的单向链表:

1.Set对象

思路:直接遍历链表,并且判断当前节点是否存在于Set集合中,如果存在,那就说明当前链表存在环,如果不存在,那么我们就将当前链表节点存入Set集合中,并继续往后遍历,如果存在环,那么Set集合中就一定会发生碰撞,如果不存在环,那么就一定有一个节点的 next 指针指向null,所以循环也会终止。

2.快慢双指针

思路:设想一下这个场景,如果说有两个人在圆形跑道上跑步,一个人一秒钟跑一米,另一个人一秒钟跑两米,然后他们两同时开始并且一直跑,只要体力允许,他们两人一定会在某一个节点相遇;相反,如果是直线跑道,那么他们就不可能相遇。

    快慢双指针法主要步骤为:定义两个指针,一个 slow 指针,一次走一步;另一个 fast 指针,一次走两步(必须是两步后面有注释)。如果可以在某一个点满足 slow = fast,那么就说明存在环,否则 fast指针必然先到到终点。

利用第三个指针找到环的位置

继续回到上面的等式:a=(n-1)*(b+c) + c,然后我们可以发现,其实 b+c 正好等于环的长度,也就是说:从链表头部到入环的距离(a)恰好等于从相遇点到入环点的距离(c)再加上 n-1 圈个环的长度。

这时候就有个有趣的现象了,如果 slowfast 相遇了,那么这时候我们再定义一个指针指向链表起点,一次走一步,slow 指针也同步继续往后走,那么这两个指针就一定会在链表的入口位置相遇

8.介绍一下如何避免死锁?读写锁和互斥锁模式区别?

读写锁(共享——独占锁):区分读操作和写操作,允许多个线程同时读(获取读锁),但是只有一个线程获取写锁进行写操作。

互斥锁(独占锁):保证任何时候只有一个线程可以访问共享资源,无论是读/写(严格串行化)

read_mode:在此模式下,第一个读者取得读写锁,所有写锁阻塞,而读者可以申请,而最后一个读者释放锁,退出该模式

write_mode:当一个写者取得读写锁,所有读者写者阻塞,当申请锁的写者释放锁后退出改模式。

9.介绍一下熟悉的排序算法?

稳定的(插冒归基)

基数排序:先比个位、再十位,再百位。

不稳定的(选快希堆)

10.pcie switch和 expander的区别?

pcie接nvme盘, expander接SAS和SATA盘。

nvme盘充分利用pcie的高带宽和低延迟,具有极高的数据传输速度和IOPS。

pcie协议由四个层组成:应用层、事务层、数据链路层、物理层。

11.linux如何查看cpu和内存使用情况?

top/free/uptime/nmon/htop

12.linux常用命令?

关机、重启、目录操作(如shutdown、reboot、cd、ls、mkdir、rm等)、文件操作(如touch、rm、vi/vim)、压缩文件操作(tar、gzip)、查找命令(grep、find、locate、whereis、which)以及用户切换(su、sudo)。

关机
shutdown -h now 立刻关机
shutdown -h 5 5分钟后关机
poweroff 立刻关机
重启
shutdown -r now 立刻重启
shutdown -r 5 5分钟后重启
reboot 立刻重启
文件的查看命令:cat/more/less/tail
cat:看最后一屏
示例:使用cat查看/etc/sudo.conf文件,只能显示最后一屏内容
cat sudo.conf
more:百分比显示
示例:使用more查看/etc/sudo.conf文件,可以显示百分比,回车可以向下一行,空格可以向下一页,q可以退出查看
more sudo.conf
less:翻页查看
示例:使用less查看/etc/sudo.conf文件,可以使用键盘上的PgUp和PgDn向上 和向下翻页,q结束查看
less sudo.conf
tail:指定行数或者动态查看
示例:使用tail -10 查看/etc/sudo.conf文件的后10行,Ctrl+C结束
tail -10 sudo.conf

示例:打包并压缩/usr/tmp 下的所有文件 压缩后的压缩包指定名称为xxx.tar
tar -zcvf ab.tar aa.txt bb.txt
其中:
z:调用gzip压缩命令进行压缩
c:打包文件
v:显示运行过程
f:指定文件名
命令行模式command mode)
控制屏幕光标的移动,字符、字或行的删除,查找,移动复制某区段及进入Insert mode下,或者到 last line mode。
命令行模式下的常用命令:
【1】控制光标移动:↑,↓,j
【2】删除当前行:dd
【3】查找:/字符
【4】进入编辑模式:i o a
【5】进入底行模式::
编辑模式(Insert mode)
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。
编辑模式下常用命令:
【1】ESC 退出编辑模式到命令行模式;
底行模式(last line mode)
将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
底行模式下常用命令:
【1】退出编辑: :q
【2】强制退出: :q!
【3】保存并退出: :wq

13.python如何进行ssh连接?

调用paramiko.SSHClient()

14.异常情况很多的情况下怎么覆盖?

等价类、判定表等

1. 识别异常类型

首先,需要明确和识别可能发生的所有异常类型。这通常需要对系统或应用程序有深入的了解,包括其设计、架构、功能以及潜在的错误源。

2. 划分异常场景

将异常场景划分为不同的类别或组,以便更有条理地进行测试。例如,可以根据异常发生的上下文(如输入验证、数据库操作、网络通信等)或异常的性质(如资源不足、权限错误、数据冲突等)来划分。

3. 编写详细的测试用例

为每种异常类型或场景编写详细的测试用例。这些测试用例应涵盖触发异常的各种可能情况,包括边界条件和极端情况。

  • 边界条件:例如,输入字段的最大长度、最小长度、空值、特殊字符等。
  • 极端情况:如系统资源极度匮乏(如磁盘空间不足、内存溢出)、网络中断、电源故障等。

4. 使用自动化测试工具

自动化测试工具可以帮助你自动生成各种边界和异常情况的测试用例,并将测试结果自动化地记录下来。这不仅可以提高测试的效率和准确性,还可以减少人为错误。

15.登陆页面如何测试/如何测试一个水杯?

一.登陆页面如何测试

  1. 功能测试
    • 正常登陆:验证使用正确的用户名和密码能否成功登陆。
    • 错误处理:输入错误的用户名或密码时,系统应给出明确的错误提示。
    • 特殊字符与空格处理:测试用户名和密码中包含特殊字符或空格的情况。
    • 空值测试:保持输入框为空进行登陆尝试,系统应给出相应的提示。
    • 验证码验证:如果登陆页面包含验证码,验证验证码的生成、显示及验证逻辑是否正确。
  2. 界面测试
    • UI一致性:检查登陆页面的UI设计是否与UI设计稿一致,包括颜色、字号、边距等。
    • 布局合理性:确保输入框、按钮等元素的布局合理,易于用户操作。
  3. 安全测试
    • 密码加密:验证密码在传输过程中是否被加密(如使用HTTPS)。
    • 防止SQL注入:检查系统是否对输入进行了适当的处理,以防止SQL注入攻击。
    • 防止跨站脚本(XSS):确保系统能够过滤或转义用户输入,防止XSS攻击。
    • 登陆尝试限制:设置登陆尝试次数限制,防止暴力破解。
  4. 性能测试
    • 加载时间:测试登陆页面的加载时间,确保其在可接受的范围内。
    • 高并发处理:模拟高并发场景,确保登陆界面能够处理多个同时登陆的请求。
  5. 兼容性测试
    • 浏览器兼容性:确保登陆页面在不同浏览器和版本上都能正常工作。
    • 设备兼容性:测试在不同设备和操作系统上的显示效果和功能性。
  6. 用户体验测试
    • 易用性:检查所有界面元素是否对用户友好,易于理解和使用。
    • 反馈机制:确保用户操作后系统能给出及时的反馈,如加载提示、成功提示等。

二.如何测试一个水杯

  1. 功能测试
    • 容量测试:验证水杯的容量是否符合标注值。
    • 密封性测试:检查水杯在装满水并拧紧盖子后是否漏水。
    • 保温性测试(如果水杯具有保温功能):测试水杯的保温效果是否达到要求。
  2. 性能测试
    • 耐用性测试:模拟日常使用场景,测试水杯的耐用程度,如摔落测试、长时间使用测试等。
    • 耐热耐寒测试:测试水杯在极端温度下的表现,如高温是否变形、低温是否易碎等。
  3. 界面测试
    • 外观检查:检查水杯的外观是否完整、美观,颜色搭配是否舒适。
    • 材质检查:验证水杯的材质是否符合安全标准,是否对人体有害。
  4. 安全测试
    • 有害物质测试:检测水杯是否含有对人体有害的物质,如重金属、塑化剂等。
    • 稳定性测试:确保水杯在放置时不易倾倒,避免烫伤等安全隐患。
  5. 易用性测试
    • 握持感测试:检查水杯的把手或边缘设计是否便于握持。
    • 清洗便利性测试:评估水杯是否易于清洗,无死角。
  6. 兼容性测试
    • 液体兼容性测试:测试水杯是否能安全地装盛不同种类的液体,如热水、冷水、果汁、碳酸饮料等。

16.互斥除了锁能实现还有什么?

条件变量、原子操作。

17.STL用过什么容器?

C++STL中的各种容器,包括vector、list、deque、stack、queue、priority_queue、set、multiset、map和unordered_map。

18.左值引用和右值引用,什么时候用右值引用?

左值(Lvalue)和右值(Rvalue)

  • 左值:可以取地址、有名字的值,通常出现在赋值语句的左边。左值代表了一个持久的对象或函数的状态,它们在内存中有一个持久的位置。例如,变量、数组元素、函数返回引用等。
  • 右值:不能取地址、没有名字的值,通常出现在赋值语句的右边。右值是一个临时的值,它们通常表示计算结果、函数返回的临时对象等。在C++11之前,右值在表达式求值结束后通常会被销毁。

左值引用和右值引用

  • 左值引用:使用&符号定义,它可以引用一个左值。左值引用在C++中非常常见,用于传递大型对象时避免拷贝,提高效率。
  • 右值引用:C++11引入的新特性,使用&&符号定义,专门用来引用右值。右值引用允许我们“捕获”即将被销毁的右值对象,从而可以对它们进行操作,比如将它们移动到另一个对象中,避免不必要的拷贝。

何时使用右值引用?

  • 移动语义:当你想将一个即将被销毁的对象(右值)的资源“移动”到另一个对象中,而不是拷贝时,应该使用右值引用。移动操作通常比拷贝操作更快,因为它可以直接接管资源的所有权,而不是复制资源。例如,在标准库中的std::vectorstd::string等类中,就使用了移动构造函数和移动赋值运算符来支持移动语义。
  • 完美转发:在模板编程中,使用右值引用和std::forward可以实现参数的完美转发,即保持参数的原始值类别(左值或右值)不变地传递给另一个函数。这对于编写通用库函数非常有用。

通俗理解

  • 想象你正在搬家,有一些家具(对象)需要从一个地方(原始位置)搬到另一个地方(新位置)。
  • 左值就像是你家里的固定家具,它们有固定的位置,你不能轻易地把它们“移动”到其他地方,只能“拷贝”一份新的家具放到新地方(这可能会很费时费力)。
  • 右值就像是你在商店里买的新家具,它们还没有固定的位置,你可以轻松地“移动”它们到你想要的地方,而不是再“拷贝”一份(这样更快捷)。
  • 右值引用就是你手中的“搬运工具”,它可以帮助你轻松地“移动”这些还没有固定位置的家具(右值)到你想要的地方。

18.python中的深拷贝和浅拷贝?

  • 浅拷贝只复制对象的第一层结构,深拷贝复制了对象的所有层级结构。
  • 浅拷贝会共享引用,而深拷贝则创建完全独立的新对象。
  • 使用 copy 模块的 copy() 函数进行浅拷贝,使用 copy.deepcopy() 函数进行深拷贝。

何时使用浅拷贝和深拷贝?

  • 使用浅拷贝当你只关心顶层结构,而不关心嵌套对象的修改是否会影响原始对象。
  • 使用深拷贝当你需要创建一个原始对象的完整独立副本,以便修改副本不影响原始对象。
import copy

original_list = [1, 2, [3, 4]]
shallow_copied_list = copy.copy(original_list)

# 修改浅拷贝列表中的不可变元素
shallow_copied_list[0] = 10
print(original_list)  # 输出: [1, 2, [3, 4]],原始列表未受影响
print(shallow_copied_list)
#[1, 2, [3, 4]]
#[10, 2, [3, 4]]

# 修改浅拷贝列表中的可变子列表
shallow_copied_list[2][0] = 30
print(original_list)  # 输出: [1, 2, [30, 4]],原始列表也受到影响
print(shallow_copied_list)
#[1, 2, [30, 4]]
#[10, 2, [30, 4]]

19.python匿名函数

1、匿名函数就是没有名字的函数,它主要应用在需要一个函数、但是后面又不会在需要,更不想费神去命名这个函数的场合。通常情况下,这样的函数只使用一次。

lambda表达式,被称为匿名函数,如:lambda x, y : x+y,冒号前的x、y是所需参数,冒号后的x+y是所要运行的表达式,返回值就是计算后的结果,如:(lambda x, y : x+y)(1, 2),结果为3。


2、匿名函数的语法格式

name = lambda [arg1 [,arg2,...,argn]]:expression

相关参数如下:

name:用于调用lambda表达式。

[arg1 [,arg2,...,argn]]:可选参数,用于指定要传递的参数列表,多个参数间使用逗号“,”分隔。

expression:必选参数,用于指定一个实现具体功能的表达式。如果有参数,那么在该表达式中将应用这些参数。

注意点:lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。lambda 函数不能包含命令,包含的表达式不能超过一个。

优点:

- 使用Python写一些脚本时,使用lambda可以省去定义函数的过程,让代码更加精简。

- 对于一些抽象的,不会被别的地方再重复使用的函数,有时候函数起个名字也是个难题,使用lambda不需要考虑命名的问题

- 使用lambda在某些时候然后代码更容易理解

5.应用:在内置函数 max() 求最大值,min()求最小值, map() 映射, reduce 合并, filter() 过滤

20.python中的生成器和迭代器?

迭代器(Iterator)和生成器(Generator)在python中都是处理序列数据时非常重要的概念,它们都属于python的迭代协议的一部分,用于遍历数据集合。

生成器属于迭代器的一种特殊形式。



python迭代器和生成器-CSDN博客

python的for循环就是通过迭代器来实现的,当我们使用for循环遍历一个容器时,python会自动创建一个迭代对象,并调用__next__()方法来获取容器中的下一个元素,知道容器中的所有元素都被遍历完毕。除了使用for循环,还可以使用iter()函数来手动创建一个迭代器对象,并使用next()函数来获取容器中的下一个元素,这种方式可以让我们更灵活地控制迭代的过程。迭代器可以让我们更加方便的遍历容器中的元素,提高代码可读性和可维护性。

可以直接作用于for循环的数据类型有:1、集合数据类型,如list、tuple、dict、set、str等;2、generator,包括生成器和带yeild的generator function。这些可以直接作用于for循环的对象统称为可迭代对象:iterable;而可以被next()函数调用并不断返回下一个值的对象称为迭代器:iterator。

生成器(generator)与普通函数在执行流程上的差异是其核心特性之一

    普通函数:当调用一个普通函数时,它会从函数的第一行代码开始顺序执行,直到遇到return语句或者执行到函数的最后一行。返回值是在函数执行过程中遇到return时确定的,并且一旦函数执行完毕,它的内部状态就会被销毁。
    生成器函数:而定义为生成器的函数会在每次调用next()方法或使用for循环迭代时才执行。首次调用时,函数会运行到第一个yield表达式并暂停,同时返回yield后面的值。此后每次调用next()时,函数都会从上次暂停的地方继续执行,再次遇到yield表达式时再次暂停并返回新的值。这种“分段执行”和“状态保留”的机制使得生成器特别适合处理大量数据流或需要保持中间状态的任务,比如斐波那契数列生成、文件读取等场景。

总结来说,生成器是一种特殊的迭代器,可以控制程序的执行流程,按需产生结果,并能够在多次调用之间保持内部状态。

迭代器和生成器是Python中用来简化代码、优化性能和管理资源的重要工具,在处理大规模数据、编写高效算法及构建复杂程序逻辑时发挥着重要作用。

21.不同隔离级别下有哪些锁?

MySQL不同隔离级别下的锁类型

MySQL的事务隔离级别主要有四种:读未提交、读已提交、可重复读和串行化。不同隔离级别下使用的锁类型也不同,主要包括‌记录锁(Record Lock)、‌间隙锁(Gap Lock)、‌插入意向锁(Insert Intention Lock)等。

  1. 读未提交(READ UNCOMMITTED)

    使用行级别的记录锁。‌
  2. 读已提交(READ COMMITTED)

    使用行级别的记录锁。‌
  3. 可重复读(REPEATABLE READ)

    使用记录锁、间隙锁。‌
  4. 串行化(SERIALIZABLE)

    使用记录锁、间隙锁和插入意向锁。‌

每种锁的作用和适用场景

  1. 记录锁(Record Lock)‌:

    • 对索引记录加锁,防止其他事务修改或删除该记录。
    • 适用于单条记录的更新操作。
  2. 间隙锁(Gap Lock)‌:

    • 对索引记录的间隙加锁,防止其他事务在该间隙内插入新记录。(他锁定的是一个区间(索引记录之间的间隔,这些间隔中不包含任何索引记录),而不是具体的记录)
    • 适用于在可重复读事务隔离级别下防止幻读,即确保在同一事务中读取同样范围数据时,能保持数据的一致性,不会出现其他事务并发插入的新行。
  3. 插入意向锁(Insert Intention Lock)‌:

    • 在执行INSERT操作前加锁,用于解决插入时的冲突。
    • 适用于并发插入操作。

22.事务传播机制?默认的事务传播机制?(Java)

Spring提供了七种事务传播机制‌,这些机制定义了当一个事务方法调用另一个事务方法时,Spring如何管理这些方法之间的事务边界。这七种传播机制包括:

  1. Propagation.REQUIRED‌:这是默认的传播机制,如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这种机制确保了多个事务操作在同一个事务中执行,以保持数据一致性。
  2. Propagation.SUPPORTS‌:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  3. Propagation.MANDATORY‌:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  4. Propagation.REQUIRES_NEW‌:创建一个新的事务,如果当前存在事务,则把当前事务挂起。这确保了内部方法的新事务与外部方法的事务独立,互不干扰。
  5. Propagation.NOT_SUPPORTED‌:以非事务的方式运行,如果当前存在事务,则把当前事务挂起。
  6. Propagation.NEVER‌:以非事务的方式运行,如果当前存在事务,则抛出异常。
  7. Propagation.NESTED‌:如果当前存在事务,则创建一个新的事务作为当前事务的嵌套事务运行;如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED。

Propagation.REQUIRED

这是默认的传播机制,我们最常用的一种,也是@Transactional默认的一种

如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务

23.python中的ORM?

Python ORM(Object-Relational Mapping)框架能够将Python中的对象模型和数据库中的关系模型进行映射。常见的Python ORM框架包括SQLAlchemy、Django ORM、peewee等。

SQLAlchemy是一个强大的Python ORM框架,主要应用于以下场景:

    数据库访问和操作:SQLAlchemy提供了高层抽象来操作数据库,可以避免写原生SQL语句。支持多种数据库后端。
    ORM映射:建立Python类与数据库表的映射关系,简化数据模型的操作,支持声明式操作。
    复杂查询: SQLAlchemy提供丰富的查询方式,如过滤、分组、联结等,可以构建复杂查询。
    异步查询:基于Greenlet等实现异步查询,提高查询效率。
    事务控制: 通过Session管理数据库会话和事务。
    工具集成:如数据迁移工具Alembic,可以实现Schema版本控制和迁移。
    大数据集查询:基于Pagination实现数据分页,避免大量数据查询内存溢出。
    多数据库支持:支持Postgres、MySQL、Oracle等主流数据库。
    Web框架集成:框架如Flask可以集成SQLAlchemy,便于Web应用开发。

24.垃圾回收机制、gil锁,如何规避gil锁?

Python的垃圾回收机制,主要包括引用计数、标记-清除和分代回收三个部分。引用计数是主要机制,用于跟踪对象的引用次数,当计数为0时对象被销毁。标记-清除用于解决循环引用问题,通过遍历对象图来回收无引用的对象。分代回收则根据对象的存活时间将对象分到不同代,年轻代更频繁地进行垃圾回收,老年代则较少。这些机制协同工作以优化内存使用和性能。

Python垃圾回收机制详解-CSDN博客

https://wwwblogs/chaojiyingxiong/p/17806460.html

25. redis的了解程度?其他的sql?写个查询出来:一张表里有学生名字和三门科目成绩,查询学生大于80成绩的科目和成绩以及学生姓名?

26.后端数据出现了问题如何解决,思路是什么?

优化主要分两步:1. 解决慢 SQL;2. 解决堆积报警;

慢 SQL

解决慢 SQL 的思路很简单,根据慢 SQL 日志,找到对应的慢 SQL 进行优化即可。优化可以从两个方向来进行,一种是基于 SQL 本身来进行优化,另一种是可以通过缓存来解决。这里需要根据具体的业务来选择,如果不是经常变动的数据,则可以通过增加缓存来解决,刚好我这里就可以满足。

经过分析可以通过增加 Redis 缓存来解决这个问题,所以通过引入的 Redis 解决了慢 SQL 问题。

消息堆积

队列消息堆积的处理方式无非也就是两种,减少数据量,加快处理速度。

消息队列里面的消息因为是上游发过来的,没办法从发送方进行减少,不过分析了一下消息类型,发现有很多消息的类型是完全不需要关心的,所以第一步增加消息过滤,将无用的消息直接提交掉。

另外之前遇到消息堆积的时候,观察到消费消息的 TPS 特别低,有时候只有个位数,完全不正常,而且每次重启过后 TPS 可以达到几千的级别,并且每次堆积的时候在日志层面都有一些“断开连接” 的错误。

所以从日志层面分析,肯定是消费线程出了问题,导致消费能力下降从而堆积,从而问题就转变为为什么线程会出现异常。

仔细查了下应用层面的监控,发现应用有频繁的 FullGC 发生,奇怪的是为什么频繁 FullGc 却没有触发报警呢?看了一眼简直要吐血,因为 FullGc 的报警开关被关了。。。

至此基本上能知道问题的原因了,因为发生了 FullGc 导致 STW,然后消费线程挂了,导致消息堆积,重启后内存释放重新进行消费。接下来的问题就转变为排查 FullGc 的原因了。

排查 FullGc 的基本流程首先肯定是 dump 一下内存的 heap ,然后分析一下内存泄露的代码块。通过 dump 下来的日志,发现在代码中使用 ThreadLocal,但是没有释放,从而导致频次的 FullGc。问题到这基本上也解决了,修改了相关的地方,重新上线,稳定运行。

至此没有堆积,没有报警,没有重启,爽歪歪!

车企及芯片

1.CAN报文?H264协议?

CAN是一种用于实时网络的串行通信协议,主要应用于汽车工业等实时通信领域。H.264是一种视频编码标准,广泛应用于视频压缩和网络传输。

CAN协议和H.264在实际应用中并无直接关联,但如果你需要在CAN网络上传输H.264编码的视频数据,你可能需要将H.264数据分割成多个CAN帧进行传输。

2.CAN报文是如何交互的?

CAN报文的交互过程主要涉及以下几个关键步骤和组成部分‌:

  1. 帧ID的组成‌:CAN报文的标识符(ID)由多个部分组成,包括优先级(P)、保留位(R)、数据页(DP)、报文代码(PF)、目标地址(PS和SA)等。这些代码合起来形成一个唯一的帧ID,用于在CAN总线上标识和路由特定的报文‌1。

  2. 数据段的组成‌:数据段由1~8个字节组成,每个字节分为高4位和低4位,用于表示通信协议中相应的含义。数据段的组成和结构根据具体的通信需求而定,可能涉及相邻字节的组合来表示特定的数据‌1。

  3. CAN报文的类型‌:CAN总线传输的数据称为报文,报文以帧的形式一帧一帧地传送。CAN报文有四种类型:数据帧、远程帧、错误帧和过载帧。每种类型的帧都有其特定的用途和结构‌1。

  4. 帧格式‌:CAN帧有两种不同的格式,即标准帧和扩展帧。标准帧具有11位识别符,而扩展帧具有29位识别符。这两种格式的区别主要在于识别符的长度不同,从而支持更多的节点和更复杂的网络拓扑‌12。

  5. 报文的发送与接收‌:报文的发送涉及将数据封装成符合CAN协议的帧,并通过CAN总线发送。接收端则通过过滤器识别并处理接收到的报文。正确的报文处理包括解析帧ID和数据段,以及执行相应的操作或响应‌2。

  6. 错误处理与重传机制‌:如果接收端无法正确接收报文,会通过发送错误帧来通知发送端重新发送。发送端在未收到应答时会尝试重新发送报文,以确保信息的可靠传输‌.

百度安全验证

3.WIFI芯片如何实现网络连接?

考察无线通信技术、加密技术、协议栈。

a.初始化:上电后进行配置(STA模式、AP模式/STA+AP),设置网络参数(SSID、密码....),配置安全协议等

b.扫描接入点(AP):

  • 主动扫描/被动扫描:
    • WIFI芯片主动发送探测请求帧,并等待AP响应;
    • 监听无线信道上的信标帧(Baecon帧)
  • 选择AP:根据(信号强度、安全性...)选择1/多个AP进行连接

c.建立连接:

  • 认证和加密:WPA/WPA2
  • 关联和认证

d.数据传输:

  • 数据传输协议
  • 数据包封装和解析

e.断开连接:

  • 主动断开
  • 被动断开

机器学习

1.你知道的激活函数有哪些,怎么看待sigmoid()?

  • 定义:Sigmoid函数是一种S型函数,数学表达式为

  • 特性
    • 能够将任意实值压缩到(0, 1)的范围内,常用于二分类问题的输出层。
    • 平滑且易于求导,但计算量相对较大。
    • 存在梯度消失问题,即当输入值非常大或非常小时,梯度接近0,导致网络训练困难。
    • 输出不是零中心的,这可能会影响梯度下降的效率。
  • 看法:Sigmoid函数在早期神经网络中广泛使用,但由于其梯度消失和计算复杂的问题,逐渐被其他激活函数所取代。然而,在某些特定场景下,如二分类问题的输出层,Sigmoid函数仍然是一个不错的选择。
  • ReLU(Rectified Linear Unit)函数
    • 定义:ReLU函数的数学表达式为 f(x)=max(0,x)。
    • 特性
      • 解决了梯度消失问题,当 x>0 时,梯度恒为1。
      • 计算简单,速度快。
      • 但在 x≤0 时,梯度为0,可能导致神经元死亡问题。
    • 看法:ReLU函数因其简单性和高效性在现代神经网络中广泛应用,尤其是在深层网络中。通过改进ReLU函数(如Leaky ReLU、PReLU等),可以进一步缓解神经元死亡问题。

2.transformer的结构和注意力机制?

Transformer结构

Transformer模型主要由编码器(Encoder)和解码器(Decoder)两部分组成,两者都采用了多层堆叠的结构。

编码器(Encoder)
  • 组成:编码器由多个相同的编码器层堆叠而成,每个编码器层通常包含两个子层:多头自注意力层(Multi-Head Attention)和逐位置的前馈神经网络(Position-wise Feed-Forward Network)。
  • 功能:编码器负责处理输入序列,通过自注意力机制捕捉序列中的上下文信息,并将这些信息编码成一系列向量表示。
  • 位置编码:由于Transformer模型没有循环或卷积结构,无法直接处理序列的顺序信息,因此引入了位置编码(Positional Encoding)来为每个位置的词嵌入添加位置信息。
解码器(Decoder)
  • 组成:解码器同样由多个相同的解码器层堆叠而成,每个解码器层包含三个子层:带掩码的多头自注意力层(Masked Multi-Head Attention)、编码器-解码器多头注意力层(Encoder-Decoder Multi-Head Attention)和逐位置的前馈神经网络。
  • 功能:解码器负责根据编码器的输出和已生成的输出序列来生成下一个输出。在解码过程中,带掩码的多头自注意力层确保模型只能关注到当前位置之前的输出,而编码器-解码器多头注意力层则允许模型关注到编码器的输出。

注意力机制

Transformer模型的核心是自注意力(Self-Attention)机制,它允许模型在处理序列的每个位置时,同时考虑序列中所有位置的信息。

多头注意力(Multi-Head Attention)
  • 作用:多头注意力机制通过将输入分割成多个“头”(Head),每个头独立地学习输入的不同方面,然后将这些头的信息合并,以增强模型的表达能力。
  • 计算过程
    1. 生成Q、K、V向量:对于输入序列中的每个单词,都会生成对应的查询(Query)、键(Key)和值(Value)向量。这些向量通常是通过将单词的嵌入向量输入到一个线性变换层得到的。
    2. 计算注意力分数:通过计算Query向量与所有单词的Key向量之间的点积,并经过缩放(除以根号d_k,其中d_k是Key向量的维度)和Softmax归一化,得到每个单词的注意力权重。
    3. 加权求和:使用这些注意力权重对Value向量进行加权求和,得到加权和向量。这个加权和向量包含了更丰富的上下文信息,并被用作当前单词的新表示。
自注意力(Self-Attention)
  • 特点:在自注意力层中,所有的键、值和查询都来自同一个地方,即编码器或解码器前一层的输出。这使得模型能够捕捉序列内部的长距离依赖关系。
掩码自注意力(Masked Self-Attention)
  • 作用:在解码器中,为了保持自回归属性(即生成下一个输出时只能依赖于之前的输出),引入了掩码自注意力机制。通过将softmax输入中对应非法连接的所有值掩盖掉(设为负无穷),防止解码器中的信息向左流动。

3.分类问题算法有哪些?

1. 逻辑回归(Logistic Regression)

  • 概述:逻辑回归是一种用于二分类问题的线性分类算法。它通过sigmoid函数将线性回归的输出映射到(0,1)区间,得到样本属于某一类别的概率。
  • 特点:模型简单,易于理解和实现,适用于二分类问题。

2. 支持向量机(Support Vector Machine, SVM)

  • 概述:SVM是一种强大的分类算法,可用于线性和非线性分类问题。它通过找到一个最大化类别间距的超平面来进行分类。
  • 特点:能够处理高维数据,对于非线性问题,通过核技巧进行转换处理。

3. 决策树(Decision Tree)

  • 概述:决策树是一种基于树形结构的分类算法。它通过递归地根据特征的取值划分数据,直到每个叶子节点都属于同一类别或达到某个停止条件。
  • 特点:易于理解和解释,能够处理连续和离散特征,但可能存在过拟合问题。

4. 随机森林(Random Forest)

  • 概述:随机森林是一种集成学习算法,由多个决策树组成。它通过随机选择特征和样本进行训练,以提高模型的泛化能力。
  • 特点:具有很好的泛化能力,能够处理高维数据和噪声,减少过拟合现象。

5. 朴素贝叶斯(Naive Bayes)

  • 概述:朴素贝叶斯是一种基于贝叶斯定理和特征独立性假设的概率分类器。它根据各个特征的先验概率和条件概率,计算样本属于每个类别的后验概率,并选择概率最大的类别作为预测结果。
  • 特点:计算简单,适用于高维数据,但独立性假设可能过于简化。

6. K最近邻(K-Nearest Neighbors, KNN)

  • 概述:KNN是一种基于实例的分类算法。它根据训练集中与新样本最相似的K个样本的类别来确定新样本的类别。
  • 特点:简单直观,但计算复杂度较高,且结果依赖于K值的选择。

7. 梯度提升决策树(Gradient Boosting Decision Trees, GBDT)

  • 概述:GBDT是一种集成学习算法,通过迭代地构建一系列弱学习器(通常是决策树),并使用梯度下降法优化损失函数,不断减少预测误差。
  • 特点:能够捕捉特征间的复杂关系,具有较强的预测能力。

4.logistic回归属于线性回归还是分类算法?

Logistic回归不属于线性回归,而是属于分类算法。尽管它们的名字中都包含“回归”,但它们在统计学和机器学习中的应用和目的截然不同。

  • 线性回归:线性回归是一种预测数值型数据的统计方法。它试图找到自变量(特征)和因变量(目标变量)之间的最佳线性关系,即找到一个线性方程来最小化实际观测值和预测值之间的差异。线性回归的输出是连续的数值。

  • Logistic回归:Logistic回归是一种分类算法,主要用于二分类问题。它通过sigmoid函数(也称为逻辑函数)将线性回归的输出映射到(0,1)区间,从而得到样本属于某个类别的概率。Logistic回归的输出是概率值,通常将这个概率值与一个阈值(如0.5)进行比较,以决定样本属于哪个类别。

5.介绍一下经常使用的库,pandas库了解哪些?

  • TensorFlow
    • TensorFlow是由Google Brain团队开发的开源深度学习框架,它提供了强大的计算图构建能力,支持多种设备上的高效执行。
    • TensorFlow广泛应用于图像识别、语音识别、自然语言处理等领域。
  • PyTorch
    • PyTorch是一个开源的机器学习库,专注于动态计算图,提供了灵活易用的API。
    • PyTorch支持GPU加速,并提供了丰富的神经网络层和数据加载工具,使得构建和训练深度学习模型变得简单快捷。

Pandas是一个基于Python的开源数据分析库,它提供了高性能、易于使用的数据结构和数据分析工具。Pandas专为处理表格和混合数据集设计,具有以下几个关键特点:

  1. 数据结构
    • Series:一维标记数组,可以容纳任何数据类型(整数、字符串、浮点数、Python对象等)。
    • DataFrame:二维标记数据结构,具有列和行的概念,可以看作是多个Series结构的组合。DataFrame是最常用的Pandas对象,可以容纳多种数据类型。
  2. 数据处理能力
    • Pandas提供了一系列功能强大的方法来清理、筛选和准备数据。
    • 支持数据转换,如从一种形状转换成另一种形状、生成衍生变量等。
    • 提供了丰富的功能来对数据集进行描述性统计、聚合和计算。
  3. 数据可视化
    • Pandas本身主要用于数据处理,但它也可以与其他库(如Matplotlib)结合使用,进行数据可视化。
  4. 时间序列分析
    • Pandas提供了专门的功能来处理时间序列数据,包括日期范围生成、频率转换、窗口统计等。
  5. 文件读写
    • Pandas支持多种文件格式的读写,如CSV、Excel、SQL、HDF5、Parquet等。

6.pytorch中的dataloader除了用来加载数据还可以用来干什么?

  1. 批量加载数据DataLoader允许用户以批量的方式加载数据,这是通过batch_size参数控制的。批量加载数据可以显著提高数据处理的效率,特别是在使用GPU进行训练时,因为GPU更擅长并行处理大量数据。

  2. 数据洗牌:通过设置shuffle参数为TrueDataLoader可以在每个epoch开始时自动对数据进行洗牌(打乱顺序)。这有助于模型学习到数据的不同组合,从而提高模型的泛化能力。

  3. 并行处理DataLoader支持通过num_workers参数设置用于数据加载的子进程数。当num_workers大于0时,数据加载将并行进行,这可以显著加快数据加载的速度,特别是在处理大型数据集时。然而,需要注意的是,过多的子进程可能会占用大量内存和CPU资源,因此需要根据实际情况进行调整。

  4. 自定义数据加载:虽然PyTorch提供了许多内置的数据集(如CIFAR-10、MNIST等),但DataLoader也支持用户自定义的数据集。用户只需继承torch.utils.data.Dataset类并实现__len____getitem__方法,即可创建自己的数据集对象,并将其传递给DataLoader进行加载。

  5. 数据预处理:在将数据传递给模型之前,经常需要对数据进行预处理(如归一化、裁剪、旋转等)。DataLoader允许用户通过transform参数指定数据预处理函数,这些函数将在数据加载时自动应用。

  6. 内存管理:通过设置pin_memory参数为TrueDataLoader可以将加载的数据复制到CUDA的固定内存中。这有助于减少数据从CPU到GPU的传输时间,从而提高训练速度。然而,需要注意的是,固定内存是有限的,因此需要根据GPU的可用内存进行调整。

  7. 灵活的数据加载策略DataLoader还提供了samplerbatch_sampler等参数,允许用户自定义数据加载的策略。例如,可以使用sampler来指定从数据集中提取样本的策略,或者使用batch_sampler来直接指定每个batch的索引。

7.准确率和召回率?

8.numpy中的array和torch中的tensor有什么区别?

1. 性能

  • NumPy: NumPy 是一个用于科学计算的库,其 array 主要在 CPU 上运行。NumPy 提供了大量的数学函数库,使得在 CPU 上进行大规模数值计算变得高效。
  • PyTorch Tensor: PyTorch 的 tensor 不仅可以在 CPU 上运行,还可以在 GPU 上运行,从而加速计算。Tensor 的设计初衷是为了支持深度学习模型的训练和推理,因此在 GPU 上的性能优化尤为突出。

2. 内存管理

  • NumPy Array: NumPy 的 array 在内存中是静态的,一旦创建,其大小和类型就固定了。如果需要改变数组的大小或类型,通常需要创建一个新的数组。
  • PyTorch Tensor: PyTorch 的 tensor 在内存中是动态的,支持动态改变大小(如通过 .resize_().view() 方法)。此外,PyTorch 的自动微分系统(Autograd)会自动管理 tensor 的梯度,这对于深度学习中的反向传播非常重要。

3. GPU 支持

  • NumPy Array: NumPy 的 array 默认在 CPU 上运行,虽然可以通过一些方法(如使用 cupy 库)将其扩展到 GPU,但这并不是 NumPy 的原生支持。
  • PyTorch Tensor: PyTorch 的 tensor 天然支持 GPU 加速。只需将 tensor 转移到 GPU 上(使用 .to(device) 方法),就可以在 GPU 上进行高速计算。这对于训练大型深度学习模型尤为重要。

4. 深度学习应用

  • NumPy Array: 虽然 NumPy 可以用于实现一些简单的机器学习算法,但它并不直接支持深度学习模型的构建和训练。
  • PyTorch Tensor: PyTorch 的 tensor 是深度学习模型构建和训练的基础。PyTorch 提供了丰富的神经网络层和损失函数,使得构建和训练深度学习模型变得简单快捷。此外,PyTorch 的自动微分系统可以自动计算 tensor 的梯度,极大地简化了反向传播的实现。

5. 兼容性

  • NumPy 和 PyTorch 之间有很好的兼容性。PyTorch 的 tensor 可以很容易地转换为 NumPy 的 array(使用 .numpy() 方法),反之亦然(使用 torch.from_numpy())。这使得在 NumPy 和 PyTorch 之间迁移数据变得简单。

9.如何看待前几年虽然已经有深度学习了,但是近年突然大火?

一、技术积累与突破

  1. 算法模型的优化:深度学习技术经过多年的发展,算法模型不断优化。如卷积神经网络(CNN)、循环神经网络(RNN)、残差网络(ResNet)等模型的出现,极大地提升了深度学习在图像处理、语音识别、自然语言处理等领域的性能。这些优化使得深度学习模型能够处理更复杂的问题,并取得更高的准确率。

  2. 计算能力的提升:硬件技术的发展,特别是GPU和TPU等计算硬件的快速发展,为深度学习提供了更强大的计算能力和更高的效率。这使得深度学习模型能够在更短的时间内完成训练,从而加速了深度学习技术的普及和应用。

二、数据量的增加

随着互联网和物联网的快速发展,数据量呈现指数级增长。这为深度学习提供了丰富的数据样本,使得深度学习模型能够从中学习到更多的特征和信息,进而提高了模型的准确性和泛化能力。丰富的数据资源是深度学习技术能够取得显著成果的重要保障。

三、产业应用的推广

  1. 应用场景的扩大:随着深度学习技术的不断成熟和应用场景的不断扩大,越来越多的企业开始将其应用于产品和服务中。如自动驾驶、智能语音助手、智能安防等领域都成为了深度学习技术的重要应用场景。这些应用场景的推广进一步推动了深度学习技术的发展和普及。

  2. 大模型的兴起:近年来,大语言模型如GPT系列等的兴起,进一步推动了深度学习技术的发展。这些大模型通过大规模的数据和计算资源训练得到,具有更强的表示能力和泛化能力。它们能够完成更复杂的任务,如文本生成、问答系统等,为深度学习技术带来了更多的应用场景和商业价值。

四、社会认知的提升

随着深度学习技术的不断发展和应用成果的显现,社会对于深度学习的认知度不断提升。越来越多的企业和个人开始关注深度学习技术,并投入资源进行研发和应用。这种社会认知度的提升为深度学习技术的普及和发展提供了良好的氛围和条件。

10.transformer中图像的时序性如何实现的?

1. 序列化处理图像

将图像序列(如视频帧)视为一系列的时序数据,每个图像帧被视为序列中的一个元素。通过这种方式,可以直接将Transformer应用于图像序列,其中编码器和解码器结构用于捕捉帧与帧之间的依赖关系。

2. 位置编码

由于Transformer模型本身不具备处理序列顺序的能力,因此需要引入位置编码(Positional Encoding)来告知模型序列中每个元素的位置信息。在图像处理中,这同样适用。对于图像序列,可以为每个图像帧分配一个唯一的位置编码,以便在模型中保持时序性。

3. 注意力机制

Transformer的核心是自注意力机制(Self-Attention Mechanism),它能够捕捉序列中元素之间的依赖关系,而不需要遵循固定的顺序。在图像处理中,自注意力机制可以用于捕捉图像区域之间的长期依赖关系,进而在图像序列中保持时序性。

4. 特定领域的Transformer变体

为了更好地处理图像数据,研究者们提出了多种Transformer的变体,如Vision Transformer(ViT)、Swin Transformer等。这些变体通过调整模型结构、引入卷积层或特定于图像的任务头等方式,使Transformer能够更有效地处理图像数据。对于图像序列,这些变体同样可以通过序列化图像帧、应用位置编码和自注意力机制等方式来保持时序性。

5. 结合其他模型

除了直接使用Transformer处理图像序列外,还可以将其与其他模型(如卷积神经网络CNN、长短时记忆网络LSTM等)结合使用。例如,可以先使用CNN提取图像特征,然后将这些特征序列输入到Transformer中进行时序建模。

11.nlp中的单词如何处理的,图像预测中怎么处理文本信息?

nlp代表计算机编程来学习大量文本数据的研究,包括标记化、停止词去除、词根提取、情感分析。

  1. 分词(Tokenization)
    • 将文本分割成单词或子词的序列。这是文本处理的第一步,有助于将长文本分解成更易于处理的单元。分词可以使用基于规则的方法(如按空格和标点符号分割)或机器学习模型(如基于统计或深度学习的方法)。
  2. 词性标注(Part-of-Speech Tagging)
    • 将单词标记为其相应的词性(如名词、动词、形容词等)。这有助于理解句子的结构和含义,是句法分析和语义理解的重要基础。
  3. 词形还原(Stemming/Lemmatization)
    • 将单词还原为其原始的词干或词形。例如,将“running”还原为“run”,或将“mice”还原为“mouse”。这有助于减少词汇的冗余,将相关的词归并为同一个词形。
  4. 去除停用词(Stop Word Removal)
    • 去除文本中常见的无实际含义的词语,如“a”、“the”、“is”等。这些词语通常不包含有用的信息,去除它们可以减少处理的复杂性。
  5. 词嵌入(Word Embedding)
    • 将单词转换为向量表示,以便模型能够理解单词之间的语义关系。词嵌入技术(如Word2Vec、GloVe等)能够捕捉单词和上下文之间的关系,为后续的文本分析提供基础。

在手语识别任务中,当有大量手语视频及其对应的文本标注时,深度学习模型处理这些文本信息的方式主要涉及到以下几个关键步骤:

1. 数据预处理

  • 文本清洗:首先,对文本标注进行清洗,去除噪声、无关字符、特殊符号等,确保文本数据的准确性和一致性。
  • 分词与标注:将文本分割成单词或短语,并进行词性标注、命名实体识别等处理,以便后续模型能够更好地理解文本的含义。
  • 文本向量化:将清洗后的文本转换为计算机可理解的数值形式,即文本向量化。这通常通过词嵌入技术(如Word2Vec、GloVe、BERT等)实现,将每个单词或短语映射到一个高维向量空间中。

2. 模型构建

  • 编码器-解码器结构:在手语识别任务中,深度学习模型常采用编码器-解码器结构。编码器负责处理手语视频,提取视频中的关键特征;解码器则负责将这些特征转换为对应的文本信息。
  • 注意力机制:为了更准确地从视频中提取与文本相关的信息,模型通常会引入注意力机制。注意力机制能够帮助模型在解码过程中动态地关注视频中的关键帧或区域,从而提高识别的准确性。
  • 序列到序列学习:由于手语视频和文本标注都是序列数据,因此模型需要采用序列到序列(Seq2Seq)的学习方式。这要求模型能够处理变长输入和输出,并在训练过程中学习到序列之间的映射关系。

3. 训练与优化

  • 损失函数:在训练过程中,模型通过最小化损失函数来优化参数。对于手语识别任务,常用的损失函数包括交叉熵损失、负对数似然损失等。
  • 优化算法:采用适当的优化算法(如梯度下降法、Adam优化器等)来更新模型的参数,使模型在训练数据上表现更好。
  • 正则化与超参数调整:为了防止过拟合,模型在训练过程中会采用正则化技术(如L1/L2正则化、Dropout等)。同时,还需要对模型的超参数(如学习率、批量大小、迭代次数等)进行调整,以获得最佳的性能。

4. 评估与测试

  • 评估指标:在测试阶段,使用适当的评估指标(如准确率、召回率、F1分数等)来评估模型的性能。这些指标能够反映模型在识别手语视频并转换为文本方面的能力。
  • 错误分析:对模型在测试集上的错误进行分析,找出模型存在的问题和不足之处,以便进行后续的改进和优化。

12.分类和回归算法常用的损失函数有哪些?

回归:

分类:

13.优化策略有哪些?

一些常见的优化策略:

1. 数据预处理

  • 数据清洗:去除异常值、缺失值,处理噪声数据,确保输入数据的质量。
  • 数据归一化/标准化:将数据缩放到同一尺度,有助于模型更快地收敛。
  • 数据增强:通过平移、旋转、缩放、裁剪、添加噪声等方式增加数据多样性,提高模型的泛化能力。

2. 模型选择

  • 选择合适的模型:根据任务类型(如分类、回归、聚类等)和数据特点选择合适的模型。
  • 集成学习:通过组合多个模型的预测结果来提高整体性能,如Bagging、Boosting、Stacking等。

3. 模型训练

  • 选择合适的优化算法:如梯度下降法(SGD)、Adam、RMSprop等,用于更新模型参数。
  • 学习率调整:采用学习率衰减策略,如指数衰减、余弦退火等,以在训练过程中动态调整学习率。
  • 早停(Early Stopping):在验证集性能不再提升时提前停止训练,防止过拟合。
  • 权重衰减(Weight Decay):在损失函数中加入正则化项,以惩罚模型参数的复杂度,防止过拟合。

4. 参数调优

  • 网格搜索(Grid Search):通过穷举法在所有候选参数组合中搜索最优参数。
  • 随机搜索(Random Search):在参数空间中随机选择参数组合进行搜索,相比网格搜索更灵活且计算成本更低。
  • 贝叶斯优化(Bayesian Optimization):利用贝叶斯定理在参数空间中寻找最优参数,通常比网格搜索和随机搜索更高效。

5. 特征工程

  • 特征选择:从原始特征中选择对模型性能影响最大的特征,减少特征维度,提高模型训练效率。
  • 特征提取:通过降维、主成分分析(PCA)、线性判别分析(LDA)等方法提取新的特征,以更好地表示数据。

6. 架构优化

  • 模型剪枝:移除模型中不重要的参数或层,以减少模型复杂度,提高推理速度。
  • 量化:将模型中的浮点数参数转换为整数或定点数,以减少模型大小和提高推理速度。
  • 知识蒸馏:通过让一个大模型(教师模型)指导一个小模型(学生模型)学习,以提升学生模型的性能。

7. 评估与反馈

  • 交叉验证:将数据集划分为多个子集,进行多次训练和验证,以评估模型的稳定性和泛化能力。
  • 性能监控:在训练过程中监控模型的性能指标,如准确率、召回率、F1分数等,以便及时调整训练策略。
  • 反馈循环:根据模型在测试集上的表现,对模型进行迭代优化,直到满足性能要求。

14.评估指标?

混淆矩阵:错误率、准确率、精确率、召回率。

15.降维和PCA主成分分析?

降维,可以减少时间和空间;用2D和3D可视化容易;空间复杂度降低;

可以减少给定数据集的特征数量,如:

a.特征选择

b.矩阵分解

c.manifold学习

d.autoencoder方法

e.线性判别分析(CDA)

f.主成分分析(PCA)

对数据进行旋转变换的统计学方法,其本质是在线性空间中进行一个基变换,使得变换后的数据投影在一组新的“坐标轴”上的方差最大化,随后,裁剪掉变换后方差很小的“坐标轴”,剩下的新“坐标轴”即被称为 主成分(Principal Component) ,它们可以在一个较低维度的子空间中尽可能地表示原有数据的性质。

总结

(1)主成分分析的计算步骤简单,主要是求解特征值和特征向量;

(2)主成分分析的各主成分之间正交,数据运算会变得容易;

(3)当主成分的维度小于原数据维度时,可以起到降维的作用;

(4)主成分维度可能不如原数据维度直观,解释性较差;

(5)主成分分析有一些演变的方法,如核主成分分析,解决非线性问题的主成分分析问题。

16.偏差和方差

选择偏差:由于样本选择和非随机性导致得到的结论存在偏差。

偏差:算法过于简化

方差:模型过于复杂,导致高灵敏度和过拟合。

任何监督机器学习算法都具有低偏差和低方差,才可以达到良好的预测性能。

17.有监督学习和无监督学习?

有监督学习:输入数据有标记,主要用于预测,例如分类和回归。

无监督学习:输入数据无标记,多用于分析,密度估计和降维等。

18.标准化和归一化是什么?

标准化:将所有数据变为具有均值为0,标准差为1的正态分布。

归一化:将所有数据值转换为(0,1)之间的技术。

19.随机森林和决策树的区别?随机森林比决策树稳定的原因?

随机森林与决策树的区别

  1. 模型类型
    • 决策树:是一种单一模型,通过树状结构进行决策,每个节点表示一个特征,每个叶子节点表示一个类别(或回归值)。
    • 随机森林:是基于决策树构建的一种集成学习方法,通过集成多个决策树来提高模型的性能。
  2. 构建过程
    • 决策树:在构建过程中,通常选择最优划分属性来递归地将数据集划分为若干个子集,直到满足停止条件(如子集中所有样本都属于同一类别,或达到预设的最大深度)。
    • 随机森林:在构建过程中,首先从原始数据集中随机抽取多个样本子集,并从所有特征中随机抽取特征子集来构建多棵决策树。这些决策树并行计算,互不影响。
  3. 性能与泛化能力
    • 决策树:容易过拟合训练数据,尤其是在深度较大的树中。同时,决策树对特征的选择敏感,不同的特征选择可能导致不同的树结构。
    • 随机森林:通过集成多个决策树,可以显著降低过拟合的风险。每个决策树都可能过拟合部分数据,但集成在一起可以减轻这个问题。此外,随机森林对部分特征的缺失不敏感,能够处理不平衡数据,并且具有良好的泛化能力。
  4. 可解释性
    • 决策树:具有易于理解和解释的优点,可视化效果好,可以直观地看到决策过程。
    • 随机森林:由于是多个决策树的组合,因此其可解释性相对较差。但随机森林能够评估特征的重要性,有助于理解哪些特征对模型性能的影响最大。

随机森林比决策树稳定的原因

  1. 集成学习的优势:随机森林通过集成多个决策树来提高模型的稳定性。每个决策树都可能存在偏差和方差,但集成在一起时可以相互抵消这些偏差和方差,从而提高整体模型的稳定性。

  2. 随机性:在构建随机森林的过程中,引入了样本和特征的随机性。这种随机性使得每棵决策树都是基于不同的数据子集和特征子集构建的,从而减少了单棵决策树对特定数据的依赖性,提高了模型的稳定性。

  3. 投票机制:对于分类问题,随机森林采用投票机制来确定最终预测结果。多个决策树的预测结果相互印证,减少了单个决策树可能产生的错误预测,进一步提高了模型的稳定性。

20.项目中使用的模型有哪些维度的特征?为什么会选择这些特征?

1.手部关键点特征

特征描述:手部关键点特征包括手指、手掌、手腕等关键部位的位置、形状和相对位置关系。

选择原因:手语主要通过手部的运动、形状和位置变化来表达意义,因此手部关键点特征是手语识别中最重要的特征之一。这些特征能够捕捉到手部的细微变化,为后续的识别提供丰富的信息。

2.上下文特征

特征描述:上下文特征是指与当前手语动作相关的前后文信息,如前后帧的手势、表情、语音等。

选择原因:手语表达往往具有连续性和上下文依赖性,因此上下文特征对于提高手语识别的准确性和流畅性具有重要作用。通过引入上下文特征,模型可以更好地理解手语的整体含义和表达意图。

3.深度特征

特征描述:深度特征是通过深度学习模型自动提取的高层次特征。

选择原因:随着深度学习技术的发展,深度特征在手语识别中得到了广泛应用。深度特征能够自动学习并提取出手语图像或视频中的高层次信息,如语义信息、情感信息等。这些信息对于提高手语识别的准确性和智能化水平具有重要意义。

21.P值和显著性水平的含义?p值>0.05可能的原因?什么是一二类错误?什么是统计功效?影响统计功效的因素?

P值和显著性水平的含义

  • P值:在统计学中,P值(probability value)是用于判断假设检验结果的一个重要指标。它表示在原假设(通常为研究者想要推翻的假设)为真的条件下,观察到当前数据或更极端数据出现的概率。P值越小,说明观察到的数据与原假设之间的差异越显著,从而越有理由拒绝原假设。
  • 显著性水平:显著性水平(alpha level)是事先确定的一个可接受的犯第一类错误的概率上限,也称为α值。在假设检验中,如果计算得到的P值小于显著性水平,则拒绝原假设,认为观察到的数据差异显著;如果P值大于或等于显著性水平,则不拒绝原假设,认为观察到的数据差异不显著。

p值>0.05可能的原因

当P值大于0.05时,意味着观察到的数据差异很可能是由于随机误差引起的,而不是由于我们所假设的因素引起的。换句话说,没有足够的证据支持备择假设(即研究者希望证实的假设),从而不能拒绝原假设。这并不意味着备择假设一定是错误的,只是说明在当前的数据样本下,我们无法得出备择假设成立的结论。

一二类错误的定义

  • 第一类错误(Type I Error):也称为弃真错误或α错误,是指在原假设实际上为真时,错误地拒绝了原假设。这通常发生在P值小于显著性水平时。
  • 第二类错误(Type II Error):也称为纳伪错误或β错误,是指在原假设实际上为假时,错误地接受了原假设。这通常发生在样本数据不足以揭示实际差异时,即统计功效不足。

统计功效的定义

统计功效(statistical power)是指在假设检验中,当原假设错误时,接受正确的替换假设的概率。它是衡量一个统计检验能够正确识别出实际差异的能力的指标。统计功效等于1减去第二类错误的概率(即1-β)。

影响统计功效的因素

统计功效受到多个因素的影响,主要包括:

  1. 两总体的实际差异:当两总体之间的实际差异越大,统计功效越高。因为更大的差异更容易被统计检验识别出来。
  2. 显著性水平的设定:显著性水平(α值)的设定会影响统计功效。一般来说,α值越大,第二类错误(β)越小,统计功效(1-β)越大。但需要注意的是,增大α值也会增加第一类错误的风险。
  3. 样本容量:样本容量是影响统计功效的关键因素之一。样本容量越大,统计检验的精度越高,统计功效也越大。
  4. 检验的方向:在同样的显著性水平下,单侧检验通常比双侧检验具有更高的统计功效。因为单侧检验只关注一个方向上的差异,而双侧检验需要同时考虑两个方向上的差异。

22.ROC曲线和AUC值的原理?为什么AUC可以评价一个模型的好坏?

ROC曲线

ROC曲线(Receiver Operating Characteristic Curve),又称接受者操作特征曲线或等感受性曲线,是一种用于表示分类模型性能的图形工具。ROC曲线通过描绘在不同阈值下,分类器的真阳性率(True Positive Rate, TPR)和假阳性率(False Positive Rate, FPR)之间的关系来评估模型性能。

  • 真阳性率(TPR):也被称为敏感性(Sensitivity)或召回率(Recall),是指分类器正确识别正例的能力,即所有阳性群体中被检测出来的比率(1-漏诊率)。TPR越接近1,表示模型识别正例的能力越强。
  • 假阳性率(FPR):是指在所有实际为负例的样本中,模型错误地预测为正例的样本比例,即所有阴性群体中被检测出来阳性的比率(误诊率)。FPR越接近0,表示模型在预测负例时的准确率越高,即较少将负例预测为正例。

AUC(Area Under the Curve)值是指ROC曲线下的面积,用于量化评估分类器的整体性能。AUC值的取值范围一般为0到1。

  • 当AUC值为1时,表示模型是完美的,即存在一个阈值能使得所有正例都被正确识别,且没有负例被误判为正例。然而,在实际应用中,完美模型几乎不存在。
  • 当AUC值大于0.5但小于1时,表示模型优于随机猜测,有一定的预测价值。AUC值越接近1,模型性能越好。
  • 当AUC值为0.5时,表示模型性能与随机猜测相同,没有预测价值。
  • 当AUC值小于0.5时,表示模型性能比随机猜测还差。但这种情况下,如果总是反预测而行(即将模型预测为正例的样本视为负例,预测为负例的样本视为正例),则可以获得比随机猜测更好的性能。

AUC值之所以能够评价一个模型的好坏,主要基于以下几个原因:

  1. 不依赖于特定阈值:ROC曲线和AUC值考虑了所有可能的阈值,因此AUC值是对模型整体性能的评估,而不是仅仅依赖于某一个特定的阈值。这使得AUC值更加全面和客观。
  2. 直观反映模型性能:AUC值越接近1,表示模型在区分正例和负例方面的能力越强。这直接反映了模型的分类性能。
  3. 易于比较不同模型:由于AUC值是一个数值指标,因此可以很方便地对不同模型的性能进行比较。在多个模型中选择性能最优的模型时,AUC值提供了一个直观的量化标准。
  4. 鲁棒性强:AUC值对样本中的噪声和异常值具有一定的鲁棒性。即使样本中存在一些错误标注或噪声数据,AUC值仍然能够相对准确地反映模型的性能。

23.项目的核心指标?如何衡量ROI?说说数据分析如何推动策略?

项目核心指标

1. WER误字率(识别准确率)

用于评价ASR性能的重要指标,用来评价预测文本与标准文本之间错误率,因此词错率最大的特点是越小越好。像英语、阿拉伯语等。语音转文本或语音识别任务中研究者常用WER衡量ASR效果好坏。

因为英文语句中句子的最小单位是单词,而中文语句中的最小单位是汉字,因此在中文语音转文本任务或中文语音识别任务中使用字错率(Character Error Rate, CER)来衡量中文ASR效果好坏。

两者计算方式相同,为行文统一,下文统一使用WER表示该性能。

假设有一个参考例句Ref和一段ASR系统转写语音后生成的预测文本Hyp。带入上面公式,S表示将Hyp转化为Ref时发生的替换数量,D表示将Hyp转化为Ref时发生的替换数量,I代表将Hypo转化为Ref时发生的插入数量,N代表Ref句子中总的字数或者英文单词数。C代表Hyp句子中识别正确的字数。即原参考句子总字数N = S+D+C。

2. 处理速度

处理速度是指手语识别系统从接收到手语输入到输出识别结果所需的时间。在实时应用场景中,如手语翻译设备或虚拟现实系统,处理速度至关重要。快速的处理速度能够确保用户的手语表达得到及时的响应,提升用户体验。为了实现快速处理,系统需要优化算法和计算资源,以减少识别过程中的延迟。

3. 鲁棒性

鲁棒性是指手语识别系统在面临各种挑战和变化时仍能保持稳定性能的能力。这些挑战可能包括光照变化、背景噪声、手势遮挡、手势变形以及用户个体差异性等。为了提高鲁棒性,系统需要采用有效的预处理和特征提取方法,以减少这些外部因素对识别结果的影响。同时,系统还需要具备自学习和自适应能力,能够根据用户的使用习惯和反馈不断优化识别性能。

4. 泛化能力

泛化能力是指手语识别系统在面对新的、未见过的手语词汇或句子时仍能进行有效识别的能力。这是衡量系统实用性和可扩展性的重要指标。为了提高泛化能力,系统需要基于大规模、多样化的手语数据集进行训练和验证,以确保其能够覆盖广泛的手语表达方式和场景。此外,系统还需要采用有效的模型迁移和增量学习方法,以支持对新词汇或句子的快速学习和识别。

ROI的计算公式

衡量ROI的步骤

  1. 确定投资范围
    • 明确投资的具体项目或活动,如广告投放、新产品开发、市场拓展等。
  2. 收集数据
    • 收集与投资相关的所有收入和成本数据。这些数据应准确、全面,并反映投资的实际效果。
  3. 计算ROI
    • 使用上述公式计算ROI,得出百分比值。这个值表示每单位投资成本所获得的回报。
  4. 分析ROI
    • 将计算出的ROI与预期目标或行业标准进行比较,评估投资的绩效和效率。
    • 分析ROI的变化趋势和影响因素,为未来的投资决策提供参考。

24.项目难点?项目中遇到的问题?

25.什么是假设检验?假设检验和AB Test的基本原理?假设检验的步骤?

假设检验的定义

假设检验,又称统计假设检验,是一种用来判断样本数据是否足以拒绝零假设(null hypothesis)的统计方法。其基本思想是首先提出一个关于总体参数的假设(即零假设),然后通过抽样得到的数据来检验这个假设是否成立。

基本原理

假设检验的基本原理

  • 假设检验基于概率论和数理统计的原理,通过构建假设和选择适当的统计量,对样本数据进行计算和分析,从而得出关于总体参数的结论。
  • 在假设检验中,通常有两个假设:零假设(H0)和备择假设(H1或Ha)。零假设通常是我们想要拒绝的假设,而备择假设则是我们想要证明的假设。
  • 通过计算样本数据的统计量,并与预设的显著性水平下的临界值进行比较,来判断是否拒绝零假设。如果拒绝零假设,则认为备择假设成立;否则,接受零假设。

AB Test的基本原理

  • AB测试(A/B testing),又称为对照实验或随机实验,是一种常用的实验设计方法,用于比较两个或多个样本(通常是A和B)之间的差异。
  • 在AB测试中,参与者被随机分配到不同的组,每个组展示不同的变量(如产品设计的不同版本)。一组是对照组,通常是现有产品或设计的标准版本(如A),而其他组是实验组,展示不同产品或设计的其他版本(如B)。
  • 通过在实验组和对照组之间比较特定指标(如点击率、转化率、用户满意度等),可以评估不同版本之间的差异,并确定哪个版本在给定条件下表现更好。
  • 假设检验在AB测试中用于评估观察到的差异是否是由于真实差异引起的,还是由于随机变异所引起的。这有助于科学、客观地评价实验结果。

注意1:测试目标要清晰。在实际工作中,有些产品经理/运营的口头禅就是:“AB一下看看”。可如果目标都没确定的话,连如何写假设,如何找检验统计量都无法确定,更没办法定怎么测试了。

特别注意的是,在一次测试中,是很难兼容两个目标的。比如上边的小例子,如果想提升用户客单价,则要推的是贵的商品,要给的激励是满减型激励,让用户买贵一点。

如果想提升用户消费率,则要推的是便宜的商品,要给的激励是秒杀/超低价,让用户先买一笔再说。这两个目标是很难在一个方案A/B里兼容的。

所以小伙伴们,千万别信了产品经理/运营“你先测测看看”的鬼话。如果一开始目标都很混乱,那方案肯定也是四不像,测出来结果乱七八糟,也是很正常的。事前不想清楚,事后只能瞎着急。

注意2:测试方案合理性。有些测试方案本身设计得就不合理,不是拿相似的方案测试,而是明显一个方案很优惠,一个很鸡肋;一个设计很美观,一个设计很丑陋。这种情况下测了也白测。测试方案本身,要是苹果对苹果,西瓜对西瓜才行。

注意3:测试对象相似性。还以上边小例子举例。参与测试的用户群体,可能自身在客单价/消费力上就有差异。这种测试特征的差异,会直接导致:结果上的差异是由于客群特征,而非方案A/B造成的。这是最差的情况了,这样不但会导致测试无效,而且会误导业务判断。

Abtest的局限性

正是由于有以上三点要求,导致ABtest是有门槛的:

要有能力设计相近版本方案要有足够开发支持,把方案落地要有足够的用户数据,区分用户特征

这些使得ABtest只有在数据充足、开发资源充足、业务方资源充足且没有私心的时候,才能完美落地。因此,虽然ABtest的原理很简单,但是具体应用,还需要结合实际情况做考虑。具体细节,后续再分享。

假设检验的步骤

  1. 建立零假设和备择假设
    • 零假设(H0):通常是研究者想要拒绝的假设,如两个样本的均值(率)相等。
    • 备择假设(H1):与零假设相对立的假设,通常是研究者想要接受的假设,如两个样本的均值(率)不相等。
  2. 确定显著性水平α
    • 显著性水平是假设检验中的一个重要参数,表示在原假设为真时错误地拒绝原假设的概率。通常设定为0.05或0.01。
  3. 选择假设检验的检验统计量
    • 根据研究目的和样本数据的性质,选择合适的统计量进行假设检验。常见的统计量包括Z统计量、t统计量、卡方统计量等。
  4. 根据确定的显著性水平α,查表求临界值
    • 根据显著性水平和统计量的分布表,查找对应的临界值。
  5. 计算检验统计值
    • 使用样本数据计算检验统计量的实际值。
  6. 比较检验统计值与临界值,确定是否拒绝原假设H0
    • 如果检验统计量的值大于临界值,则拒绝原假设;否则,接受原假设。

26.介绍boosting 算法原理?和bagging的区别?

Boosting算法是一种集成学习方法,旨在通过组合多个弱学习器(即准确率略高于随机猜测的模型)来构建一个强学习器(即准确率显著提升的模型)。其核心思想在于通过迭代的方式,逐步优化模型的预测能力。以下是Boosting算法的主要原理:

  1. 初始化:首先,给训练集中的每个样本分配相同的权重。

  2. 迭代训练

    • 在每一轮迭代中,使用当前权重的训练集来训练一个弱学习器。
    • 计算该弱学习器在训练集上的误差率,即被错误分类的样本的权重之和。
    • 根据误差率调整每个样本的权重:增加被错误分类的样本的权重,减少被正确分类的样本的权重。这样,在下一轮迭代中,弱学习器会更加关注那些在前一轮被错误分类的样本。
    • 计算该弱学习器的权重(通常与误差率成反比),用于后续的组合。
  3. 组合弱学习器:将所有弱学习器按照其权重进行线性组合,得到最终的强学习器。在预测时,每个弱学习器都会给出一个预测结果,并根据其权重进行加权投票,从而得到最终的预测结果。

AdaBoost(Adaptive Boosting)是Boosting算法的一种典型实现,它使用单层决策树(也称为决策树桩)作为弱学习器。AdaBoost通过不断调整样本权重和弱学习器权重,逐步构建一个强学习器,从而显著提高模型的预测能力。

Boosting算法通过迭代和权重调整的方式,逐步构建一个强学习器,旨在提高模型的预测准确性;而Bagging算法则通过并行训练多个弱学习器,并独立地进行预测,旨在提高模型的稳定性和泛化能力。两者在样本选择、弱学习器关系、目标以及常用算法等方面存在显著差异。

27.数据科学的定位?数据科学家需要具备什么能力?你觉得自己身上最符合的特质是什么?

数据科学是一门新兴的交叉学科,它融合了数学、统计学、计算机科学、数据工程与知识工程等多个领域的理论和技术。数据科学的核心任务是从数据中挖掘价值,发现数据中的规律和关联性,进而为决策提供支持。它不仅仅关注数据的收集、存储和处理,更强调数据的分析和解读,以及如何通过数据来解决问题和创造价值。

数据科学家需要具备的能力

数据科学家作为数据科学领域的专业人才,需要具备多方面的能力,以应对复杂的数据挑战和业务需求。以下是数据科学家通常需要具备的一些关键能力:

  1. 数学和统计学知识:数据科学家需要扎实的数学和统计学基础,能够运用数学模型和统计方法来分析和理解数据。
  2. 编程能力:熟练掌握一种或多种编程语言(如Python、R、Java、Scala等),能够编写代码来清洗、整理、分析和可视化数据。
  3. 数据库知识:了解数据库的基本概念和原理,能够使用SQL查询语言和NoSQL数据库来存储和检索数据。
  4. 机器学习知识:具备机器学习的基础知识,能够运用机器学习算法和模型来分析和预测数据,解决复杂的数据问题。
  5. 可视化能力:能够使用各种工具和技术将数据可视化,帮助其他人理解和洞察数据。
  6. 沟通能力:将数据科学的结果以清晰易懂的方式呈现给非专业人员,并能够与其他部门和团队协作,共同推动项目的进展。
  7. 创新思维和学习能力:数据科学领域发展迅速,数据科学家需要具备创新思维和持续学习的能力,以适应不断变化的技术和业务需求。

自己最符合的特质

  • 逻辑思维能力强:能够清晰地分析问题,通过逻辑推理和数据分析来得出结论。
  • 对新技术充满好奇:对数据科学领域的新技术、新工具保持关注,并愿意尝试和学习。
  • 善于团队合作:能够与不同背景的人有效沟通,共同完成任务。
  • 注重细节:在处理数据时能够关注到细节,确保数据的准确性和完整性。
  • 持续学习:对数据科学领域保持热情,愿意不断学习和提升自己的能力。

外企

准备英文简历和英语自我介绍

本文标签: 一遍知识点