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

day16 numpy和shap深入理解

NumPy数组的创建

NumPy数组是Python中用于存储和操作大型多维数组和矩阵的主要工具。NumPy数组的创建非常灵活,可以接受各种“序列型”对象作为输入参数来创建数组。这意味着你可以将Python的列表(List)、元组(Tuple),甚至其他的NumPy数组等数据结构直接传递给np.array()来创建新的NumPy数组。

简单创建

# 创建数组
# 最普通的一维数组,有初始化数据
a = np.array([1, 2, 3, 4, 5])
print(a, end="\n\n") # ————> [1 2 3 4 5]# 创建一个【多维】数组
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a, end="\n\n") # ————> 二维数组:[[1 2 3] [4 5 6]]
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(a, end="\n\n") # ————> 三位数组:[[1 2 3] [4 5 6] [7 8 9]]

随机创建

在深度学习中,我们经常需要对数据进行随机化处理,以确保模型的泛化能力。NumPy提供了多种随机数生成方法,如np.random.randint()np.random.rand()np.random.randn()等,可以生成不同范围和分布的随机数。

c = np.random.rand(2, 2)  # 创建一个2*2的随机数组,区间为[0,1)

NumPy数组的索引

NumPy数组的索引方式非常灵活,支持一维、二维和三维数组的索引。

一维数组索引

一维数组的索引与Python列表类似,可以通过整数索引或切片来访问元素。

arr1d = np.arange(10)  # 数组: [0 1 2 3 4 5 6 7 8 9]
arr1d[0]  # 取出数组的第一个元素
arr1d[-1] # 取出数组的最后一个元素

二维数组索引

二维数组可以看作是“数组的数组”或一个矩阵。其结构由两个主要维度决定:行数和列数。

arr2d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
arr2d[1, :]  # 取出第 1 行的所有元素
arr2d[:, 2]  # 取出第 2 列的所有元素
# 一维数组的切片序列是一样的
a = np.array([1, 2, 3, 4, 5])print(a[1:4])    # [2, 3, 4]
print(a[4::-1])    # [5, 4, 3, 2, 1]
print(a[::2])    # [1, 3, 5]# 如果是二维以上的,就需要把起始位跟末尾位带上,而且切片形式和不切片形式都有不同的含义
# 基本是就是 [ 行的切片 , 列的切片 ]
#【行】如果不是切片形式就代表固定是【某一行取序列】
#【列】如果没有切片形式就代表固定某一行或所有行都只取【这一列这个数】
a = np.array([[1, 2, 3], [4, 5, 6]])print(a[0])       # 如果是直接取一行,就直接1个数字代表第几行就行 ————> [1, 2, 3]
print(a[0, :])    # 这样也是直接取一行,只不过是取第[0]行,从第[0]列到第[尾]列,[1, 2, 3]print(a[0, 1])    # 2,取第[0]行,第[1]列的数
print(a[:, 1])    # [2, 5],每一行的第[1]列的数
print(a[:, :])    # [[1, 2, 3], [4, 5, 6]],从第[1]行开始的[从头到尾],到第[2]行开始的[从头到尾]print(a[1, 0:2])    # [4, 5],从第[1]行开始,分割[第0列~第2列]print(a[1, ::-1])    # [6, 5, 4],从第[1]行开始,分割[第尾列~第0列],步长为-1倒着1个1个取

三维数组索引

三维数组的索引更为复杂,但原理与二维数组类似,只是在索引时增加了一个维度。

arr3d = np.arange(3 * 4 * 5).reshape((3, 4, 5))
arr3d[1, :, :]  # 选择特定的层

numpy数组计算
1)最基础的一维向量的加减乘除

# 简单加减乘除

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b)    # [1+4, 2+5, 3+6] = [5, 7, 9]
print(a - b)    # [1-4, 2-5, 3-6] = [-3, -3, -3]
print(a * b)    # [1*4, 2*5, 3*6] = [4, 10, 18]
print(a / b)    # [1/4, 2/5, 3/6] = [0.25, 0.4, 0.5]

注意:如果是跟一个数字进行计算,就会把每一个元素都跟这个数计算

print(a + 1)    # [1+1, 2+1, 3+1] = [2, 3, 4]
print(a - 1)    # [1-1, 2-1, 3-1] = [0, 1, 2]
print(a * 2)    # [1*2, 2*2, 3*2] = [2, 4, 6]
print(a / 2)    # [1/2, 2/2, 3/2] = [0.5, 1.0, 1.5]

