当前位置: 首页 > news >正文

正交投影与内积空间:机器学习的几何基础

前言

本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和参考文献请见《机器学习数学通关指南》


正文

在这里插入图片描述

🔍 1. 内积空间的数学定义

1.1 代数定义 ✏️

两个维度相同的向量 a = [ a 1 , … , a n ] \mathbf{a} = [a_1, \dots, a_n] a=[a1,,an] b = [ b 1 , … , b n ] \mathbf{b} = [b_1, \dots, b_n] b=[b1,,bn],其内积为:

a ⋅ b = ∑ i = 1 n a i b i \mathbf{a} \cdot \mathbf{b} = \sum_{i=1}^n a_i b_i ab=i=1naibi

内积结果为标量,是后续投影和正交性的计算基础。在Python中可以这样实现:

import numpy as npa = np.array([1, 2, 3])
b = np.array([4, 5, 6])
dot_product = np.dot(a, b)  # 或简写为 a.dot(b) 或 a @ b
print(f"内积结果: {dot_product}")  # 输出: 内积结果: 32

1.2 几何定义 📐

从几何角度,向量 a \mathbf{a} a 与向量 b \mathbf{b} b 的内积为:

a ⋅ b = ∥ a ∥ ∥ b ∥ cos ⁡ θ \mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\| \|\mathbf{b}\| \cos\theta ab=a∥∥bcosθ

其中 θ \theta θ 是两个向量的夹角。这一性质直接关联到正交投影的计算,并表明:

  • θ = 90 ° \theta = 90° θ=90° 时,内积为0(正交向量)
  • θ = 0 ° \theta = 0° θ= 时,内积最大(同向向量)
  • θ = 180 ° \theta = 180° θ=180° 时,内积为负(反向向量)

🚀 2. 正交投影的核心思想

2.1 投影的物理意义 💡

向量 a \mathbf{a} a 在向量 b \mathbf{b} b 上的正交投影反映了前者在后者方向上的"影子长度"(即分解到该方向的分量):

投影长度 = ∥ a ∥ cos ⁡ θ = a ⋅ b ∥ b ∥ \text{投影长度} = \|\mathbf{a}\| \cos\theta = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{b}\|} 投影长度=acosθ=bab

投影向量则为:

投影向量 = a ⋅ b ∥ b ∥ 2 b \text{投影向量} = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{b}\|^2} \mathbf{b} 投影向量=b2abb

2.2 正交基与坐标表示 📊

在标准正交基下(如二维空间的基向量 e 1 , e 2 \mathbf{e}_1, \mathbf{e}_2 e1,e2),向量 v = [ v 1 , v 2 ] T \mathbf{v} = [v_1, v_2]^T v=[v1,v2]T 的坐标值实际上是其在基向量上的投影:

v 1 = v ⋅ e 1 , v 2 = v ⋅ e 2 v_1 = \mathbf{v} \cdot \mathbf{e}_1, \quad v_2 = \mathbf{v} \cdot \mathbf{e}_2 v1=ve1,v2=ve2

这揭示了一个重要概念:内积空间的坐标系本质上建立在投影关系上

🧩 3. 正交基的构造方法(Gram-Schmidt过程)

3.1 算法步骤 🔄

Gram-Schmidt正交化是将一组线性无关向量转换为正交基(甚至标准正交基)的经典方法:

  1. 从第一个向量开始,标准化得到第一个正交基向量
  2. 计算下一个向量在已有正交基上的投影
  3. 从原向量中减去这些投影分量,得到正交分量
  4. 标准化正交分量得到新的正交基向量
  5. 重复步骤2-4直到处理完所有向量

3.2 二维空间实例实现 🔨

如何将非正交基 { a 1 , a 2 } \{\mathbf{a}_1, \mathbf{a}_2\} {a1,a2} 转化为正交基 { q 1 , q 2 } \{\mathbf{q}_1, \mathbf{q}_2\} {q1,q2}

  1. 赋值 q 1 = a 1 ∥ a 1 ∥ \mathbf{q}_1 = \frac{\mathbf{a}_1}{\|\mathbf{a}_1\|} q1=a1a1
  2. 计算 a 2 \mathbf{a}_2 a2 q 1 \mathbf{q}_1 q1 的投影分量:
    投影向量 = ( a 2 ⋅ q 1 ) q 1 \text{投影向量} = (\mathbf{a}_2 \cdot \mathbf{q}_1) \mathbf{q}_1 投影向量=(a2q1)q1
  3. 去除投影分量后的正交向量:
    v 2 = a 2 − ( a 2 ⋅ q 1 ) q 1 \mathbf{v}_2 = \mathbf{a}_2 - (\mathbf{a}_2 \cdot \mathbf{q}_1) \mathbf{q}_1 v2=a2(a2q1)q1
  4. 标准化得:
    q 2 = v 2 ∥ v 2 ∥ \mathbf{q}_2 = \frac{\mathbf{v}_2}{\|\mathbf{v}_2\|} q2=v2v2

