无人机驾驶的技巧

二分之一原则

在云台角度为0°的前提下,如果电线杆在云台的屏幕的下半部分则可以通过

平面原理

如果可以看到物体的上表面,则可以通过,这个原理与云台仰角无关(由光的直线传播原理,假设云台摄像头所在的点是飞机的最低点,则只有云台高度大于障碍上表面高度,障碍物上表面上面发出或者反射的光才能传播到云台摄像头里面)

三分之一原则

如果树干、电线杆等障碍物在画面的右边三分之一之处,并且障碍物随着无人机的向前呈现向画面边缘方向消失的移动规律,则可以通过上述障碍物,否则得调整机头朝向

两秒原则

无人机前进时,当一个障碍物(如围墙、门框)消失后,最好数两秒,再向原障碍存在的方向移动

devops背诵手册

什么是

  • Dev:Develop(开发)
  • Ops:Operation(运维)
  • 有什么作用:打破开发、测试、运维、壁垒;自动化;降本增效

专题1:运维与Devops方法论

背景助理解

项目名称

御姐加油站

功能

  1. 用户的登录和注册:用户使用微信扫码关注公众号登录,并且通过微信或者支付宝充值39.9元可以升级为会员。
  2. 上传御姐资料:上传每个网红或者身边的美女的照片、个人经历、获得成就、专辑名或者参演的影视剧类节目名称。
  3. 发帖跟踪御姐的事件:会员用户能够将每位御姐的事件进行发帖,登录用户能够进行点赞评论、并能回复、点踩举报评论和帖子。
  4. 模拟和御姐聊天:通过后端接入大模型,根据帖子、资料持续学习御姐的个人事迹来模拟御姐的人设、并且可以和御姐语音通话,普通用户可以每天20句对话和10min的语音通话,会员每天对话数量无限,并且可以打3小时的语音通话
  5. 管理用户:管理员通过管理后台注册,可以审核举报内容,并且能够选择将相关用户封禁

体系架构

  • 后端:基于微服务的架构:公司有三台腾讯云的服务器(每个6CPU32G内存),使用docker swarm管理由Go语言、Java、Python写的几个微服务镜像,并使用API网关统一对外服务(有公网ip,但不考虑CDN加速),现在公司还没有讨论怎么划分微服务
  • 云数据库:使用腾讯云的MySQL、Mongo和Redis作为后端的数据库(假设容量足够)
  • 对象储存:使用腾讯云COS服务(假设容量足够)
  • AI服务:假设大语言模型对话服务、RAG服务、语音转文字、语音合成服务都由另外一家公司B提供,B公司也提供了工作流定制的服务,即调用B公司的上传API,就可以将文件传输到对应客户工作空间的知识库里面,这样便可以在调用B公司的大语言模型聊天服务的同时先进行知识检索,并结合提示词一起回答,语音通话则是用户在前端打开一个webrtc通道连接到B公司的服务器,上面的服务器先将用户传输过来的音频流转化为文字,然后送入前面提到的AI chat completion服务,如果大语言模型生成一个chunck,则将其送入语音合成服务,再将合成的音频片段顺着原来的webrtc的通道传输,调用语音通话API只需要通过HTTP接口指定后端大语言模型,并获得一个加签,前端通过携带加签,则可以和B公司的语音通话服务进行信令传输并打开RTC通道
  • 管理后台服务:部署在公司内网集群中,并且通过公司内部的oauth2.0决定操作权限,仅限公司内网访问
  • 监控服务:使用gafrana大屏进行监控,部署在公司内网集群中,但是通过路由可以外网访问
  • 持续集成:代码托管和流水线运行在腾讯云coding的平台上,而构建节点采用公司内网的虚拟机
  • 前端服务:前端用vuejs写,托管在github上,提交master分支的仓库则触发关联的cloudflare pages自动构建,并部署在cloudflare pages服务商

开发方式

  • 前端代码托管在github上,如果提交master分支,就触发其部署到cloudflare pages上面,如果提交dev分支,则只触发代码质量检查
  • 后端代码托管在腾讯云coding上,每个微服务分为一个仓库,提交仓库,则触发单元测试和集成测试,然后构建对应的docker镜像,如果是dev分支,则其会触发其后续部署在公司内网的模拟测试环境(使用内网数据库和minio作为对象存储服务),如果是master分支,则会先将其推送到公有云docker仓库上,并且通过ssh命令暂停正式发布服务器的对应微服务重新拉取并更新再重启服务。
  • 团队使用钉钉进行远程会议、消息交流,并且流水线触发、代码提交情况会被发送到对应的群里面

进一步计划

  • 响应国家「西数东算」政策的号召,公司在甘肃兰州建立了一个机房,其总共服务器能够提供512核心和10T内存以及100张4090的GPU算力、并且拥有三个独立的公网ipv4,公司于是想着把服务迁移到k8s上,并且对于AI运算和推理的服务,已经通过和B公司商量好,由B公司的私有云平台提供Webrtc传输、GPU算力调度、大模型推理的服务,到时候以一个机房局域网微服务API的形式给出(格式和B公司公有云服务一样)

摩尔定律和反摩尔定律

  • 价格不变、18-24个月、性能一翻
  • 卖掉相同、18月、营业额一半

历史沿革

  • 软件的架构几个阶段:单体架构、分层架构、SOA、微服务架构、Service Mesh架构
  • 2009:Patrick、类比敏捷开发、提出Devops、第一届Devops大会
  • 2013:《凤凰项目》(什么是「凤凰商城」、遇到了什么问题、如何解决、启示是什么?)
  • 2018:中国Devops社区
  • 2023:南京大学主导的Devops国标

3 Ways

System Thinking:熟悉流水线、提高流水线流量、为了目标实现工作流优化

  • 怎么做:构建、集成、交付;限制半成品(半成品商榷后再发布);看板

Amplify Feedback Loop:加强用户的反馈、从源头保证质量、避免问题再发生

  • 怎么做:适当停止生产线、构建自动化测试套件、Dev和Ops共享target和pain、远程监视

Culture Of Experimental and Learning:培育「试错文化」

  • 怎么做:20%非功能;鼓励强化改进;营造~的企业文化氛围

