英语 - 单词

词性

  • 名词(n.)
    • 人相关
      • -er / -or,做事的人或拥有特定职业的人
        • actor
      • -ist,拥护某种主义的人或从事某一领域的人
        • journalist
      • -ian,某方面的人或精通某领域的人
        • historian
    • -tion / -sion,表示动作或状态
      • action
      • version
    • -ment,行为或状态
      • development
    • -ness,性质或状态
      • Happiness
    • -ity / -ty / -cy,标识性质或状态
      • ability
      • beauty
    • -ship,关系或身份
      • friendship
    • -hood,状态或身份
      • childhood
    • -ure,表示行为结果
      • failure
      • pressure
    • -ance / ence
      • appearance
      • difference
    • -ee,受动者或参与者
      • employee
    • -acy / -ency,性质或状态
      • accuracy
    • -ology,研究或学科
      • biology
    • -ary,集合或事物相关
      • dictionary
      • array
    • -th,由形容词转为名词
      • strength
    • -age,标识性质或状态
      • storage
      • marriage
    • -ry,标识场所或集合名词
      • machinery
  • 形容词(adj.)
    • -able, -ible: 表示“可以…的”,“有…能力的”或“值得…的”
      • capable, edible, visible
    • -al, -ial: 表示“具有…属性的”或“关于…的”。
      • natural, personal, revolutionary
    • -ful: 表示“充满…的”。
      • beautiful, helpful, wonderful
    • -less: 表示“没有…的”。
      • careless, homeless, timeless
    • -ous: 表示“有…倾向的”或“充满…的”。
      • dangerous, curious, glorious
    • -ic, -ical: 表示“…的”,通常与科学或艺术相关。
      • historic, historical, economic
    • -ive: 表示“具有…属性的”或“倾向于…的”。
      • active, negative, sensitive
    • -ly: 有时用于形容词,表示“有…品质的”。
      • friendly, deadly
    • -y, -ish: 表示“像…的”或“有一点…的”。
      • tasty, foolish, bluish
    • -like: 表示“像…一样”。
      • childlike, manlike
    • -some: 表示“有…特质的”或“引起…的”。
      • troublesome, handsome
    • -ary, -ory: 表示“属于…的”或“与…有关的”。
      • honorary, imaginary
  • 及物动词(vt.)
    • -ize-ise ,后缀可以加在名词或形容词后面,形成动词,通常表示“使成为…”,“按照…方式处理”,“照…样子做”
      • normal → normalize(使正常化)
      • equal → equalize(使平等,使相等)
    • -ify,加在名词或形容词后面,形成动词,通常表示“使…化”,“使成为…”
      • beautify(美化)
      • purify(净化)
  • 不及物动词(vi.)
  • 副词(adv.)
    • -ly,加在形容词后面行成副词
      • quick -> quickly(快地),happy -> happily(快乐地)
    • -wise ,表示方向或方式。
      • Examples: clockwise -> clockwise(顺时针方向),money -> moneywise(在金钱方面)
    • -wards/-ward,表示方向或趋势
      • sun -> sunwards/sunward(向太阳),north -> northwards/northward(向北)
    • -erly,表示方向或来源
      • east -> easterly(向东的,来自东边的)
    • -ways,表示方式或方向
      • back -> backways(向后地),side -> sideways(侧面地)
  • 介词(prep.)
  • 连词(conj.)
  • 数词(num.)
  • 代词(pron.)
  • 感叹词(int.)

名词(Noun, n.)

表示人、事物、地点或概念。比如 dog、table。

动词(Verb, v.)

表示动作、状态或事件。比如 run、eat。

形容词(adjective, adj.)

描述或修饰名词、代词。比如 blue、tall。

副词(Adverb, adv.)

修饰动词、形容词或其他副词。比如 quickly、here、well。

代词(Pronoun, pron.)

用来代替名词,避免重复。比如 he、she。

介词(Preposition, prep.)

表示名词或代词与句子其他部分的关系。比如,in、on、with。

连词(Conjunction, conj.)

用于连接词、句子或短语。比如 but、or、and。

冠词(Article, art.)

限定名词,分为定冠词和不定冠词。the(不定冠词),a/an(定冠词)。

情态动词(Modal Verb, mod.)