生成的 { q 1 , q 2 } \{\mathbf{q}_1, \mathbf{q}_2\} {q1,q2} 是标准正交基。

Python实现 🐍
def gram_schmidt(vectors):"""将一组线性无关向量正交化"""basis = []for v in vectors:w = v.copy()  # 从原始向量开始for b in basis:# 减去在已有基向量上的投影w = w - np.dot(w, b) / np.dot(b, b) * b# 如果剩余向量不为零,则标准化并添加到基向量集if np.linalg.norm(w) > 1e-10:basis.append(w / np.linalg.norm(w))return np.array(basis)# 示例
vectors = np.array([[1, 1], [1, 0]])
orthonormal_basis = gram_schmidt(vectors)
print("正交基:\n", orthonormal_basis)# 验证正交性
dot_product = np.dot(orthonormal_basis[0], orthonormal_basis)
print(f"内积结果(应接近0): {dot_product:.10f}")

🔬 4. 正交投影与矩阵表示

4.1 矩阵向量乘法的几何解释 📈

在标准正交基下,向量 v \mathbf{v} v 的坐标可表示为:

v 投影 = [ v ⋅ e 1 v ⋅ e 2 ] \mathbf{v}_{\text{投影}} = \begin{bmatrix} \mathbf{v} \cdot \mathbf{e}_1 \\ \mathbf{v} \cdot \mathbf{e}_2 \end{bmatrix} v投影=[ve1ve2]

它等价于基向量组成的变换矩阵 Q = [ e 1 e 2 ] \mathbf{Q} = [\mathbf{e}_1 \quad \mathbf{e}_2] Q=[e1e2] 的转置与向量的乘积:

v 投影 = Q T v \mathbf{v}_{\text{投影}} = \mathbf{Q}^T \mathbf{v} v投影=QTv

4.2 投影矩阵 🔄

向量 v \mathbf{v} v 投影到子空间 W W W 上的投影矩阵为:

P W = Q ( Q T Q ) − 1 Q T \mathbf{P}_W = \mathbf{Q}(\mathbf{Q}^T\mathbf{Q})^{-1}\mathbf{Q}^T PW=Q(QTQ)1QT

Q \mathbf{Q} Q 是标准正交基时,简化为:

P W = Q Q T \mathbf{P}_W = \mathbf{Q}\mathbf{Q}^T PW=QQT

🌟 5. 机器学习中的应用实例

5.1 主成分分析 (PCA) 🧠

PCA是最常见的降维技术,其核心就是寻找数据最大方差方向的正交基,并在该基上投影:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA# 生成有相关性的二维数据
np.random.seed(42)
cov = [[2, 1.5], [1.5, 1]]
data = np.random.multivariate_normal([0, 0], cov, 500)# 应用PCA
pca = PCA(n_components=2)
pca.fit(data)
transformed = pca.transform(data)# 可视化
plt.figure(figsize=(12, 5))# 原始数据
plt.subplot(1, 2, 1)
plt.scatter(data[:, 0], data[:, 1], alpha=0.5)
plt.title('原始数据')
plt.grid(True)# PCA转换后的数据
plt.subplot(1, 2, 2)
plt.scatter(transformed[:, 0], transformed[:, 1], alpha=0.5)
for i, (comp, var) in enumerate(zip(pca.components_, pca.explained_variance_)):plt.quiver(0, 0, comp[0], comp, scale=var*3, color='r',label=f'PC{i+1}: {var:.2f}')
plt.title('PCA转换后数据')
plt.grid(True)
plt.legend()plt.tight_layout()
plt.show()print(f"主成分方差比例: {pca.explained_variance_ratio_}")
print(f"主成分方向: {pca.components_}")

5.2 QR分解与矩阵求解 🧮

QR分解是Gram-Schmidt正交化的矩阵形式,广泛用于线性方程组求解和最小二乘法问题:

import numpy as np# 用于求解线性方程组 Ax = b
A = np.array([[2, 1], [1, 3]])
b = np.array([5, 4])# QR分解
Q, R = np.linalg.qr(A)# 求解方程 Rx = Q^T b
y = Q.T @ b
x = np.linalg.solve(R, y)print("QR分解求解的解: ", x)
print("直接求解的解: ", np.linalg.solve(A, b))
print("误差: ", np.linalg.norm(A @ x - b))