4种项目

  1. 业务项目:主要的、公司项目管理办公室管理
  2. 内部项目:改进的运维基础架构、运维项目内部改进项目、不集中跟踪管理、瓶近期投入不易估量
    1
    e.g. 为了能够更好的管理迁移到甘肃的服务,IT团队开发出了四种云原生运维套件:S***a集群管理工具、Sasablue算力调度和推理引擎、M******e消息队列、L***a服务发现,并像Kafka、Etcd一样开源成为下一代的云原生基础设施
  3. 变更:由1和2衍生出来的,问题跟踪管理、多套系统管理(一个问题影响到另外一个问题)
  4. 计划外:故障处理

精益生产和devops:传统精益和devops同原理

精益(精益求精)理论

  • 降低批量规模:对于「御姐加油站」每个功能的子功能划分多个版本逐步上线,便于发现问题
  • 减少半成品(对应Devops三种方法的第一种「控制半成品给数量」):语音聊天功能完善了再上线而不是一下子就上线
  • 缩短并增强反馈回路(对应Devops三方法的第二种):聊天的时候设置直接在生成内容下面设置「点踩按钮」

敏捷开发与devops:借鉴敏捷宣言

敏捷宣言

  • 个体和互动大于流程和工具:开发过程中面对面交流大于飞书钉钉看板
  • 工作的系统大于详尽的文档:演示功能使用大于写一大堆文档让你读
  • 程序员和用户的合作大于合同谈判:「加油站」会员价格和政策更多倾向于用户的感受而非用户合同
  • 响应变化大于遵循计划:响应「东数西算」政策,程序员不得不改变原来docker swarm的架构,迁移到甘肃机房的k8s上

Devops的工具(以e.coding.net为例)

  • 源代码管理:代码托管
  • 构建服务器:coding的持续集成可以选择使用构建集群或者自己接入节点
  • 基础设施、环境配置管理:coding支持接入裸机、k8s、serverless、cos等
  • 虚拟基础架构和容器:docker作为容器引擎,由腾讯云的服务器或者自接入节点提供虚拟化的基础架构
  • 测试自动化:使用ifbook可以实现api和自动化测试管理
  • 管道编排:可以定制自动化工作流

关键术语

CI/CD

  • 持续集成:开发者持续的将代码集中提交到一个中央仓库里面,并且每次提交都触发自动构建和测试,以早发现问题
  • 持续交付:快速的、少浪费的将代码部署到生产环境,便于用户和开发者建立更强的反馈(对应devops三方法第二点、精益理论第三点「缩短并加强反馈回路」)
  • 持续部署:快速的部署并将变化立即能够让用户看到(cf-pages在提交前端代码以后立刻可以部署到全球网络让使用者看到前端页面变化)

四大指标

部署频率、变更进入生产时间(t0部署-t0提交)、平均恢复时间(MTTR=AVG(t0恢复-t0-部署))、改变失败率

A/B 测试

变更后和变更前的测试

Scrum

三个角色(不要合并Owner和Scrum Master)

  • Product Owner:唯一有权要求做事、改变列表优先级;最大化产品和团队的价值
  • Scrum Master:确保Scrum被理解和实施、充当教练
  • Team:开发团队
  • Out Of the Team:把有兴趣关心,并无利益或价值牵扯的人(其他部门、高管、「御姐」群体),排除在项目决策团队以外!

用户故事

为什么

  • 完美文档的缺陷:低共识
  • Story和task

Story是用户需求,可以共享,每个人的Task为了完成Story中提出的需求,Task是具体开发任务,不共享,每个人完成各自的(用户能够和御姐聊天是Story,而将知识库接入LLM以更好的模仿御姐的个性属于Task)

用户故事的模板

1
2
3
作为xx用户
我想xxx
以达到xxxx的价值

e.g.作为管理员,我想查看被举报的内容及其创作者,并能够决定是否封禁其账号,来维护这个网络社区的氛围

3C原则

Card(占位符)、Conversation(为了达成共识、实时交谈)、Communication(接受标准:我们知道他何时完工)

产品Backlog:Scrum的核心

用户故事重要性列表排序

Scrum的工作流程以及要素

  1. Scrum会议
  • 目标:以终为始
  1. 估算
  • 单位:Story Point;SML(T恤尺码)
  • 差异原因:对于需求的理解、对于技术的熟练度
  1. 白板

要素:Not Checked Out、Checked Out、SprintGoal、Unplanned Items、Next
4. 燃尽图

  • 需要完成、还剩多少、现在速率是否能达到
  1. 每日站会
  • 移动看板的任务、更新燃尽图
  1. Sprint演示
  • Sprint结束于演示
  1. Sprint回顾会议

看板开发核心要点

  1. 可视化工作流程,Kanban方法:提高信息辐射的作用,容易发现团队工作的状态和问题、降低沟通交流成本
  2. 限制在制品(WIP上限,超上线阻塞):减少在制品使其快速流过整个工作流,使前置时间缩短(对应3方法中的第一点「提高流水线流量和流通效率」、与Devops指标中降低「变更进入生产时间」类似)

专题2:云原生时代的基于微服务的新型DevOps

背景助记

为了响应「乡村振兴」的号召,asynchronous公司与腾讯、字节、大疆联合推出了一款「无人机云乡村」服务。

客户和需求

  1. 乡村企业或者政府委会等:订购服务然后asynchronous公司能够将一个具有8*4090、512G RAM、256Core算力的中控AI服务器(边缘盒子)以及配套的无线电控制递送到乡村,并且由无线电装置由边缘盒子操控无人机进行作业,中控AI服务器在安装asynchronous的服务以后,就连接到asynchronous的云服务,借此可以从服务市场中拉取以docker-compose为组织的一组微服务应用如无人机农业、无人机云游等服务,连接上asynchronous的服务的边缘盒子也可以将无人机画面进行抖音或者微信视频号直播,也可以通过asynchronous的服务(底层为腾讯云的实时音视频、物联网)开启网页端异地操控,也可以将无人机的画面和控制权转移到线下体验店,让用户通过VR操控无人机,无人机将自身多模态数据由无线电传输到边缘盒子,边缘盒子进行处理调度无人机的任务,当然无人机内嵌基础小模型来操控其基础的避障、移动功能
  2. 客户可以通过微信视频号和抖音观看无人机直播,客户也可以在线下体验店操控无人机进行无人机云游。
  3. 服务开发者:asynchronous公司为服务市场开发者提供开发平台,实现持续集成、持续构建,使用腾讯云部署的NVIDIA Issac Sim模拟测试,然后进行发布