2)向量的点乘

# 点乘

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(np.dot(a, b))    # [1*4 + 2*5 + 3*6] = 32

3)矩阵的乘法

# 矩阵乘法运算

A = np.array([[1, 2],[3, 4]])B = np.array([[5, 6],[7, 8]])
#【第一种方法】:A @ B
print(A @ B)
"""
[[1*5 + 2*7, 1*6 + 2*8],        [[19, 22],[3*5 + 4*7, 3*6 + 4*8]] ————>   [43, 50]]
"""

# 【第二种方法】:np.matmul()
print(np.matmul(A, B))
这里有一点要注意,因为同行同列的N维向量进行点乘时,也是得到一个同行同列的N维向量,所以用【np.dot(A,B)】结果是等于上面两种矩阵相乘的结果的,但是这不代表【点乘】=【矩阵相乘】,因为矩阵相乘严格要求【形状相同(同行同列)】的两个矩阵相乘。

那么假设两个一维向量,用np.dot() 会执行点乘,而 A @ B 和 np.matmul() 会因为形状不兼容而抛出错误。

np.dot() 可以用于执行两个数组的点积或矩阵乘法,具体取决于输入数组的形状。

print(np.dot(A, B))
"""
[[1*5 + 2*7, 1*6 + 2*8],        [[19, 22], [3*5 + 4*7, 3*6 + 4*8]] ————>   [43, 50]]
"""

4)求平方

# 求平方

a = np.array([1, 2, 3])
print(a ** 2)    # [1*1, 2*2, 3*3] = [1, 4, 9]
print(np.square(a))    # [1*1, 2*2, 3*3] = [1, 4, 9]

5)求指数、对数的运算

# 指数、对数运算

a = np.array([1, 2, 3])
print(np.pow(a, 3))    # [1^3, 2^3, 3^3] = [1, 8, 27]
print(np.log(a))    # [log(1), log(2), log(3)] = [0, 0.6931471805599453, 1.0986122886681098]

6)求sin、cos值

# 求sin、cos

a = np.array([1, 2, 3])
print(np.sin(a))    # [sin(1), sin(2), sin(3)]
print(np.cos(a))    # [cos(1), cos(2), cos(3)]

7)统计一个数组的最大、最小、平均、中位数、总和、方差、标准差.....

a = np.array([1, 2, 3])# 返回数组最小元素
print(np.min(a))    # 1# 返回数组最大元素
print(np.max(a))    # 3# 返回数组平均值
print(np.mean(a))    # 2.0# 返回数组中位数
print(np.median(a))    # 2.0# 返回数组最小数的位置
print(np.argmin(a))    # 0# 返回数组最大数的位置
print(np.argmax(a))    # 2# 返回数组总和
print(np.sum(a))    # 6# 返回数组标准差
print(np.std(a))    # 1.0# 返回数组方差
print(np.var(a))    # 1.0

这里对于二维数组,如果只想统计二维数组里的【每一行】或【每一列】,只需要在( )再加第二个参数:【axis=1】(统计行)或【axis=0】(统计列)

# 找到二维数组np.arange(9).reshape(3,3)每一行中的最大值?
a = np.arange(9).reshape(3,3)
# [[0 1 2]
#  [3 4 5]
#  [6 7 8]]print(np.max(a, axis=1)) # ————> 【2 5 8】
# 某一列就把axis换成0
print(np.max(a, axis=0)) # ————> 【6 7 8】

SHAP的深入理解

SHAP(SHapley Additive exPlanations)值是一种解释机器学习模型预测结果的方法。它基于合作博弈论中的Shapley值,用于解释每个特征对模型预测的贡献。

SHAP值是一个多维数组,其中每个维度代表不同的信息。例如,对于一个二分类问题,SHAP值的第三个维度可能表示两个类别的贡献值。