5.3 核方法与支持向量机 🔍

在支持向量机(SVM)中,核函数实质上定义了特征空间中的内积,使我们能在高维空间中执行计算而无需显式映射:

from sklearn import svm
from sklearn.datasets import make_circles
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt# 生成非线性可分数据
X, y = make_circles(n_samples=500, noise=0.1, factor=0.3, random_state=42)# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练RBF核SVM(本质是在高维空间中寻找正交超平面)
clf = svm.SVC(kernel='rbf', gamma=10)
clf.fit(X_train, y_train)# 预测与评估
accuracy = clf.score(X_test, y_test)# 绘制决策边界
h = 0.02
x_min, x_max = X[:, 0].min() - 0.1, X[:, 0].max() + 0.1
y_min, y_max = X[:, 1].min() - 0.1, X[:, 1].max() + 0.1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),np.arange(y_min, y_max, h))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)plt.figure(figsize=(8, 6))
plt.contourf(xx, yy, Z, alpha=0.3, cmap=plt.cm.Paired)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', cmap=plt.cm.Paired)
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],s=80, facecolors='none', edgecolors='k')
plt.title(f'RBF核SVM (准确率: {accuracy:.2f})')
plt.xlabel('特征1')
plt.ylabel('特征2')
plt.tight_layout()
plt.show()

5.4 正交化在神经网络中的应用 🧠

正交初始化和正交约束可以提高神经网络的训练稳定性和泛化能力:

import torch
import torch.nn as nn
import numpy as npclass OrthogonalRegularization(nn.Module):"""实现权重正交化的正则项"""def __init__(self):super(OrthogonalRegularization, self).__init__()def forward(self, model, strength=1e-4):reg_loss = 0.0for name, param in model.named_parameters():if 'weight' in name:if param.ndimension() > 1:# 计算 WW^T - I 的范数,鼓励权重矩阵正交mat = param.view(param.shape[0], -1)sym = torch.mm(mat, mat.t())sym -= torch.eye(sym.shape[0]).to(param.device)reg_loss += torch.sum(sym * sym)return strength * reg_loss# 在训练循环中使用:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels) + ortho_reg(model)
loss.backward()
optimizer.step()

🧮 6. 正交投影和内积空间的进阶应用

6.1 最小二乘法与线性回归 📊

最小二乘法是机器学习中最基础的模型之一,其解可以通过正交投影来理解:

β ^ = ( X T X ) − 1 X T y \hat{\beta} = (X^TX)^{-1}X^Ty β^=(XTX)1XTy

这个公式本质上是将目标向量 y y y 投影到 X X X 的列空间上:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression# 生成带噪声的线性数据
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 3 * X.squeeze() + 2 + np.random.randn(100) * 0.5# 正交投影方法(手动实现最小二乘)
X_b = np.c_[np.ones((100, 1)), X]  # 添加偏置项
theta_best = np.linalg.inv(X_b.T @ X_b) @ X_b.T @ y
print(f"手动计算的系数: {theta_best}")# 使用sklearn实现
reg = LinearRegression()
reg.fit(X, y)
print(f"sklearn系数: [{reg.intercept_}, {reg.coef_[0]}]")# 绘制结果
plt.figure(figsize=(10, 6))
plt.scatter(X, y, alpha=0.7)
X_test = np.array([[0], ])
X_test_b = np.c_[np.ones((2, 1)), X_test]
y_pred = X_test_b @ theta_best
plt.plot(X_test, y_pred, 'r-', linewidth=2, label='预测线')
plt.xlabel('X')
plt.ylabel('y')
plt.title('通过正交投影实现的最小二乘法')
plt.grid(True)
plt.legend()
plt.show()

6.2 特征值分解与谱理论 🔮

正交性在特征值分解中表现为正交特征向量,这是许多算法的理论基础:

import numpy as np
import matplotlib.pyplot as plt# 创建一个对称矩阵
A = np.array([[4, 2], [2, 3]])# 特征值分解
eigenvalues, eigenvectors = np.linalg.eig(A)
print("特征值:", eigenvalues)
print("特征向量:\n", eigenvectors)# 验证正交性
dot_product = np.dot(eigenvectors[:, 0], eigenvectors[:, 1])
print(f"特征向量内积(应接近0): {dot_product:.10f}")# 验证 Av = λv
for i in range(len(eigenvalues)):v = eigenvectors[:, i]lhs = A @ vrhs = eigenvalues[i] * vprint(f"特征向量{i+1}的验证误差: {np.linalg.norm(lhs - rhs):.10f}")# 可视化
plt.figure(figsize=(7, 7))
plt.axhline(y=0, color='k', linestyle='-', alpha=0.3)
plt.axvline(x=0, color='k', linestyle='-', alpha=0.3)
plt.grid(alpha=0.3)# 绘制原始矩阵的作用
for i in range(-2, 3):for j in range(-2, 3):v = np.array([i, j]) * 0.5Av = A @ vplt.arrow(v[0], v, Av[0]-v[0], Av-v, head_width=0.1, head_length=0.2, fc='b', ec='b', alpha=0.3)# 绘制特征向量
colors = ['red', 'green']
for i in range(len(eigenvalues)):v = eigenvectors[:, i] * eigenvalues[i]plt.arrow(0, 0, v[0], v, head_width=0.2, head_length=0.3, fc=colors[i], ec=colors[i], label=f'特征向量{i+1} (λ={eigenvalues[i]:.2f})')plt.xlim(-4, 4)
plt.ylim(-4, 4)
plt.title('特征向量与矩阵变换')
plt.legend()
plt.axis('equal')
plt.show()

📝 7. 总结与思考

7.1 核心概念回顾 💭

  • 内积空间提供了计算向量长度、角度和投影的统一框架
  • 正交性是向量空间中最重要的几何关系之一,表示两个方向完全独立
  • 正交投影允许我们将向量分解为互相独立的分量
  • Gram-Schmidt过程构造了线性无关向量集的正交基
  • 投影矩阵以矩阵形式表达投影操作,为线性代数提供几何解释

7.2 机器学习中的价值 🌱

内积空间和正交投影在机器学习中至关重要,因为它们:

  1. 简化计算:正交基使得矩阵运算和问题分解更加高效
  2. 增强解释性:正交特征往往具有更好的解释性和独立含义
  3. 避免过拟合:特征正交化减少了冗余信息,有助于泛化
  4. 启发算法设计:从PCA到深度学习中的正交初始化,正交性启发了众多算法改进

相关文章:

正交投影与内积空间:机器学习的几何基础

前言 本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 🔍 1. 内积空间的…...

Qt中txt文件输出为PDF格式

main.cpp PdfReportGenerator pdfReportGenerator;// 加载中文字体if (QFontDatabase::addApplicationFont(":/new/prefix1/simsun.ttf") -1) {QMessageBox::warning(nullptr, "警告", "无法加载中文字体");}// 解析日志文件QVector<LogEntr…...

《HelloGitHub》第 107 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…...

Langchain解锁LLM大语言模型的结构化输出能力(多种实现方案)

在 LangChain解锁LLM大语言模型的结构化输出能力&#xff1a;调用 with_structured_output() 方法 这篇博客中&#xff0c;我们了解了格式化LLM输出内容的必要性以及如何通过调用langchain框架中提供的 with_structured_output() 方法对LLM输出进行格式化&#xff08;三种可选方…...

AI数据分析:deepseek生成SQL

在当今数据驱动的时代&#xff0c;数据分析已成为企业和个人决策的重要工具。随着人工智能技术的快速发展&#xff0c;AI 驱动的数据分析工具正在改变我们处理和分析数据的方式。本文将着重介绍如何使用 DeepSeek 进行自动补全SQL 查询语句。 我们都知道&#xff0c;SQL 查询语…...

力扣-动态规划-115 不同子序列

思路 dp数组定义&#xff1a;0_i-1的字符串中有0_j-1的字符串有dp[i][j]个递推公式&#xff1a; if(s[i-1] t[j-1]){dp[i][j] dp[i-1][j-1] dp[i-1][j]; }else{dp[i][j] dp[i-1][j]; } 在该元素相同时&#xff0c;有两种可能1&#xff1a;使用该元素&#xff0c;所以0_i-2…...

Qt C++ 开发 动态上下页按钮实现

项目开发&#xff0c;想实现动态的显示按钮&#xff0c;考虑使用QStackedWidget做两个页面去切换。 首先&#xff0c;我们使用Qt ui 画出两个QStackedWidget的两个页面 要实现切换&#xff0c;我们只需要调用stackedWidget->setCurrentIndex(index)就行。 那么如何自动调…...

数据结构第五节:排序

1.常见的排序算法 插入排序&#xff1a;直接插入排序、希尔排序 选择排序&#xff1a;直接选择排序、堆排序 交换排序&#xff1a;冒泡排序、快速排序 归并排序&#xff1a;归并排序 排序的接口实现&#xff1a; // 1. 直接插入排序 void InsertSort(int* a, int n); // 2. 希…...