故事场景

山西省有一个山村处于深山之中,当地村委会为了更好的保障村民的安全,则决定引进系统派遣无人机定期巡查村庄,通过多模态数据来检测村庄基础设施的安全隐患并适当记录村民及外来人员的行动行为,村庄管理者可以通过web和安卓或者ios app实时查看无人机的画面,并看到大模型发现的隐患问题描述

一家位于北京的初创公司收到了上述村庄的需求,并与「无人机乡村云」平台的应用市场沟通,成为签约开发者,为山西的村庄开发一个「无人机应用」,其在开发的过程中,完全使用了asynchronous公司为服务市场开发者提供的集成代码托管、持续集成、制品仓库、持续测试、持续交付等为一体的开发者平台

云雾计算 XaaS

  1. 云雾计算
  • 云计算(腾讯云和字节的服务):数据能力强、高延时、用户隐私难以保护、高能耗
  • 边缘计算(无人机的本地模型):与云计算相反
  • 雾计算(边缘盒子):解决边缘计算数据抽象、命名规则、异构问题
  1. XaaS
  • PaaS和SaaS的区别:PaaS数据和应用层由企业自己管理,反之由平台托管

e.g.视频号直播为SaaS;而腾讯音视频直播sdk属于PaaS

IT服务五标准

  • CMMI-SVC:五个等级
  • ITIL:信息技术标准库
  • ISO20000:国际标准、PDCA
  • ITSS:一套完整的

运维的转型

  • 互联网时代:快速迭代、发布、灰度发布、安全
  • 云计算时代:系统本身、基于云计算的应用、自动扩缩容
  • 大规模:标准化、智能化、智能化
  • 「提前运维」:将运维提前至产品开发阶段

运维的挑战

多层次、海量数据、异构系统、动态变化、服务数量庞大、调用复杂

什么是云原生

基于Devops、微服务、方法论

容器化

实现原理

  • 使用linux的namespace机制进行隔离
  • 使用cgroup来限制计算资源
  • 运行进程都是实打实的linux进程
  • 打包了运行所需要的一切依赖库和资源

与虚拟机的不同(相同部分省略)

  • 启动时间:容器是秒级、虚拟机是分钟级
  • 虚拟化规模不同:容器可以和宿主机共享所有资源,而虚拟机则需要宿主机模拟出一套完整的硬件操作系统
  • 占用资源量不同:容器是轻量级,一个宿主机可以运行上千容器,但是最多只能运行几十个虚拟机

Docker

  1. 引擎:Docker引擎是一个客户端服务器架构
  2. 储存:Dockerfile所构建的镜像层都是只读的,但是在运行的过程中,添加了一个读写层,则可以写入镜像(对于镜像本身没有影响)
  3. 网络:
  • bridge模式:内部ip地址,网桥联通
  • Host模式:使用主机网络
  • Container模式:一个容器有自己的网络空间,另外一个容器使用这一个容器的网络(使用网络密集型)
  1. 驱动:
    直接使用DeviceMap(思考:开发无人机应用,如果镜像要直接访问无线电设备的串口,怎么使用?答案:DeviceMap)
  2. RUN、CMD、ENTRYPOINT的区别
  • RUN:构建镜像的时候,安装环境所需要的命令
  • CMD:指定启动的时候的参数和命令,可以被docker run命令行参数来覆盖,多一个CMD,则被最后一个覆盖
  • ENTRYPOINT:指定启动的时候运行的命令,不容易被CMD修改
    1
    2
    (这题我也错了)假设a.sh运行输出A,b.sh在没有参数'arg'的时候输出B,arg为1的时候输出C,否则输出D
    根据下面的情况来判断程序的输出,如果报错则指出错误原因
    a.ENTRYPOINT不能被覆盖,CMD将作为参数传给ENTRYPOINT
    1
    2
    ENTRYPOINT["a.sh"]
    CMD["b.sh","--arg","1"]
    1
    docker run image:tag
    1
    C
    (相当于运行a.sh b.sh --arg 1)

b.多CMD覆盖,运行最后一个

1
2
CMD ["a.sh"]
CMD ["b.sh"]
1
docker run -it image b.sh --arg 1
1
C

(相当于运行b.sh --arg 1)

c.炼狱难度

1
2
ENTRYPOINT ["b.sh"]
CMD ["a.sh","--arg","1"]
1
docker run -it image b.sh --arg 2
1
D

(b.sh b.sh --arg 2)

编排和调度

docker-compose和swarm

基于compose文件和gossip

k8s

  • etcd用来干什么:储存状态数据
  • kubelete:完成容器管理
  • Pod是什么:最小调度单位,只有一个ip,包括储存和网络的紧密的容器
  • 避免Pod被调度到特定节点上:taints、tolerations
  • ingress的作用:让外部能够访问集群
  • service有哪四种类型:ClusterIp、LoadBalancer、ExternalName(指向集群外部的域名)、NodePort
  • kube-proxy的作用:负载均衡器,用于service的实现

微服务

软件架构的演化

  • 单体架构:单体、统一部署、高耦合、统一数据库(好更新、易于部署)
  • 分层:软件抽象和分层、初步MVC架构、统一数据库
  • SOA:依赖消息总线、通信开销大、重量级服务、统一数据库
  • 微服务:解耦和、去中心化(独立开发)

特点

  • 服务组件化:智能无人机治安可以分为多个服务组件:比如无人机操控、画面AI推理、权限管理、日志记录等组件

这样的话,不仅可以独立开发和维护每个微服务部分,公共组件也可以其他微服务调用,其实「Service Mesh」概念就是从这里面来的,就是形成一个网格而不是简单的依赖树形关系

  • 围绕业务组织能力:传统更关注技术(Spring比netty进步的地方)
  • 高內聚低耦合(高内聚:模块或类内部的元素紧密相关,且专注于完成单一功能或任务;低耦合:模块之间的依赖小、独立性强)
  • 去中心化:数据管理、数据储存、服务治理
  • 基础设施自动化
  • 服务设计和演进(高可用设计和演进设计)