表示能力、许可、可能性或义务。比如 may、can、must。

助动词(Auxiliary Verb, aux.)

用于构成复合时态或被动语态。比如 be、do、have。

感叹词(Interjection, int.)

表示强烈的情感或反应。比如 oh、wow。

数词(numeral, num.)

表示数量或顺序。比如 one、first。

对比

及物动词和不及物动词

需要在后面接宾语的动词叫及物动词,反之叫不及物动词

1
The bird flies. 

fly 是不及物动词。

1
I eat an apple. 

eat 为及物动词。

Conda

安装

linux

1
2
3
4
mkdir -p ~/.miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/.miniconda3/miniconda.sh
bash ~/.miniconda3/miniconda.sh -b -u -p ~/.miniconda3
rm -rf ~/.miniconda3/miniconda.sh

配置 Shell

1
2
3
4
# for bash
~/.miniconda3/bin/conda init bash
# for zsh
~/.miniconda3/bin/conda init zsh

环境

列出环境

1
$ conda info --envs

创建环境

1
$ conda create -n ml

指定 channel

1
$ conda create -n ml --channel=conda-forge

克隆环境

1
$ conda create --name new_name --clone old_name

启用环境

1
$ conda activate {env-name}

环境重命名

1
conda rename -n old_name new_name 

使用 yml 文件更新环境

1
$ conda env update --file env.yml --prune

删除环境

1
$ conda remove --name {env-name} --all

默认不启用 conda base 环境

1
$ conda config --set auto_activate_base false  # 关闭默认使用 base

打印环境信息

1
$ conda info

Channel

为环境添加 channel

1
$ conda config --append channels conda-forge 

添加 channel

1
$ conda config 

打印 channel

1
$ conda config --show channels

包管理

conda 的包管理有 channel 的概念,如果不指定则为默认的 defaults。如果我们想要安装其他 channel 的包,示例如下。

1
$ conda install anaconda::gcc_linux-64

查询可用包

1
$ conda search {package}

或在 这里 搜索,页面有安装命令,比如。

1
2
3
$ conda install anaconda::gcc_linux-64
# 另外一个包
$ conda install conda-forge::gcc_linux-64

已安装包

1
$ conda list

移除包

1
$ conda uninstall {package}

安装包

1
2
3
4
5
6
7
8
# 默认包
$ conda install {package}

# 指定channel
$ conda install {channel}::{package}

# 指定版本
$ conda install {package}={version}

Trouble Shotting

GLIBCXX_3.4.30 not found

1
ImportError: /home/wii/.miniconda3/envs/ml/bin/../lib/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /home/wii/.miniconda3/envs/ml/lib/python3.12/site-packages/paddle/base/libpaddle.so)

可以通过如下命令,查看当前 gcc 支持的 GLIBCXX 版本。

1
$ strings /path/to/libstdc++.so.6 | grep GLIBCXX

这个报错通常是运行的程序依赖的 gcc 版本和已经安装的 gcc 版本不匹配,要么太高,要么太低。安装兼容版本的 gcc 即可。

libstdcxx-ng 11.2.0.* is not installable

1
libstdcxx-ng 11.2.0.*  is not installable because it conflicts with any installable versions previously reported

这个报错是在 conda 环境,安装 gcc 13.3.0 时报的错。原因是已经安装 libstdcxx-ng 11.2.0.* ,和要安装的 gcc 13.3.0 出现依赖冲突。可以先卸载。

1
$ conda uninstall libstdcxx-ng # 当然,大概率会失败

可以重新创建环境,并添加 channel conda-forge。

1
$ conda create --name {env-name} --channel=conda-forge conda-forge::gcc=13.2.0

推荐

1
$ conda create --name ml --channel=conda-forge conda-forge::gcc=13.2.0 conda-forge::python=3.12.4 conda-forge::jupyterlab

机器学习 - 特征工程

