0%

机器学习术语表

机器学习类型

什么是机器学习?

根据机器学习系统学习进行预测或生成内容的方式,机器学习系统可分为以下一个或多个类别:

  • 监督式学习
  • 非监督式学习
  • 强化学习
  • 生成式 AI
  • 实现机器学习的一般步骤:
  1. 数据收集
  2. 数据准备
  3. 数据分析
  4. 训练算法
  5. 测试算法
  6. 应用算法

数据

训练集、验证集、测试集

虚拟环境

在 Linux 中配置 Python 项目的运行虚拟环境通常使用 venv(虚拟环境)模块。以下是一般的步骤:

  1. 安装 venv 模块(如果尚未安装):

    检查你的 Python 版本并确保安装了 venv 模块。

  2. 创建虚拟环境:

    在项目目录中,运行以下命令创建一个名为 myenv 的虚拟环境:

    1
    python3 -m venv myenv

    这将在当前目录创建一个名为 myenv 的虚拟环境文件夹。

  3. 激活虚拟环境:

    激活虚拟环境可通过以下命令:

    1
    source myenv/bin/activate

    这将激活名为 myenv 的虚拟环境。激活后,你的终端提示符可能会显示虚拟环境的名称。

  4. 安装项目依赖:

    在激活的虚拟环境中,使用 pip 安装项目所需的依赖:

    1
    pip install -r requirements.txt

    其中 requirements.txt 是包含项目依赖项的文件。

  5. 退出虚拟环境:

    当你完成项目工作后,可以通过以下方式退出虚拟环境:

    1
    deactivate

    这将使虚拟环境退出,并恢复到系统默认环境。

使用虚拟环境有助于隔离项目的依赖,避免与系统其他项目的依赖冲突,并提供更干净的开发环境。

uvicorn

正常情况下虚拟环境 /path/to/venv/bin/ 下面是有 uvicorn 的启动命令的,即 /xxx/venv/bin/uvicorn

如果当前虚拟环境不识别uvicorn,可通过

  • 方式一
1
python -m uvicorn xxx:app --reload
  • 方式二
1
pip install --force-reinstall uvicorn

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 查看当前版本
pyenv version

# 查看所有版本
pyenv versions

# 查看所有可安装的版本
pyenv install --list

# 安装指定版本
pyenv install 3.6.5
# 安装新版本后rehash一下
pyenv rehash

# 删除指定版本
pyenv uninstall 3.5.2

# 指定版本
pyenv shell <version> -- select just for current shell session
pyenv local <version> -- automatically select whenever you are in the current directory (or its subdirectories)
pyenv global <version> -- select globally for your user account

# 指定多个全局版本, 3版本优先
pyenv global 3.6.5 2.7.14

# 实际上当你切换版本后, 相应的pip和包仓库都是会自动切换过去的
  • 当前项目使用的pyenv版本会在 .python-version文件中体现

reference



配置文件

spring.config.additional-location

不会使项目默认的配置文件失效,使用该命令行参数添加的外部配置文件会与项目默认的配置文件共同生效,形成互补配置,且其优先级是最高的,比所有默认配置文件的优先级都高。

spring.config.location

使用该参数指定配置文件后,会使项目默认配置文件(application.properties 或 application.yml )失效,Spring Boot 将只加载指定的外部配置文件。

  • session
    功能 macos linux
    新建session tmux new -s 一样
  • 窗口
功能 macos linux
  • 窗格
功能 macos linux
调整窗格大小 Ctrl + b, Esc + 方向键 Ctrl + b, Ctrl + 方向键
窗格内容翻页 Ctrl + b, Fn + 上下键 Ctrl + b, Ctrl + 上下键
  • 其它
    功能 macos linux
    内嵌tmux操作 按着 ctrl,点击两次 b 键 一样

命令模式

ctrl + b 然后按下:

会话

  • 创建会话

    new-session -s <session name>

  • 切换会话

    switch-client -t <session name or id>

窗口

  • 交换窗口位置

    1
    2
    3
    4
    5
    # 交换编号3与编号1窗口的位置
    swap-window -s 3 -t 1

    # 把当前窗口放到指定编号1的位置
    swap-window -t 0
  • 新建窗口

    new-window -n <window name>

  • 切换窗口

    select-window -t <window id>

    select-window -n <window name>