使用原因

  • 高可伸缩
  • 每个服务相对较小好维护
  • 技术栈不受限
  • 服务可以独立拓展
  • 大型复杂程序可以持续部署交付
  • 什么适合:规模大、复杂度高、需要长期演进

微服务拆分问题

1
2
3
4
5
6
7
8
【补充问题背景】
边缘盒子里面裸机运行了一个asynchronous-worker进程,通过这个东西可以接受无人机返回的图像、给无人机发送指令,也可以直接与云端的asynchronous服务通信
边缘盒子操控无人机通过「动作序列」实现,动作序列即在无人机上运行的一系列顺序动作的循环,使用状态机的方式进行执行,提供切入状态的回调、循环执行的任务、切出状态的回调,比如跟踪某个目标、按照某个航线运行等,动作序列的计算在无人机自带的机载电脑上面计算运行
而边缘盒子可以通过无线电将「动作序列」注册到无人机上,docker应用程序通过挂载特定的socket来调用worker查询无人机状态、调用云端asynchronous的服务、通过无线电让无人机执行特定的动作序列
边缘盒子对于无人机的操控采用两个模式:
一个是事件响应模式,如果无人机发生一些状态的变化(检测到一定特征的物体、上一个动作序列执行完毕)或者系统自身状态发生变化,则触发事件,这个过程是通过在docker中的应用程序,通过device-map挂载裸机的async-api-socket来实现
另外一个是轮询模式,docker容器挂载图传虚拟设备来拉取无人机的媒体流,再进行逐帧或者抽帧处理
不考虑第二种模式,假设这个安保程序在无人机机载电脑上的小模型发现了危险的特征,通过事件触发的机制通知到对应的docker容器内,其中基于事件响应的无人机应用程序,启动的时候会开启两个线程,一个线程非阻塞的处理REST或者RPC请求,另外一个线程非阻塞的处理无人机的事件
  1. 关键:
  • 粒度:过粗无法独立运维扩展;过细增加通信开销
  • 职责:职责分配不当则增加开销
  1. 原则
  • 单一职责(低耦合)
  • 服务依赖:核心、非核心(不要依赖核心)
  • 服务自治:独立团队开发维护
  1. 拆分策略
  • 基于业务功能
  • 基于数据模型
  • 基于非功能因素(IO密集型)
  • 基于DDD
  1. 根据问题背景的微服务拆分
  • 无人机管理:获得无人机的活动数量、位置等(核心、IO密集)
  • 任务调度:控制无人机进行完成特定动作序列(核心、IO密集)
  • 事件处理:处理无人机发来的事件 (核心、IO密集)
  • 数据处理:将音视频、点云图等多模态数据放入多模态大模型进行处理(核心、IO密集)
  • 用户界面:村委会、技术人员管理系统
  • 监控日志:记录和保存安全隐患事件和系统事件
  • 认证授权:村委会、运维人员认证
  1. 开发(以事件处理微服务为例)
  • 开发模块:模块能够通过得到订阅的事件,然后通知数据处理拉取对应媒体流,得到处理结果以后,按照编写的事件处理程序,给出下一动作序列,通知任务调度微服务让无人机进入下一个动作序列
  • API文档管理:显然这个模块要设计一个tcp-socket API,接受无人机传来的事件
  • 对外暴露API:暴露上一个的事件API的格式,便于设计无人机如何传入事件进行调用
  • 整合管理端:接入无人机管理的服务,方便进行全局无人机考虑

机器学习期末复习

无监督学习之「聚类算法」

聚类的一般步骤

  1. 算法
    1
    2
    3
    4
    5
    1. 选取初始点
    2. 更新聚类中心
    3. 计算样本点到聚类中心的距离
    4. 进行分类
    5. 重复2-5直到分类
  2. 数据结构
    1
    2
    3
    POINTS:SET<POINT>//所有点的集合
    CENTERS:SET<POINT>//聚类中心
    CLUSTER:MAP<POINT,SET<POINT>>//分类情况
    满足以下关系
    1
    2
    CLUSTER.KEYS()=CENTERS
    CLUSTER.VALUES().JOIN()=POINTS-CENTERS
  3. 可以使用并行或者GPU加速的步骤:计算最远、最近、最大、最小的距离

K-means算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# STEP 0: 随机从数据集中选出 K 个点作为初始中心
CENTERS = RANDOM_INITIALIZE(POINTS, K)

REPEAT:
# STEP 1: 分配(Assignment)
CLUSTER = NEW MAP<CenterID, List<Point>>()

FOR point IN POINTS:
nearest_center = FIND_NEAREST_CENTER(point, CENTERS) # 距离最小的中心
CLUSTER[nearest_center].PUSH(point)

# STEP 2: 更新(Update)
NEW_CENTERS = {}
FOR c IN CENTERS:
NEW_CENTERS[c] = AVERAGE(CLUSTER[c]) # 针对每个簇求均值得到新中心

# STEP 3: 判断是否收敛
IF NEW_CENTERS == CENTERS:
BREAK
ELSE:
CENTERS = NEW_CENTERS
UNTIL convergence

特点

  1. 已知类别数(K)
  2. 试探K和选取分类中心
  3. 孤立较远效果极佳

K-MEANS++ 算法

1
2
3
4
5
6
7
8
9
CENTERS.PUSH(POINTS.RANDOM() AS CENTER0)
DO
FOR POINT IN POINTS-CENTERS:
DX,CENTER = CENTERS.MAP(CENTER=>D(CENTER,POINT)).MIN.FIND()
CLUSTER[CENTER].PUSH(POINT)
DX_SET[POINT] = DX
NEXT_CENTER = DX_SET.RANDOM_SELECT(POINT,DX=>RANDOM(0,1)<=DX^2/SUM(DX_SET.KEYS().MAP(DX=>Dx^2)))//距离越长,更有可能被随机选择为下一个聚类中心
CENTERS.PUSH(NEXT_CENTER)
WHILE CENTERS.LEN<7

为什么?初始聚类中心应该分的越开越好