特征分类

  • 按数据类型分类

    • 数值特征

      • 离散数值特征,有限的离散值,比如年龄
      • 连续数值类型,任意实数,比如体重
    • 分类特征

      • 有序分类特征,类别之间存在顺序,比如初中、高中、大学
      • 无序分类特征,类别之间没有顺序,比如血型
  • 按生成方式分类

    • 原始特征,直接从数据集中获取的未经处理的特征
    • 衍生特征,通过对原始特征进行数学运算、转换或组合而生成的新特征
  • 按特征稳定性分类

    • 稳定特征,在不同时间或数据集中变化较小的特征,如人的性别
    • 不稳定特征,容易随时间或数据分布变化而变化的特征,比如股票价格

Kaggle - command line tool

安装

详见文档Github 仓库

1
$ pip install kaggle

User Profile 页面 Create New Token,并将下载的文件放到 ~/.kaggle/kaggle.json

使用

列出进行中的比赛

1
$ kaggle competitions list

列出比赛的文件

1
$ kaggle competitions files {competition}

下载数据

1
2
3
$ kaggle competitions download -f {filename} -c {competition} # 下载指定文件
$ kaggle competitions download -c {competition} # 下载所有文件到当前工作路径
$ kaggle competitions download -p /path/to/save -c {competition} # 指定下载路径

ar

打包多个静态库