窗格

  • 分割窗格

    split-window -h 水平

    split-window -v 垂直

Tmux Plugin Manager (TPM)

  • 配置文件地址~/.tmux.conf

    修改配置生效 tmux source-file ~/.tmux.conf

  • 使用快捷键插件管理
    1
    2
    3
    4
    # prefix表示是Tmux的快捷键前缀
    prefix shift-i # 安装件列表中的插件
    prefix shift-u # 更新件列表中的插件
    prefix alt-u # 删除/卸载不在插件列表中的插件
  • 使用命令行插件管理
    1
    2
    3
    ~/.tmux/plugins/tpm/bin/install_plugins                  # 安装件列表中的插件
    ~/.tmux/plugins/tpm/bin/update_plugins all|plugname # 更新所有插件或指定插件
    ~/.tmux/plugins/tpm/bin/clean_plugins # 删除/卸载不在插件列表中的插件
  • 保存/恢复会话 tmux-resurrect

    默认会话数据路径 /.local/share/tmux/resurrect

    1
    2
    3
    4
    保存Tmux会话:前缀键 + Ctrl-s
    还原Tmux会话: 前缀键 + Ctrl-r

    Tmux Resurrect 会将 Tmux 会话的详细信息以文本文件形式保存到 ~/.tmux/resurrect 目录;

  • NotOpenSSLWarning: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the ‘ssl’ module is compiled with ‘LibreSSL 2.8.3’.
1
2
pip uninstall urllib3
pip install 'urllib3<2.0'

stackoverflow

依赖

  • paddlepaddle依赖只能在 python 3.9版本之内可以安装

Principle

SOLID

  • S (单一职责原则 Single responsibility principle)

    • 一个类应该仅仅只有一个被修改的理由。
  • O (开放-关闭原则 Open–closed principle)

    • 类应该对扩展开放,对修改封闭。
  • L (里氏替换原则 Liskov Substitution Principle)

    • 子类应该可以随意替换它的父类 ,而不破坏程序 本身的功能
  • I (接口隔离原则 Interface Segregation Principles)

    • 客户(client)应该不依赖于它不使用的方法
  • D (依赖倒置原则 Dependency Inversion Principle)

    • 高层模块不应该依赖于低层模块,二者都应该依赖于抽象。

idea

  • 好代码在处理边界情况时应该是简洁的、“润物细无声”的

code practise

边界情况(Edge cases)

  • bad style:
    • LBYL(Look Before You Leap)
  • better style:
    • EAFP(Easier to Ask for Forgiveness than Permission)
  • best style
    • 在日常编码时,我们应该尽量避免去手动校验数据。而是应该使用(或者自己实现)合适的第三方校验模块,把这部分边界处理工作抽象出去,简化主流程代码。

Method

统计运行时间

1
2
3
4
# 毫秒值
start_time = time.perf_counter()
xxx
cost_time = int((time.perf_counter() - start_time)* 1000)

__call__函数

__call__ 方法是 Python 中的一个特殊方法(也称为魔术方法),用于将一个对象作为函数调用。当一个对象被作为函数调用时,Python 解释器会自动调用该对象的 __call__ 方法。

在类中定义 __call__ 方法可以使对象具有可调用的行为,就像调用函数一样。这样的对象被称为可调用对象。通过实现 __call__ 方法,我们可以在对象被调用时执行特定的逻辑。

以下是一个示例,展示了如何定义和使用 __call__ 方法:

1
2
3
4
5
6
class CallableClass:
def __call__(self, *args, **kwargs):
print("Object is being called")

obj = CallableClass()
obj() # 等同于调用 obj.__call__()

在上面的示例中,我们定义了一个名为 CallableClass 的类,并在其中实现了 __call__ 方法。当创建 CallableClass 的实例 obj 并将其作为函数调用时,__call__ 方法会被自动调用,并打印出 “Object is being called”。

需要注意的是,__call__ 方法可以带有参数,就像普通的函数一样。我们可以在 __call__ 方法中定义任意的逻辑,可以访问实例的属性、调用其他方法等。

使用 __call__ 方法可以使对象具有类似函数的行为,这在某些情况下非常有用,例如实现可调用的类或实现函数式编程的概念。