ISODATA算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CENTERS = POINTS.RANDOM(K0)
WHILE NOT REACH MAXIMUM_ITERATION:
POINTS.CLASSIFY_BY_MIN_DISTANCE(CENTERS)
K = K0
FOR CENTER,ELEMENTS IN CLUSTER.WHERE(POINTS_SET.LEN()<Nmin):
CLUSTER[CENTERS.FIND_NEAREST(CENTER)].JOIN(ELEMENTS)
CLUSTER.REMOVE_KEY(CENTER)
K--;
POINTS.ADJUST_CENTER(METHOD=MEAN)
IF K < K0 / 2:
GOTO SEPARATE
IF K > 2 * K0:
GOTO JOINING
DEFINE SUBPROCESS SEPARATE:
D[][] = CENTERS.GET_DISTANCES()
WHILE D.EXISTS(ELEMENT<D_MIN).FIND AS FIRST,SECOND:
CLUSTER[(FIRST.AVG()*LEN(FIRST)+SECOND.AVG()*LEN(SECOND)) / ( LEN(FIRST) + LEN(SECOND) )] = JOIN(FIRST,SECOND)
CLUSTER.REMOVE_KEY(FIRST)
CLUSTER.REMOVE_KEY(SECOND)
D[][] = CENTERS.GET_DISTANCES()
DEFINE SUBPROCESS SEPARATE:
FOR CENTER,POINTS IN CLUSTER:
VARIANCE_STORE[CENTER] = POINTS.GET_VARIANCE_IN_EACH_DIM()
//如果某个类别的𝜎𝑚𝑎𝑥 > 𝑆𝑖𝑔𝑚𝑎并且该类别所包含的样本数量𝑛𝑖 ≥ 2𝑛𝑚𝑖𝑛,则可以进行分裂操作,如果不满足上述条件则退出分裂操作;

与KMEANS算法的比较

  1. 相同点:
  • 都使用均值确定分类中心
  1. 不同点
  • 加入一些试探的步骤(结合人机交互)
  1. 缺点:需要很多人为参数,比较复杂所以并未投入使用

聚类的评价的指标

  • 对环状评价较差:戴维森堡丁指数/分类适确性指标、邓恩指数
  • 只能簇内:CP
  • 只能簇间:SP

贝叶斯判别器

核心思想

现实世界中P(c|x)很难获得

生成式模型和判别式模型

  • 判别式模型:P(c|x)建模
  • 判别式模型:P(c|x) = P(c,x) / P(x),先对P(x,c)建模(比如大语言模型先对于下一token在上一token输入情况下出现概率建模,然后再对token本身概率建模(由概率分布来word2vec),最终由上一token预测下一token)

极大似然估计

  1. 核心思想:先假设某种概率分布形式,再训练样例对参数的估计
  2. 缺点:估计结果的准确性严重依赖于所假设的概率分布形式是否符合潜在的真实分布
  3. 为什么使用对数似然:连乘会造成下溢

朴素贝叶斯分类器

  1. 原因:所有属性上的联合概率难以从有限训练样本估计获得

半朴素贝叶斯分类器

  1. 原因:现实世界很难获得朴素贝叶斯分类器那种完全不依赖其他属性的属性。
  2. 策略
  • SPODE:找到「超父」,(有点像虚基类)
  • TAN:「互信息」构建完全图,依赖关系为权重,再用最大带权生成树,保留强相关依赖性

贝叶斯网

  1. 高阶依赖的坏处:训练样本指数级增加、
  2. 组成:0有向无环

//TODO

高斯混合模型

实质

两个高斯分布的加权

模型

Z -> X

  • 如何计算?

获得所有数据、计算各个参数

最大似然估计

似然函数的定义

L(thita|X) = p(X|thita)

thita是参数,传入X,获得似然值(thita为特定值时输出概率与X的关系)

X 固定,求thita(argmax)

EM算法

  1. E:使用X和估计的thita估计更好的Z
  2. M:利用X和当前估计的Z,估计更好的thita
  3. 重复1和2值直到收敛

和K-means的关系

  1. 样本可以看作X
  2. 标签簇看作隐藏变量Z
  3. 簇中心、聚类均值看作参数thita
  4. 准则看作thita的似然函数

大语言模型中的EM思想

  1. 输入句子向量空间可以看作X
  2. 得到的输出的向量空间可以看作隐藏变量Z
  3. 神经网络权重可以看作参数thita
  4. 对于每一种特定的神经网络权重结构,输出向量空间和输入向量空间对应关系可以视作似然函数

(重要)提炼出一般机器(深度学习模型)的思想

  • 输入为一堆离散的数据
  • 通过训练一个函数的参数,使得输入序列能够预测到对应输出标签的概率最大
  • 根据每一部的预测结果,调整参数,并重复上一步,直至结果稳定或者用户主动停止

支持向量机SVM

什么是支持向量、支持向量机

  • 支持向量:与分界超平面具有最小距离的点称为支持向量

核函数

就是形如f(wx+b)的函数

多分类问题

  1. 转化为二分类问题,每两个类构造一个分类器,然后由分类结果给每个样本「投票」,最终票数最多属于那一类
  2. 多类支持向量机

神经网络

基础概念不再介绍,因为大家多少听过一点

从感知机到隐藏层

感知机是最简单的人工前馈神经网络

一种二元线性分类器,使用特征向量作为输入,把矩阵上的输入实数值向量)映射到输出值上(一个二元的值)

感知机学习

  • 期望输出和实际输出相同,不改变权值
  • 实际输出为-1,期望输出为+1,则增加2*学习率*xi;
  • 实际输出为+1,期望输出为-1,则减少2*学习率*xi;
    1
    2
    3
    4
    FOR INPUT,EXPECTED IN DATASET:
    IF NN(INPUT)!=EXPECTED:
    FOR I IN 0..INPUT.DIM:
    NN.WEIGHT[I] += 2*LEARNING_RATE*SIGN(EXPECTED)

缺点

  • 训练的样本必须是线性可分的

多层感知机

  1. 为什么需要隐藏层?
    隐藏层通过一系列非线性变换,能够从输入数据中提取出更加复杂和抽象的特征。多层前馈网络有强大的表示能力
  2. 工作流程:
  • 向前:传播数据,逐层输入并计算输出
  • 向后:分阶段逐层调整权值
  1. 隐藏层的数量:没有定论,需要试探