从文件到块: 提高 Hugging Face 存储效率

Hugging Face 在Git LFS 仓库中存储了超过30 PB 的模型、数据集和 Spaces。由于 Git 在文件级别进行存储和版本控制&#xff0c;任何文件的修改都需要重新上传整个文件。这在 Hub 上会产生高昂的成本&#xff0c;因为平均每个 Parquet 和 CSV 文件大小在 200-300 MB 之间&#…...

Android14 串口控制是能wifi adb实现简介

Android14 串口控制是能wifi adb实现简介 一、前言 文章目录 Android14 串口控制是能wifi adb实现简介一、前言二、Android14 串口控制是能wifi adb实现1、设置prop属性命令开启adb&#xff08;1&#xff09;相关prop属性设置&#xff08;2&#xff09;在设置界面或者 ifconfi…...

vue3中 组合式~测试深入组件:事件 与 $emit()

一、语法(props) 第一步&#xff1a;在组件模板表达式中&#xff0c;可以直接用$emit()方法触发自定义事件&#xff0c; <!-- MyComponent --> <button click"$emit(someEvent)">Click Me</button> 第二步父组件可以通过 v-on (缩写为 ) 来监听…...

SQL-labs13-16闯关记录

http://127.0.0.1/sqli-labs/less-13/ 基于POST单引号双注入变形 1&#xff0c;依然是一个登录框&#xff0c;POST型SQL注入 2&#xff0c;挂上burpsuite&#xff0c;然后抓取请求&#xff0c;构造请求判断漏洞类型和闭合条件 admin 发生了报错&#xff0c;根据提示闭合方式是(…...

基于微信小程序的停车场管理系统的设计与实现

第1章 绪论 1.1 课题背景 随着移动互联形式的不断发展&#xff0c;各行各业都在摸索移动互联对本行业的改变&#xff0c;不断的尝试开发出适合于本行业或者本公司的APP。但是这样一来用户的手机上就需要安装各种软件&#xff0c;但是APP作为一个只为某个公司服务的一个软件&a…...

DAIR-V2X-R数据集服务器下载

【官方github链接】https://github.com/ylwhxht/V2X-R 点击并登录 选择并点击下载 浏览器弹窗&#xff0c;右键选择复制下载链接 ------------------------------------服务器下载----------------------------------------- 登录服务器&#xff0c;选在要下载的文件夹复制路…...

table 拖拽移动

表格拖拽 Sortable.js中文网|配置 <!-- 教务处 --><template><div class"but"><el-button click"mergeAndPrintArrays()" type"primary">保存数据</el-button><el-button click"restoration()" t…...

Linux使用笔记:Find Tree 命令

Tree 命令的使用 使用-I 参数&#xff0c;过滤掉不想展未的目录或文件使用-L参数&#xff0c;指定展示的目录层级个数 arsenaltxzq1899:~/Workspace/vue-application$ tree -I node_modules/ -I public/ -L 2 . ├── components.json ├── Dockerfile ├── ecosystem.c…...

数据结构入门篇——什么是数据结构。

一、引入 工具是一种什么东西呢&#xff1f;是一种转化媒介&#xff0c;我们需要熟食&#xff0c;我们要通过用火来将生肉烤熟。在这个过程中。我们要输入一个东西——生肉&#xff0c;通过工具——火的加工&#xff0c;从而得到我们的目的产物——熟肉。 将上面的例子和红字部…...

MySQL-简介与基本命令

数据库 主流数据库 关系型数据库 MySQL&#xff1a;开源免费的关系型数据库&#xff0c;易于使用和学习&#xff0c;支持大型企业级应用。其特点包括高性能、可靠性和可扩展性&#xff0c;支持多种编程语言和操作系统&#xff0c;拥有大量的社区支持和插件SQLite&#xff1a…...

汽车材料耐候性测试仪器-太阳光模拟器介绍

**太阳光模拟器**是一种用于模拟太阳光谱的设备&#xff0c;广泛应用于汽车材料的耐候性测试。通过模拟太阳光中的紫外线、可见光和红外线&#xff0c;评估材料在长期光照下的性能变化。 主要组成部分 1. **光源系统**&#xff1a; - **氙灯**&#xff1a;最常用的光源&…...

音频3A测试--AEC(回声消除)测试

一、测试前期准备 一台录制电脑:用于作为近段音源和收集远端处理后的数据; 一台测试设备B:用于测试AEC的设备; 一个高保真音响:用于播放设备B的讲话; 一台播放电脑:用于模拟设备A讲话,和模拟设备B讲话; 一台音频处理器(调音台):用于录制和播放数据; 测试使用转接线若…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...