**使用

  • ** 运算符用于解包字典或关键字参数。当应用于字典时,** 运算符可以将字典中的键值对解包为一系列关键字参数传递给函数或方法。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def print_person_info(name, age, city):
    print(f"Name: {name}")
    print(f"Age: {age}")
    print(f"City: {city}")

    person = {
    'name': 'Alice',
    'age': 25,
    'city': 'New York'
    }

    print_person_info(**person)

布尔真假判断

虽然所有用户类实例的布尔值都是真。但是 Python 提供了改变这个行为的办法:自定义类的 __bool__ 魔法方法 (在 Python 2.X 版本中为 __nonzero__。当类定义了 __bool__ 方法后,它的返回值将会被当作类实例的布尔值。

另外,__bool__ 不是影响实例布尔真假的唯一方法。如果类没有定义 __bool__ 方法,Python 还会尝试调用 __len__ 方法(也就是对任何序列对象调用 len 函数),通过结果是否为 0 判断实例真假。

在条件判断中使用 all() / any()

all()any() 两个函数非常适合在条件判断中使用。这两个函数接受一个可迭代对象,返回一个布尔值,其中:

  • all(seq):仅当 seq 中所有对象都为布尔真时返回 True,否则返回 False
  • any(seq):只要 seq 中任何一个对象为布尔真就返回 True,否则返回 False

使用 partial 构造新函数

1
2
3
4
5
def multiply(x, y):
return x * y
def double(value):
# 返回另一个函数调用结果
return multiply(2, value)

可写成

1
2
3
import functools

double = functools.partial(multiply, 2)

Mixin

Mixin 是面向对象编程中的一个术语,它表示一种设计模式,用于将一组功能或行为以模块化的方式添加到类中,而不需要使用继承的方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class SendMailMixin:
def send_mail(self, email):
print(f"Sending mail to {email}")

class User:
def __init__(self, email):
self.email = email

class AdminUser(User, SendMailMixin):
def send_admin_mail(self):
self.send_mail(self.email)

admin = AdminUser("admin@example.com")
admin.send_admin_mail() # 输出: Sending mail to admin@example.com

Mixin和abc.ABC的区别:

  1. 用途: Mixin侧重于代码复用和功能扩展,而abc.ABC则用于定义抽象类和接口。
  2. 继承关系: Mixin通常与其他类一起使用多重继承,而abc.ABC作为基类被具体类继承。
  3. 抽象程度: Mixin可以包含具体的实现,而abc.ABC中的抽象方法必须由子类实现。
  4. 类型检查: abc.ABC可用于类型检查,而Mixin无法直接进行类型检查。

LOOP

1
2
for i, name in enumerate(names):
print(i, name)
  • 使用 product 扁平化多层嵌套循环
  • 使用 islice 实现循环内隔行处理
  • 使用 takewhile 替代 break 语句
  • 使用生成器编写自己的修饰函数

修改外层变量时记得使用 nonlocal

  • 闭包的参数使用

类对象

  • cls
1
2
@classmethod
def _send_request(cls, method, endpoint, json=None, params=None):

使用 dataclass 简化代码

总结一下,dataclass主要提供了以下几方面的功能:

  1. 自动生成构造函数和基本方法

    • 自动生成__init__构造函数
    • 自动生成__repr____eq__等基本方法
  2. 数据字段管理

    • 定义数据字段
    • 支持为字段设置默认值
    • 支持字段类型注解
    • 支持只读字段、后期初始化字段
  3. 数据类行为定制

    • 可自定义字段排序
    • 可自定义字段命名规则(snake_case/CamelCase)
    • 支持自定义__post_init__方法做数据校验
    • 可控制是否生成__repr__方法
    • 支持生成__hash__方法用于哈希
  4. 性能优化

    • 支持使用__slots__优化内存使用
  5. 与静态类型检查工具结合

    • 支持与mypy等类型检查工具结合使用
  6. 继承和嵌套

    • 支持数据类的继承
    • 支持嵌套数据类作为字段

通过这些功能,dataclass可以极大简化数据类的定义和使用,减少样板代码。它使得创建数据类变得高效和优雅,同时还提供了足够的定制空间。无论是简单的数据持有对象还是复杂的数据结构,dataclass都能发挥它的优势,提高代码的可读性和可维护性。

Package

文件处理

  • pathlib

Grammar

  • *args 接收并处理所有传递进来的位置参数,**kwargs 接收并处理所有传递进来的关键字参数。