重头戏:反向传播法则

逐层求导,变化如何反向传播

1
d(wi) = LEARNING_RATE*(d(E)/d(ACTIVATE))*(d(ACTIVATE)/d(wix))*wi

标准BP和累计BP:单个和整个再更新

缓解过拟合

  1. 早停:验证错误率高,训练误差低,且连续a轮变化小于b
  2. 正则化:增加网络复杂度作为评价函数

深度学习部分

张量

n阶张量代表n维数组

深度学习区别于普通机器学习的特征:学习层次特征

  • 优点:学习良好的非线性特征

CNN

  • 卷积层:进行线性变换,减少参数
  • 池化层:作为缓冲部分接受卷积层的结果,其shape和原数据经过卷积层运算以后的矩阵shape一致
  • FC层:特征抽取
  • Softmax层:执行分类
  • dropout:随机省略几个神经元,保证了每个神经元都有较强的正则化的约束
  • Batch-Normalization:减少内部方差偏移或避免梯度扩散

C++考点背诵

  1. 符号优先级(结合)
  • 1元
  • 指针、访问
  • 乘除模
  • 加减
  • 移动运算符
  • 关系运算符
  • &&
  • ||
  • 三目运算符
  • 赋值运算符
  • 逗号运算符
  1. 类型转换
  • 隐式转换:精度丢失、溢出
  • static_cast:直接类型转换、更强的类型检查、基本类型
  • const_cast:只去除指针,修改常量产生未定义行为
  • dynamic_cast:类结构指针转换失败抛出nullptr,引用失败会产生std::badcast

补充:const问题,变量初始对象是否为const决定是否能修改。
3. union和struct

  • union:共享内存
  • struct == public class、对齐