1
2
3
4
# liba.a, libb.a
$ mkdir objects_a && cd objects_a && ar -x ../liba.a && cd ..
$ mkdir objects_b && cd objects_b && ar -x ../libb.a && cd ..
$ ar crs libc.a objects_a/*.o objects_b/*.o

机器学习 - 入门

概述

机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。其专门研究计算机怎样模拟或实现人类的学习行为,已获得新的知识或技能,重新组织已有的知识机构使之不断改善自身的性能。

流程

根据《Data Science Solutions》,完整的解答工作流程包含七个阶段:

  • 问题或课题定义
  • 获取训练及测试样例集
  • 整理、预处理、清洗数据
  • 分析、识别模式、探索数据
  • 建模、预测、解决问题
  • 可视化、汇报、呈现问题解决步骤和最终解决方案
  • 提交结果

上述工作流指出了通用的步骤顺序。但是,有时候会有些例外。

  • 需要将多个步骤组合在一起
  • 需要通过可视化进行分析
  • 将一些步骤提前
  • 某些步骤重复多次
  • 跳过某些步骤

目标

数据科学解决方案流程通常有七个主要目标:

  • 分类(Classifying)
  • 关联(Correlating)
  • 转换(Converting)
  • 补全(Completing)
  • 修正(Correcting)
  • 新建(Creating)
  • 可视化(Charting)

问题分类

  • 监督学习(Supervised Learning),数据带有明确的标签或目标值
    • 分类问题(Classification)
      • 目标,将数据点划分到不同的类别中
      • 示例,垃圾邮件判定、良性/恶性肿瘤判定
    • 回归问题(Regression)
      • 目标,预测一个连续的值
      • 示例,房价、股票价格
  • 无监督学习(Unsupervised Learning),数据没有明确的标签
    • 聚类
    • 降维
  • 强化学习(Reinforcement Learning),智能体通过与环境进行交互并根据奖励信号来学习最佳策略
  • 半监督学习(Semi-supervised Learning),使用少量有标签数据和大量无标签数据进行学习
  • 主动学习(Active Learning),通过选择最有价值的数据进行标注来提高学习效率
  • 迁移学习(Transfer Learning),利用已有的知识和模型来解决新的但相关的问题

监督学习

回归问题

模型

线性回归(Linear Regression)

最基本的回归模型,它假设自变量和因变量之间存在线性关系。

参考

机器学习 - 环境

Conda

安装

linux

1
2
3
4
mkdir -p ~/.miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/.miniconda3/miniconda.sh
bash ~/.miniconda3/miniconda.sh -b -u -p ~/.miniconda3
rm -rf ~/.miniconda3/miniconda.sh

配置 Shell

1
2
3
4
# for bash
~/.miniconda3/bin/conda init bash
# for zsh
~/.miniconda3/bin/conda init zsh

环境

列出环境

1
$ conda info --envs

创建环境

1
$ conda create -n ml

克隆环境

1
$ conda create --name new_name --clone old_name

启用环境

1
$ conda activate {env-name}

环境重命名

1
conda rename -n old_name new_name 

使用 yml 文件更新环境

1
$ conda env update --file env.yml --prune

删除环境

1
$ conda remove --name {env-name} --all

默认不启用 conda base 环境

1
$ conda config --set auto_activate_base false  # 关闭默认使用 base

为环境添加 channel

1
$ conda config --append channels conda-forge

包管理

conda 的包管理有 channel 的概念,如果不指定则为默认的 defaults。如果我们想要安装其他 channel 的包,示例如下。

1
$ conda install anaconda::gcc_linux-64

查询可用包

1
$ conda search {package}

或在 这里 搜索,页面有安装命令,比如。

1
2
3
$ conda install anaconda::gcc_linux-64
# 另外一个包
$ conda install conda-forge::gcc_linux-64

已安装包

1
$ conda list

移除包

1
$ conda uninstall {package}

安装包

1
2
3
4
5
6
7
8
# 默认包
$ conda install {package}

# 指定channel
$ conda install {channel}::{package}

# 指定版本
$ conda install {package}={version}

Kaggle

安装

详见文档Github 仓库

1
$ pip install kaggle

User Profile 页面 Create New Token,并将下载的文件放到 ~/.kaggle/kaggle.json

你行走的时候会一直看路上有钉子吗?

先从线上发现的一个小问题说起。

先说下背景,我们有个仓库维护公共的 proto 文件,且配置了 CI/CD,合并时触发编译,并打新的 tag。我们有个服务 A,依赖这个库。

小问题发生的过程如下。

  • proto 仓库增加了一个文件,该文件没有指定 go_package ,CI/CD 触发编译,生成 go 代码时报错(proto 未指定 go_package),tag 未更新
  • 服务 A 需求,需要向 proto 文件新增字段,合并后等待 CI/CD 触发编译
  • 等一段时间后,拷贝最新 tag(路径依赖,感觉留了足够时间跑编译流程,实际编译失败,最新的 tag 未包含改动)
  • 服务 A 上线
  • 上线后发现不符合预期
  • 修复 proto 编译问题后,发布 hotfix 版本

上面是小问题短周期的描述,如果把时间线拉长。

  • A 服务创建了一个 DEPENDS 文件,记录依赖的库及其版本,编译时通过脚本读取
  • 对 A 服务进行重构,重构服务就记为 B
  • 从 proto 库中拷贝需要的文件到服务 B 的代码库
  • 对 B 代码库的 proto 进行新增、修改
  • 觉得这种方式很容易出问题
    • 把服务 B 内 proto 的改动迁移到 proto 仓库
    • 通过 git submodule 的方式,在服务 B 内引入 proto 文件
  • 服务 B 是 C++ 服务,无需生成 go 代码,估新加的 proto 文件无 go_package
  • 此处接小问题发生过程

至此,这个事情陈述完毕。

我想再讲一个 case。我们在做用户数据迭代时,需要离线写入一份事件列表数据,我期望的是存储团队交付一个按时间戳由大及小排序好的时间序列,这样线上读取时无需再做一次排序。最后评审时,交付的是一个 map 结构,提出异议时,存储团队坚持认为 cassandra 集群的 map 是有序的,故符合需求,最终以 map 结构交付。由于原有封装好的读取接口,对 cassandra map 结构使用 unordered_map 保存。迫于排期,只能先读为 unordered_map,再转换为 vector,最后按时间戳排序。然而事情并没有结束,在后续做特征一致性校验时,出现不一致,原因是在以 map 存储时,key 是以秒为单位的时间戳,故如果多个事件具有相同的时间戳,只能保留一个。

想讲这些问题,是因为这样的事情,在过去的日子里,一次又一次的发生。更痛苦的是,在将来的日子里,也会一次又一次的发生。

更恐怖的是,当出现问题,我们往往舍本逐末、不追究 root cause,却做了很多其他的事情。就像,我们走路的时候,脚被钉子扎了,于是穿上了铁板鞋、两手提着两个大磁铁、身上背着医药箱、头低到膝盖走路,然而一切的原因,只是为了抄一点近路而选择了满是建筑废料的小路。

如果说两点之间直线最短,那么以正确的方式做正确的事情就是那条直线。

正确的方式,一定是简单且优雅的。

最后,因为偷懒或者其他原因留的每个坑,只要时间足够长,都会被踩到,而且可能不止一个地方,不止一次不挖坑,就不会踩坑。