shap_values.shape  # (样本数, 特征数, 类别数)
# 先运行之前预处理好的代码import pandas as pd    #用于数据处理和分析,可处理表格数据。
import numpy as np     #用于数值计算,提供了高效的数组操作。
import matplotlib.pyplot as plt    #用于绘制各种类型的图表
import seaborn as sns   #基于matplotlib的高级绘图库,能绘制更美观的统计图形。
import warnings
warnings.filterwarnings("ignore")# 设置中文字体(解决中文显示问题)
plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows系统常用黑体字体
plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号
data = pd.read_csv('data.csv')    #读取数据# 先筛选字符串变量 
discrete_features = data.select_dtypes(include=['object']).columns.tolist()
# Home Ownership 标签编码
home_ownership_mapping = {'Own Home': 1,'Rent': 2,'Have Mortgage': 3,'Home Mortgage': 4
}
data['Home Ownership'] = data['Home Ownership'].map(home_ownership_mapping)# Years in current job 标签编码
years_in_job_mapping = {'< 1 year': 1,'1 year': 2,'2 years': 3,'3 years': 4,'4 years': 5,'5 years': 6,'6 years': 7,'7 years': 8,'8 years': 9,'9 years': 10,'10+ years': 11
}
data['Years in current job'] = data['Years in current job'].map(years_in_job_mapping)# Purpose 独热编码,记得需要将bool类型转换为数值
data = pd.get_dummies(data, columns=['Purpose'])
data2 = pd.read_csv("data.csv") # 重新读取数据,用来做列名对比
list_final = [] # 新建一个空列表,用于存放独热编码后新增的特征名
for i in data.columns:if i not in data2.columns:list_final.append(i) # 这里打印出来的就是独热编码后的特征名
for i in list_final:data[i] = data[i].astype(int) # 这里的i就是独热编码后的特征名# Term 0 - 1 映射
term_mapping = {'Short Term': 0,'Long Term': 1
}
data['Term'] = data['Term'].map(term_mapping)
data.rename(columns={'Term': 'Long Term'}, inplace=True) # 重命名列
continuous_features = data.select_dtypes(include=['int64', 'float64']).columns.tolist()  #把筛选出来的列名转换成列表# 连续特征用中位数补全
for feature in continuous_features:     mode_value = data[feature].mode()[0]            #获取该列的众数。data[feature].fillna(mode_value, inplace=True)          #用众数填充该列的缺失值,inplace=True表示直接在原数据上修改。# 最开始也说了 很多调参函数自带交叉验证,甚至是必选的参数,你如果想要不交叉反而实现起来会麻烦很多
# 所以这里我们还是只划分一次数据集
from sklearn.model_selection import train_test_split
X = data.drop(['Credit Default'], axis=1)  # 特征,axis=1表示按列删除
y = data['Credit Default'] # 标签
# 按照8:2划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  # 80%训练集,20%测试集from sklearn.ensemble import RandomForestClassifier #随机森林分类器from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score # 用于评估分类器性能的指标
from sklearn.metrics import classification_report, confusion_matrix #用于生成分类报告和混淆矩阵
import warnings #用于忽略警告信息
warnings.filterwarnings("ignore") # 忽略所有警告信息
# --- 1. 默认参数的随机森林 ---
# 评估基准模型,这里确实不需要验证集
print("--- 1. 默认参数随机森林 (训练集 -> 测试集) ---")
import time # 这里介绍一个新的库,time库,主要用于时间相关的操作,因为调参需要很长时间,记录下会帮助后人知道大概的时长
start_time = time.time() # 记录开始时间
rf_model = RandomForestClassifier(random_state=42)
rf_model.fit(X_train, y_train) # 在训练集上训练
rf_pred = rf_model.predict(X_test) # 在测试集上预测
end_time = time.time() # 记录结束时间print(f"训练与预测耗时: {end_time - start_time:.4f} 秒")
print("\n默认随机森林 在测试集上的分类报告:")
print(classification_report(y_test, rf_pred))
print("默认随机森林 在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, rf_pred))

SHAP 基于 Shapley 值,因此我们首先需要知道什么是 Shapley 值。假设我们有 3 名球员,即 L、M、N,要参加一场机器篮球比赛。如果 L 单独上场,他可以获得 10 分。而 M 和 N 的分数分别是 20 分和 25 分。如果 L 和 M 一起打球,他们知道如何合作,最终能得到 40 分。然而,当 L 和 N 组队时,他们只能得到 30 分。详情如下表所示,其中 v(S) 是 S 中成员通过合作可以获得的总贡献。

如何根据上述信息找出球队中每个球员的贡献?

这三名球员中哪一名最优秀?例如,一名球员 L 的贡献可以通过 L 为最终得分带来的差异来计算。换句话说,我们考虑的是有 L 参加比赛时与没有 L 参加比赛时的差异。再细分一下,当 L 加入游戏时,他可以单独玩,也可以与其他成员一起玩。因此,直观地说,L 的最终贡献应该是所有情况的平均值,到目前为止的总结夏普利值的主要思想是获取某一特征在所有不同排序中的边际贡献,然后求取平均值

  1. 效率与准确性的权衡:在用SHAP库算特征贡献的时候,我发现这玩意儿计算量真不小。特别是特征一多,那计算时间就蹭蹭往上涨。我就得琢磨,怎么在不牺牲太多准确性的前提下,让这玩意儿跑快点。

  2. 动态特征重要性:我发现特征对模型的影响并不是静态的。比如,在不同的数据子集上,同一个特征的重要性可能会有很大差异。这让我意识到,可能需要定期重新评估特征的重要性,以适应数据的变化。

遇到的问题

  1. 计算资源:有时候,数据量大了,计算SHAP值特别费资源。我就得想办法优化代码,或者用更强大的计算资源,这在资源有限的情况下是个问题。

  2. 解释的复杂性:有时候,即使SHAP值计算出来了,解释为啥某个特征重要也挺难的。特别是对于那些业务逻辑复杂的项目,你得深入理解业务,才能把特征影响解释清楚。

  3. 编码:错误或不合适的编程代码导致在数据庞大的时候出现错误,例如在之前项目实战中的独热编码

    #分离连续变量与离散变量
    discrete_features=['invoice_no','customer_id','gender','category','payment_method','invoice_date']

    我发现data = pd.get_dummies(data, columns=discrete_lists) 的运行速度非常慢,后面查看数据才发现['invoice_no','customer_id','invoice_date']有问题,其中:1.invoice_no和'customer_id'有99457个唯一值、'invoice_date'有797个唯一值,也就是说我在试图为了这三列特征生成几万个新列,导致了运行内存崩溃,程序未响应。直方图在前也是侥幸画出,后面需要更改这个独热编码,筛选关键列或者合并类别

修改后:

# discrete features
for col in discrete_features:if col in ['invoice_no', 'customer_id', 'invoice_date']:print(f"跳过 {col} 的直方图,因为它不适合绘制直方图。")continueplt.figure(figsize=(10, 4))sns.histplot(x=data[col],shrink=0.8)plt.xticks(rotation=45, ha='right')plt.show()
# 处理日期列
data['invoice_date'] = pd.to_datetime(data['invoice_date'])
data['year'] = data['invoice_date'].dt.year
data['month'] = data['invoice_date'].dt.month
data['day'] = data['invoice_date'].dt.day
data['weekday'] = data['invoice_date'].dt.weekday
data['quarter'] = data['invoice_date'].dt.quarter# 删除原始日期列#对没有顺序的离散变量进行独热编码
discrete_lists = [] # 新建一个空列表,用于存放离散变量名
for discrete_features in data.columns:if data[discrete_features].dtype == 'object':discrete_lists.append(discrete_features)# 排除高基数的列
discrete_lists = [col for col in discrete_lists if col not in ['invoice_no', 'customer_id', 'invoice_date']]
# 离散变量独热编码
data = pd.get_dummies(data, columns=discrete_lists) 
data.columns

参考:深入理解SHAP

@浙大疏锦行

相关文章:

day16 numpy和shap深入理解

NumPy数组的创建 NumPy数组是Python中用于存储和操作大型多维数组和矩阵的主要工具。NumPy数组的创建非常灵活&#xff0c;可以接受各种“序列型”对象作为输入参数来创建数组。这意味着你可以将Python的列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;…...

深入探索 51 单片机:从入门到实践的全面指南

深入探索 51 单片机&#xff1a;从入门到实践的全面指南 一、引言 在嵌入式系统发展的漫长历程中&#xff0c;51 单片机犹如一颗璀璨的明星&#xff0c;虽然诞生已有数十年&#xff0c;但至今仍在众多领域发挥着重要作用。它以结构简单、易于学习、成本低廉等优势&#xff0c…...

架构思维:构建高并发读服务_热点数据查询的架构设计与性能调优

文章目录 一、引言二、热点查询定义与场景三、主从复制——垂直扩容四、应用内前置缓存4.1 容量上限与淘汰策略4.2 延迟刷新&#xff1a;定期 vs. 实时4.3 逃逸流量控制4.4 热点发现&#xff1a;被动 vs. 主动 五、降级与限流兜底六、前端&#xff0f;接入层其他应对七、模拟压…...

时间同步服务核心知识笔记:原理、配置与故障排除

一、时间同步服务 在 Linux 系统中&#xff0c;准确的时间至关重要。对于服务器集群&#xff0c;时间同步确保各节点间数据处理和交互的一致性&#xff0c;避免因时间差异导致的事务处理错误、日志记录混乱等问题。在分布式系统中&#xff0c;时间同步有助于协调任务调度、数据…...

三种石墨烯(Graphene)拉伸模拟方法对比

免责声明:个人理解,仅供参考,若有问题欢迎讨论! 一、原理解释 1、fix deform 法——整体拉伸的理想模型 📌 模拟逻辑: 使用 fix deform 指令,对模拟盒子整体在 x 方向均匀伸长; 同时施加 npt 控制,使 y 和 z 方向维持零压状态(自由弛豫); 整个石墨烯结构在形变…...

Linux系统编程--基础指令(!!详细讲解+知识拓展)

第一讲 基础指令 ​ 我们现如今自己使用的电脑大部分是用的都是windows或者macOS&#xff0c;并配合上由微软和苹果开发的图形化界面&#xff0c;所以使用鼠标再屏幕上进行点击即可完成许多任务。但是作为操作系统的学习者&#xff0c;在linux的基础上不再使用图形化界进行操作…...

Python10天冲刺《Pydantic 是一个用于数据验证和设置管理的 Python 库》

Pydantic 是一个用于数据验证和设置管理的 Python 库&#xff0c;其核心功能围绕 数据验证、类型检查 和 模型配置 展开。以下是 Pydantic 的主要功能分类及其简要说明和示例&#xff1a; 1. 数据验证与类型检查 Pydantic 的核心功能是自动验证数据的类型、格式和约束条件。 …...

【工具】adverSCarial评估单细胞 RNA 测序分类器抵御对抗性攻击的脆弱性

文章目录 介绍代码参考 介绍 针对单细胞 RNA 测序&#xff08;scRNA-seq&#xff09;数据中健康细胞类型与病变细胞类型的检测&#xff0c;已有多项机器学习&#xff08;ML&#xff09;算法被提出用于医学研究目的。这引发了人们对于这些算法易受对抗性攻击的担忧&#xff0c;…...

机场围界报警系统的研究与应用

机场围界报警系统的研究与应用 摘要 本论文围绕机场围界报警系统展开深入研究,阐述了机场围界报警系统的重要性,对当前主流的机场围界报警技术原理、特点及应用场景进行详细分析,并探讨了现有系统存在的问题,最后对未来发展趋势进行了展望。研究表明,机场围界报警系统对…...

嵌入式操作系统

嵌入式操作系统是一种用途广泛的系统软件&#xff0c;通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等。嵌入式操作系统负责嵌入式系统的全部 软、硬件资源的分配、任务调度&#xff0c;控制、协调并发活动。  嵌入式实时…...

预测性维护与传统维护成本对比:基于技术架构的量化分析

在工业 4.0 的技术演进浪潮中&#xff0c;设备维护模式正经历从经验驱动向数据驱动的变革。传统维护模式依赖固定周期巡检与故障后抢修&#xff0c;犹如 “蒙眼驾车”&#xff1b;而预测性维护借助物联网&#xff08;IoT&#xff09;、机器学习&#xff08;ML&#xff09;等技术…...

定位理论第一法则在医疗AI编程中的应用

引言 定位理论的核心在于通过明确目标、界定边界和建立差异化优势来占据用户心智中的独特位置。在医疗AI领域,定位理论的应用尤为重要,尤其是在医疗AI编程中,如何通过科学的定位确保技术与医疗本质的深度协同,而非技术主导的颠覆,是一个需要深入探讨的课题。本研究将深入剖…...

【macOS常用快捷键】

以下是 macOS 最常用快捷键列表&#xff0c;按使用频率由高到低分类整理&#xff0c;涵盖日常操作、效率工具及系统控制&#xff0c;助你快速提升使用效率&#xff1a; 一、基础高频操作 快捷键功能说明Command C复制选中内容Command V粘贴Command X剪切Command Z撤销上一…...

【Flask】ORM模型以及数据库迁移的两种方法(flask-migrate、Alembic)

ORM模型 在Flask中&#xff0c;ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;模型是指使用面向对象的方式来操作数据库的编程技术。它允许开发者使用Python类和对象来操作数据库&#xff0c;而不需要直接编写SQL语句。 核心概念 1. ORM模型…...

信息安全导论 第八章 入侵检测技术

目录 一、入侵检测系统概述 二、入侵检测技术 三、入侵检测系统实例 1. Snort简介 2. Snort架构 3. Snort规则示例 4. 检测流程 四、入侵防御系统 1. IPS vs. IDS 2. IPS分类 3. IPS核心技术 4. IPS优势 5.总结 一、入侵检测系统概述 定义 检测、识别和隔离对系统…...

每日c/c++题 备战蓝桥杯(P1886 滑动窗口 /【模板】单调队列)

洛谷P1886 滑动窗口【模板】单调队列详解 题目描述 给定一个长度为n的整数序列&#xff0c;要求输出所有长度为k的连续子数组的&#xff1a; 最小值&#xff08;第一部分输出&#xff09;最大值&#xff08;第二部分输出&#xff09; 数据范围&#xff1a; 1 ≤ k ≤ n ≤…...

GStreamer开发笔记(三):测试gstreamer/v4l2+sdl2/v4l2+QtOpengl打摄像头延迟和内存

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/147714800 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、O…...

Level DB --- MergingIterator

MergingIterator 是 Level DB中重要的类&#xff0c;在某一个level做多个file数据Compaction的时候&#xff0c;这多个file之间数据如何高效的组织和比较&#xff0c;这个时候用到了MergingIterator。 关键member & member function MergingIterator继承了Iterator&#…...

第六章 流量特征分析-蚁剑流量分析(玄机靶场系列)

先分享几个在Wireshark中好用的几个指令&#xff1a; 显示 POST 请求&#xff1a;http.request.method "POST"&#xff0c;用于显示所有 POST 请求的 HTTP 数据包。显示 GET 请求&#xff1a;http.request.method "GET"&#xff0c;仅显示包含 GET 请求…...

Redis数据结构ZipList,QuickList,SkipList

目录 1.ZipList 1.2.解析Entry&#xff1a; 1.3Encoding编码 1.4.ZipList连锁更新问题 2.QuickList SkipList跳表 RedisObject 五种数据类型 1.ZipList redis中的ZipList是一种紧凑的内存储存结构&#xff0c;主要可以节省内存空间储存小规模数据。是一种特殊的双端链表…...

Cordova开发自定义插件的方法

Cordova开发自定义插件的方法 文章目录 Cordova开发自定义插件的方法[TOC](文章目录) 一、自定义插件二、android下的自定义插件开发&#xff08;一&#xff09;步骤1、建立cordova工程2、建立自定义插件&#xff08;1&#xff09; 安装plugman&#xff08;2&#xff09; 用plu…...

Dify框架面试内容整理-如何评估基于Dify开发的AI应用的效果?

评估基于 Dify 开发的 AI 应用效果,需要从 用户体验、技术性能 与 业务价值 三个层面综合衡量。以下是详细的评估框架,涵盖三个关键点: 用户反馈与满意度...

基于python的哈希查表搜索特定文件

Python有hashlib库&#xff0c;支持多种哈希算法&#xff0c;比如MD5、SHA1、SHA256等。通常SHA256比较安全&#xff0c;但MD5更快&#xff0c;但可能存在碰撞风险&#xff0c;得根据自己需求决定。下面以SHA256做例。 import hashlib import os from typing import Dict, Lis…...

XZ03_Overleaf使用教程

一.Overleaf简介 Overleaf 是一款基于云端的 LaTeX 协作编辑平台&#xff0c;专为学术写作、技术文档和出版场景设计。以下从核心技术、功能特性、架构设计、应用场景、商业模式到未来发展趋势进行全方位解析&#xff0c;帮助您深度理解其核心价值与技术逻辑。 Overleaf 核心定…...

Ubuntu K8S(1.28.2) 节点/etc/kubernetes/manifests 不存在

Ubuntu K8S(1.28.2) 节点/etc/kubernetes/manifests 不存在 在查看日志&#xff08;journalctl -xefu kubelet&#xff09;时发现各节点/etc/kubernetes/manifests 不存在&#xff0c;但主节点没有异常 21080 file.go:104] "Unable to read config path" err"…...

【Linux网络#17】TCP全连接队列与tcpdump抓包

一、TCP 相关实验 测试 1. Listen 的第二个参数 LISTEN(2) Linux Programmers Manual NAMElisten - listen for connections on a socketSYNOPSIS#include <sys/types.h&g…...

JVM——Java对象的内存布局

Java对象的内存布局 在Java程序中&#xff0c;对象的内存布局是一个关键的底层概念。它不仅影响着对象的创建、使用和销毁的效率&#xff0c;也对垃圾回收、并发控制等机制有着深远的影响。下面我们将深入探讨Java对象的内存布局&#xff0c;包括对象的构成、内存分配、压缩指…...

USB资料摘录for后期,bus hound使用

一、STM32F105 USB调试:专家级错误分析与调试技巧: 在实时操作系统(RTOS)中进行USB调试时,开发者需要考虑任务调度、中断优先级和资源共享等问题。STM32F105在支持RTOS的环境中调试USB,应重点分析USB驱动与RTOS内核之间的交互,以及如何避免可能的竞态条件。 在商业级应用…...

防止交叉验证中的数据泄露:提升模型在实际环境中的性能

防止交叉验证中的数据泄露&#xff1a;提升模型在实际环境中的性能 你刚刚完成了一个机器学习模型的训练&#xff0c;其验证准确率达到了95%。交叉验证结果显示性能稳定&#xff0c;项目相关方对此表示认可&#xff0c;正准备将模型部署到生产环境。但是现实情况却令人沮丧——…...

Debezium TableSchemaBuilder详解

Debezium TableSchemaBuilder详解 1. 类的作用与功能 1.1 核心作用 TableSchemaBuilder是Debezium中负责构建表Schema的核心类,主要功能包括: Schema构建:将数据库表结构转换为Kafka Connect的Schema定义主键处理:生成表的主键Schema值Schema处理:生成表的非主键字段Sc…...

25:三大分类器原理

1.分类的逻辑&#xff1b; 2.统计学与数据分析。 ************************ Mlp 多层感知系统 GMM 高斯混合模型-极大似然估计法 SVM 支持向量机建立一个超平面作为决策曲面&#xff0c;使得正例和反例的隔离边界最大化 Knn 1.MLP整个模型就是这样子的&#xff0c;上面…...

osquery在网络安全入侵场景中的应用实战(二)

背景 上次写了osquery在网络安全入侵场景中的应用实战(一)结果还不错,这次篇目二再增加一些场景。osquery主要解决的时员工被入侵之后电脑该如何溯源取证的问题。通常EDR会有日志,但是不会上报全量的日志。发现机器有恶意文件需要上级取证的时候,往往是比较麻烦的,会有这…...

排序用法(Arrays.sort)

排序范围​​&#xff1a; 对 res 数组中索引从 ​​0到4​​ 的行进行排序&#xff08;因为结束索引5不包含&#xff09;相当于排序 res[0] 到 res[4] 这5行 ​​比较规则​​&#xff1a; o1 和 o2 是二维数组中的两行&#xff08;如 [8,2] 和 [6,7]&#xff09;o1[0] - o2[…...

2025年最新Linux的Redis主从集群搭建

一&#xff1a;概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的键值存储系统&#xff0c;通常被用作数据库、缓存或消息中间件。它以内存存储为主&#xff0c;支持多种数据结构&#xff0c;并具备持久化、高可用、分布式等特性&#xff0c;…...

Oracle OCP认证考试考点详解083系列09

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 41. 第41题&#xff1a; 题目 解析及答案&#xff1a; 关于应用程序容器&#xff0c;以下哪三项是正确的&#xff1f; A) 它可以包含单个…...

走出 Demo,走向现实:DeepSeek-VL 的多模态工程路线图

目录 一、引言&#xff1a;多模态模型的关键转折点 &#xff08;一&#xff09;当前 LMM 的三个关键挑战 1. 数据的真实性不足 2. 模型设计缺乏场景感知 3. 语言能力与视觉能力难以兼顾 &#xff08;二&#xff09;DeepSeek-VL 的根本出发点&#xff1a;以真实任务为锚点…...

Kotlin 作用域函数全解析:let、run、with、apply、also 应该怎么选?

Kotlin 提供了一套优雅的“作用域函数”&#xff08;Scope Functions&#xff09;&#xff0c;包括&#xff1a;let、run、with、apply 和 also。它们看起来相似&#xff0c;行为上也有交集&#xff0c;但却各有侧重。掌握它们的使用场景&#xff0c;不仅能让代码更简洁&#x…...

Python 矩阵运算:从理论到实践

Python 矩阵运算&#xff1a;从理论到实践 在数据分析、机器学习以及科学计算等诸多领域&#xff0c;矩阵运算均扮演着极为重要的角色。借助 Python 的 NumPy 库&#xff0c;我们可以便捷地实现各类矩阵运算。本文将深入探讨矩阵运算的数学原理&#xff0c;并通过实例演示如何…...

系统架构-层次式架构设计

层次式体系结构是最通用的架构&#xff0c;大部分的应用会分成表现层&#xff08;展示层&#xff09;、中间层&#xff08;业务层&#xff09;、数据访问层&#xff08;持久层&#xff09;和数据层 表现层架构设计 使用XML设计表现层 使用UIP框架设计表现层&#xff0c;UIP将…...

《Python星球日记》第29天:Flask进阶

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏:《Python星球日记》,限时特价订阅中ing 目录 一、重温 Flask 框架二、路由与视图1. 动态路由2. 路由装饰器三、模板渲染1. Jinja2 模板语法2.…...

Baklib知识中台:智能服务架构新实践

智能服务架构四库体系 Baklib 知识中台的核心竞争力源于其独创的四库体系架构设计。该体系通过知识资源库、业务场景库、智能模型库和服务规则库的有机联动&#xff0c;构建起覆盖知识全生命周期的管理闭环。其中&#xff0c;知识资源库依托自然语言处理技术实现多源异构数据的…...

CBAM透视镜:穿透软件架构成本迷雾的评估范式

文章目录 一、引言二、CBAM 基础理论2.1 CBAM 的定义与概念2.2 CBAM 的核心原理2.2.1 成本效益分析的基本逻辑2.2.2 定量化决策过程 2.3 CBAM 与其他软件架构评估方法的比较2.3.1 与 ATAM 对比2.3.2 与 SAAM 对比 三、CBAM 在软件架构中的应用流程3.1 确定评估目标3.2 列出架构…...

macbook install chromedriver

# 打开 Chrome 访问以下地址查看版本 chrome://version/# 终端查看版本号 (示例输出: 125.0.6422.113) /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version测试&#xff1a;...

Java 一战式学习指南,很详细

java基础 一、简介 1.1 JDK Java Develop Kit : Java的开发包&#xff0c;包含了Java的类库、执行Java所需的允许环境、各种开发辅助工具等... JDK 分为 Oracle JDK 和 Open JDK &#xff0c;Oracle JDK需要商业许可证&#xff0c;是收费的。Open JDK 则是免费的。 1.2 Ja…...

从零开始开发纯血鸿蒙应用之NAPI

从零开始开发纯血鸿蒙应用 〇、前言一、解耦良器——Adapter二、详学 NAPI1、注册自定义的 NAPI1.1、Index.d.ts1.2、napi_property_descriptor 数组 2、读取参数2.1、读取字符类型数据2.1、读取数字类型 3、封装返回值4、C/C 调用 ArkTS 方法5、自定义 C 类的透传 三、总结坑点…...

立夏三候:蝼蝈鸣,蚯蚓出,王瓜生

今&#xff08;5月5日&#xff09;天是立夏节气&#xff0c;尽管本“人民&#xff0b;体验官”已是最畏惧感到气喘吁吁这夏天气候之老龄人&#xff0c;但还是要推广人民日报官方微博文化产品《文化中国行看立夏节气》。 人民微博着重提示“立夏三候”三个方面&#xff1a;“一候…...

Nuxt3还能用吗?

Nuxt3还能用吗&#xff1f; 前一段时间&#xff0c;我完成了整个产品&#xff0c;从Nuxt到Next的迁移&#xff0c;因为面临了一些在框架层面就无法解决的问题。 payload json化 在所有的的Nuxt中&#xff0c;我们都能看到有这样一个东西。 其实有这个东西也很正常&#xff0…...

专业课复习笔记 4

前言 实际上对于我的考研来说&#xff0c;最重要的两门就是数学和专业课。所以从今天开始&#xff0c;我尽可能多花时间学习数学和专业课。把里面的知识和逻辑关系理解清楚&#xff0c;把常考的内容练习透彻。就这样。 寻址方式 立即数寻址 操作数在指令里面直接提供了。 …...

[人机交互]交互设计

零.本章的主要目标 本章主要目标总结 区分良与非良交互设计&#xff0c;突出产品可用性差异阐述交互设计与HCI及其他领域的关系解释可用性概念概述交互设计过程涉及的内容概述交互设计中所使用的指南形式从可用性目标和原理角度&#xff0c;评估并解释产品的成败 一.什么是交…...

LeetCode 热题 100 17. 电话号码的字母组合

LeetCode 热题 100 | 17. 电话号码的字母组合 大家好&#xff0c;今天我们来解决一道经典的算法题——电话号码的字母组合。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。下面我将详细讲解解…...