结构体对齐算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def alignment(struct, default, cpu_digits):
# 确定对齐方式
if default is not None:
align = default
else:
align = max_member_size(struct) if max_member_size(struct) > cpu_digits else cpu_digits
offset = 0
for member in struct:
# 计算当前成员的对齐偏移
member_size = size_of(member)
member_alignment = min(align, member_size)
# 计算填充
if offset % member_alignment != 0:
padding = member_alignment - (offset % member_alignment)
offset += padding
# 放置成员
place(offset, member)
offset += member_size
# 计算结构体的总大小,考虑最终对齐
if offset % align != 0:
offset += align - (offset % align)
return offset
  1. 函数返回值
  • tuple:多个返回值
  • std::optional<T>:可以返回nullopt或者一个T实例
  • variant:类型安全的union
  • any:类型安全的void*
  1. 数组指针综合
  • 按照括号从里向外分析,如果一层括号呈现’(* xxxx)‘的形式,那么就将这个括号右半部分和左括号处于同一括号内层的所有部分移动到其对应的’(*‘部分
  • 重复以上过程直至每个括号里面只有’*‘,然后从左向右按照这样的范式依次合并:’Type(*)[n]‘代表Type的指针(的n维数组),将所有’Type(*)[n]‘替换为一个新的Type,其值为’Type的指针的n维数组’,直到不出现指针为止
  1. 指针与空间分配
  • new delete:如果在new使用[],则在delete也要使用[]
  • unique_ptr(不能转染所有权,只能用std::move来移动):生命周期调用析构函数
  • shared_ptr(能够转让所有权):最后一个持有对象的shared_ptr被销毁或者被赋值为另外一个指针的时候对象会销毁(.get()读取原来的指针,使用use_count()来查看当前对象的引用计数)
  • weak_ptr(没有计数器,是「丐版」shared_ptr):只能通过weak_ptr或者shared_ptr进行构造,通过.lock().get()来访问(lock返回一个shared_ptr对象)
  1. 函数一般的执行过程
  • 将参数或者参数地址压栈
  • 将返回地址压栈,保持调用者的现场(ebp、esp)
  • 跳转到函数入口地址
  • 设置新函数的ebp
  • 分配局部变量空间
  • 执行函数体
  • 释放局部变量空间
  • 加载调用者的ebp,跳转并弹出返回地址
  • 重新设置调用者的esp
  • 返回调用者,继续执行
  1. 内联函数
    编译器可以选择展开或者不展开(较复杂或者出现递归)
  2. 多文件组织
  • extern:外部的函数和变量(编译器看不到外部文件的变量,执行在链接阶段)
  • static: 可以作用于函数和变量,限制作用域于当前文件全局(参考java中的static)
  1. lambda表达式的捕获
  • [=]以值的方式捕获所有外部变量
  • [&]以引用的方式捕获外部的所有变量
  • [this]捕获当前类对象的this指针
  • [a,&b]捕获a的value和b的引用
  1. const和mutable
  • 函数修饰为const的函数不能修饰非mutable的变量
  • 对象被设置为const,那么其所有成员变量则不可以修改
  1. 移动构造和拷贝构造函数
  • &:左值引用:拷贝构造函数
  • &&:右值引用:移动构造函数
  1. 虚函数
  • 「虚函数」属性可以向下传递
  • 静、内、构不可能是
  • 派生类申请资源析构必须实例化
  • 虚函数完成构造才会绑定
  • override声明重写,final防止进一步重载
  • 虚函数有默认实现
  • 纯虚函数后面加上=0意思为delete
  1. 初始化顺序
  • 调用父类初始化函数
  • 调用子类初始化函数
  1. 多态的三种方式
  • 函数重载
  • 模板
  • 虚函数
  • 操作符重载
  1. 操作符重载
  • 自增运算符后缀使用哑运算符,并且返回值
  • 赋值运算符要判断是否自我赋值
  • 一般格式 <Return_Type> operator <OP> (<FunctionFParams>){<Expressions>}
  • 括号重载运算符
  • 成员重载运算符(类包装器)
  1. Resource Acquisition Is Initialization(RAII)
  • 构造函数请求资源,建立所有类不变式,但是在无法完成的时候抛出异常
  • 析构函数释放资源但是绝不抛出异常
  • 自身拥有自动储存期或者临时生存期
  • 有与自动或者临时对象的生存期绑定的生存期
  1. 异常处理
  • 调用链
  • 先子类后父类
  • 没有finally怎么办?异常处理后一定会调用对象的析构函数(对应RAII的第二点,所以析构函数要求禁止抛出任何异常)

人机交互期末背诵手册(背诵版)

  1. 最重要:十条启发规则

  2. 很细节:中英互译

  • 人机交互(HCI):
  • 用户(活动)为中心的设计:UCD:->ACD:(为什么?)
  • 普适计算:
  • 用户图形界面(GUI):
  • GMOS:(__模型)
  • DECIDE:D()、E()、C()、I()、D()、E()
  • ID(Fitts定律):IndexofDifficulty困难指数
  • WIMP:
  • 启发式评估:
  • 卡片分类:
  • 用户角色:
  • 击键模型:
  • 层次任务分析:
  1. 很好用:可用性原则

  2. 很基础:格式塔心理学

  3. 上面理论的基础:人类感知机模型

  • 3处理器:
  • 3记忆:()、短期记忆(__+ ___ 内容->一组 ___+___个界面元素)、()
  1. ECC和扩展ECC模型

-

  • 扩展:
  1. 很高频:评估范型

  2. 很综合:用户实验设计

  • 参与者选择:(原因:)
  • 分组设计:(__参与者)、(__参与者)、__设计
  • 变量设计:__设计(__自变量)、__设计(__自变量,乘法原理)
  1. 很细致:用户观察
  • 真实和受控环境观察:真实__参与受控__参与
  • 最有价值单个可用性工程方法:____
  1. 很巧妙:简化设计的策略
  • __(___的):最明显的简化设计的方案
  • __(___的):最快捷的简化设计方案(不可见的网格)
  • __(___的):低成本的方案
  • __(让用户干擅长的事情):移动和桌面平台
  1. 很沉重:人机交互的历史
  • 批处理阶段:_____,,
  • 联机终端时代:_____,,
  • 图形用户界面:_____,,
  • 1963:________
  • 1964:________
  • 1973:________
  • 1984:________
  • 1987:________
  1. 很普遍:用户类型
  • 新手用户:________
  • 中间用户:________
  • 专家用户:________
  1. 很膈应:评估和执行隔阂
  • 执行隔阂:_____与_____不符
  • 评估隔阂:_____和_____有差距
  1. 很生动:人物角色+场景剧本的一般步骤

人机交互期末背诵手册

  1. 最重要:十条启发规则
  • 用户能够得知系统的状态:docker ps
  • 用户能够对系统有自主权:CPP面相对象与面相底层硬件兼备
  • 一致性和标准化:json格式、AmazonS3标准对象储存的域名
  • 能够与现实世界吻合:Docker对于容器、镜像命名与其本义的联系、好处
  • 能够避免错误:Docker prune的时候提示是否完全清除
  • 依赖识别而非记忆:IDE代码补全、有限项下拉选项框的作用、城市地址的选择
  • 美观而足够小:微信相对于QQ界面的一大优势
  • 能够帮助用户迅速发现、诊断并修复错误:网络连接错误提醒用户检查代理服务器设置
  • 使用灵活性和高效性:老人小孩
  • 帮助手册:略
  1. 很细节:中英互译
  • 人机交互(HCI):Human Computer Interaction
  • 用户(活动)为中心的设计:UCD:User Centered Design->ACD:Activity Centered Designed(为什么?充分利用用户的技能和判断力而不是纯粹「听用户的」)
  • 普适计算:Pervasive Compute
  • 用户图形界面(GUI):Graphical User Interface
  • GMOS:Goal、Operation、Method、Selection(击键模型)
  • DECIDE:Determine(研究问题)、Explore(具体问题)、Choose(评估方案)、Identify(实际问题)、Determine(道德伦理问题)、Evaluate(收集到的数据)
  • ID(Fitts定律):IndexofDifficulty困难指数
  • WIMP:Window、Icon、Menu、Pointer
  • 启发式评估:heuristic evaluation
  • 卡片分类:Card Sorting
  • 用户角色:User Role
  • 击键模型:Keystroke-Level Model
  • 层次任务分析:Hierarchical Task Analysis
  1. 很好用:可用性原则
  • 易记性
  • 易学性
  • 效用性(横向)
  • 高效率(纵向)
  • 安全性(漏)
  • 用户体验目标
  • 超越「可用性」(电子商城让用户多逛一会儿)
  1. 很基础:格式塔心理学
  • 相似性
  • 连续性:共线、对齐、同向
  • 相近性:元素分组
  • 对称性
  • 完整性和闭合性原则:界面「犹抱琵琶半遮面」
  • 前景和背景
  1. 上面理论的基础:人类感知机模型
  • 3处理器:感知处理器、认知处理器、动作处理器
  • 3记忆:感觉记忆(输入设备寄存器)、短期记忆(内存、7+2内容->一组7+2个界面元素)、长期记忆(磁盘和其他持久化形式)
  1. ECC和扩展ECC模型
  • 形成目标、形成意图、明确动作、执行动作、感知系统状态、解释系统状态、评估输出并重复以上步骤
  • 扩展:(系统)内核语言、输入语言、输出语言、(用户)任务语言
  1. 很高频:评估范型
  • 快速评估:快速、随时随地
  • 可用性测试:定量
  • 实地研究:自然环境、对评估对象影响较小
  • 预测性评估:主观、Fitts定律
  1. 很综合:用户实验设计
  • 参与者选择:4-5至少,5-12够了(原因:人数越多,发现可用性问题和用户体验问题更多,人越多成本越高效率可能会降低)
  • 分组设计:组内设计(相同参与者)、组间设计(不同参与者)、裂区设计
  • 变量设计:基础设计(单自变量)、析因设计(多自变量,乘法原理)
  1. 很细致:用户观察
  • 真实和受控环境观察:真实可以参与受控不能参与
  • 最有价值单个可用性工程方法:边说边做
  1. 很巧妙:简化设计的策略
  • 删除(不需要的):最明显的简化设计的方案
  • 组织(要提供的):最快捷的简化设计方案(不可见的网格)
  • 隐藏(不重要的):低成本的方案
  • 转移(让用户干擅长的事情):移动和桌面平台
  1. 很沉重:人机交互的历史
  • 批处理阶段:单用户、单任务、使用机器语言编程
  • 联机终端时代:一维界面,可修改性差,易出错
  • 图形用户界面:直接操纵,信息过载、操作复杂
  • 1963:第一个交互绘图系统
  • 1964:鼠标问世
  • 1973:首个图形界面
  • 1984:麦金塔电脑
  • 1987:MS Windows
  1. 很普遍:用户类型
  • 新手用户:敏感、有挫败感
  • 中间用户:需要工具知道使用参考资料、高级功能
  • 专家用户:欣赏更新强大的功能,不受复杂度影响,反应更快速
  1. 很膈应:评估和执行隔阂
  • 执行隔阂:用户目标与系统允许不符
  • 评估隔阂:系统状态和用户假想有差距
  1. 很生动:人物角色+场景剧本的一般步骤
  • 创建问题和前景综述
  • 头脑风暴
  • 确定人物角色的期望
  • 构建情景场景剧本
  • 确立需求
  • 迭代直到需求稳定

并发问题

线程的三种状态

运行(Running)状态:

定义:线程正在CPU上执行其指令。

特点:处于此状态的线程正在占用处理器资源,执行任务。

就绪(Ready)状态:

定义:线程已经准备好运行,等待操作系统的调度分配CPU资源。

特点:线程已具备执行条件,但由于CPU被其他线程占用,暂时未获得执行权。

阻塞(Blocked)状态:

定义:线程因等待某些条件(如I/O操作完成、锁的释放等)而无法继续执行,暂时无法进入就绪状态。

特点:线程在此状态下不会被调度执行,直到等待的条件满足。

基础问题

1
2
3
4
5
6
def producer():
accquire_lock(mutex_lock);
cv.wait(()=>condition)//不满足则被设置为阻塞态,直到notify以后,再次检查条件变量
produce()
cv.notify_one(consumer);
release(mutex_lock);
1
2
3
4
5
6
def consumer():
accquire_lock(mutex_lock);
cv.wait(()=>condition)//不满足则被设置为阻塞态
produce()
cv.notify_one(producer);
release(mutex_lock);

Semaphore(信号量)

直接上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "Semaphore.h"

Semaphore::Semaphore(int count) : count(count) {}//Semaphore有一个初始信号量

void Semaphore::P() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [this] { return count > 0; });
--count;
}

void Semaphore::V() {
std::unique_lock<std::mutex> lock(mtx);
++count;
cv.notify_one();
}

托福口语task1高分表达整理

书读百遍还是读万卷书

Some people like to read certain books more than once. Others prefer to always read something they have never read before. Which do you usually prefer? Explain why, using details and examples.

  • every new book has its own wisdom
  • take on the challenges in life much better
  • It’s like taking a break from the reality so I can forget about all the troubles

忙还是闲

Some people prefer to keep a busy schedule and participate in a number of activities.Others prefer to have a lot of free time.Which do you prefer and why?

  • enhance my multitasking skills and problem-solving abilities
  • gain valuable knowledge and insights that enrich my life

是否在社交媒体上打广告

Do you agree or disagree with the following statement? Nowadays, fora business to be successful, it must be actively involved in social media

  • providing businesses with the opportunity to reach a large and diverse audience
  • allows for direct interaction with customers
  • providing small businesses with an affordable way to reach potential customers

公司是否应该向社区或者社会捐款

Some people believe that businesses should be required to spend a certain amount of their profits on social programs that benefit the public and the communities where they operates. Others believe that businesses should be able to decide for themselves how spend their profits, which contribute you agree with. Use details and examples to explain your opinion.

  • companies that embrace welfare of the local community can attract more customers
  • money channeled towards social causes near and dear to them
  • pay a premium for goods
  • better customer loyalty

是否开启Gap Year

  • gain valuable life experiences and develop essential soft skills
  • enables graduates to gain practical work experience and establish themselves in their chosen field more quickly

是否让员工做工作以外的事情(社交、散步通气)

  • take some air in between the work tasks
  • in turn help them solve their problems

人们是否应该只玩自己擅长的爱好

Do you agree or disagree with the following statement? People should only engage in activities or hobbies at which they are good or talented.

  • Exploration and learning new things can be enriching experiences, even if someone is not initially skilled
  • derive joy and satisfaction from the process of improvement and growth in areas where they may not be naturally talented
  • foster a mindset of continuous learning and development

老医生好还是年轻医生好

(老医生好)

  • professional diagnosis and suggestions
  • give prescriptions to patients

孩子是否应该从小听新闻

  • let children expose to some terrible facts
  • contact the news without objectivity
  • wrongly pick up the bad behaviors, which will not only be harmful to themselves but also hurt others

孩子是否应该在远方的亲戚朋友那里住

  • learn to adapt spontaneously or be disciplined by someone who would not spoil them
  • develop a desire to help others
  • lead a healthier relationship between children and parents

跨年文案(Beta)

随着「勾指起誓」的一声响起,气球升上天空,2023年逝去,2024年拉开帷幕。

2024年,下过多少场雪,喝过多少奶茶,流过多少泪,向多少人表达过真挚的感受?

从灯火通明的夫子庙,到从下雪到雨雾蒙蒙的紫金山,到熙熙攘攘的南京南站,到欢声笑语的KTV、轰趴所,到喂饱我们的小饭店、羊肉串,生活,到云边的小卖部、书中的青岛城、多彩的牛津和成都,是日常的点点滴滴的美好。

谢谢大家陪我成长,一句没关系,一句谢谢学长,一句你最好了,一句很幸运有你这样的朋友,让我有了自信心。

包包、王冰冰、房东的猫、陶喆、方大同、黄仁勋、王力宏、马斯克、懂王、将军、娜艺娜、Sasablue、十二……你们或抽象、或甜美、或伟大,让我的生活充满多彩。

很多人认为明星立人设很不好,但是这个社会组成就是人,这,就是一个人文社会,一切娱乐、科技,离不开人的力量,女人、男人、学生、干部、程序员、明星、黑人、白人、黄人,都在为着人类的前进推动。

人类与其他蜂巢思维的动物最大的区别,就是,每个人有自己独立的思维和想法,所以,我们为何要为他人而活,真正的成功是活出我们自己的样子,自己喜欢的样子。

新年的钟声敲响了,2025年,祝愿大家都做最美丽的自己!所念皆星河,所想皆成真!