机器学习-KNN 算法
一.K-近邻(KNN)
- K-近邻(K-Nearest Neighbors, 简称 KNN)是一种基于实例的学习算法,主要用于分类和回归问题。KNN 的工作原理直观且简单,它基于相似性进行预测,也就是说给定一个新的数据点,KNN 算法会查找距离最近的 K 个数据点,然后通过这些邻居来确定新数据点的类别(在分类任务中)或数值(在回归任务中)。
KNN 的工作原理
-
选择 K 值:
- K 是算法中的一个超参数,表示在做出预测时要参考的最近邻居的数量。常见的取值是 3、5、7 等。
- K 值的选择直接影响模型性能。较小的 K 值使模型对局部噪声更敏感,而较大的 K 值则会使模型过于平滑,可能会错过局部模式。
-
计算距离:
- 常用的距离度量方式是欧几里得距离,也可以使用曼哈顿距离、闵可夫斯基距离等。
- 欧几里得距离公式:
d = ∑ i = 1 n ( x i − y i ) 2 d = \sqrt{\sum_{i=1}^{n} (x_i - y_i)^2} d=i=1∑n(xi−yi)2
其中,x 和 y 是两个数据点, n 是特征的数量。
-
确定最近的 K 个邻居:
- 根据计算得到的距离,选出距离最近的 K 个点作为邻居。
-
分类(对于分类问题):
- 在分类任务中,KNN 通过让 K 个最近邻居中的多数投票来决定新数据点的类别。
- 例如,如果在 K=5 的情况下,有 3 个邻居属于类别 A,2 个属于类别 B,那么预测结果将是类别 A。
-
回归(对于回归问题):
- 在回归任务中,KNN 通过计算 K 个最近邻居的平均值(或加权平均值)来预测新数据点的数值。
KNN 算法的优缺点
优点:
- 简单直观,易于理解和实现。
- 不需要训练阶段,属于“懒惰学习”(Lazy Learning),即模型在训练阶段几乎不做计算,预测时才进行计算。
- 可用于多类别分类问题。
缺点:
- 计算复杂度高:由于在预测时需要计算每个数据点与新数据点的距离,特别是在数据量大时,计算开销较大。
- 对数据的标度敏感:特征的不同标度(如度量单位不同)可能会影响距离计算,因此通常需要对数据进行标准化或归一化。
- 对噪声敏感:K 值较小时,噪声点可能会对结果产生较大影响。
适用场景
- 小数据集:由于 KNN 的计算开销较大,它更适合于小型数据集。
- 多类别分类:KNN 可以很好地处理多类别分类问题。
- 实例具有自然分组的情况:如果数据本身具有天然的分组或簇结构,KNN 能够很好地捕捉这些模式。
KNN 算法的代码示例(分类任务)
下面是一个简单的 KNN 分类任务代码示例:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score# 加载数据集
data = load_iris()
X = data.data
y = data.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 初始化KNN分类器,设置K=3
knn = KNeighborsClassifier(n_neighbors=3)# 训练模型
knn.fit(X_train, y_train)# 预测
y_pred = knn.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率: {accuracy}")
KNeighborsClassifier
参数详细解释
-
n_neighbors
:- 解释: 指定参与投票的最近邻居的数量,即 K 值。
- 类型: 整数。
- 默认值: 5。
- 作用: 决定了模型在分类时会考虑多少个最近邻居。例如,
n_neighbors=3
表示将选择距离最近的 3 个样本进行投票。 - 示例:
n_neighbors=3
-
weights
:- 解释: 决定如何计算每个邻居的投票权重。常见的选项有:
'uniform'
: 所有邻居的权重相等。'distance'
: 根据距离进行加权,距离越近的邻居权重越高。- 自定义函数:可以传入一个用户定义的函数,基于该函数计算权重。
- 类型: 字符串或可调用函数。
- 默认值:
'uniform'
。 - 作用: 影响分类决策。如果选择
'distance'
,那么更近的邻居对分类结果影响更大。 - 示例:
weights='distance'
- 解释: 决定如何计算每个邻居的投票权重。常见的选项有:
-
algorithm
:- 解释: 用于计算最近邻居的算法,有以下几种选择:
'auto'
: 自动选择最合适的算法(根据数据的特征选择)。'ball_tree'
: 使用 Ball Tree 数据结构,适合高维数据。'kd_tree'
: 使用 KD Tree 数据结构,适合低维数据。'brute'
: 直接进行暴力搜索,计算所有点的距离。
- 类型: 字符串。
- 默认值:
'auto'
。 - 作用: 控制最近邻居搜索的速度和内存效率,通常建议使用默认的
'auto'
选项。 - 示例:
algorithm='kd_tree'
- 解释: 用于计算最近邻居的算法,有以下几种选择:
-
leaf_size
:- 解释: 指定 Ball Tree 或 KD Tree 的叶子节点大小,影响树的构建和查询速度。较小的叶子节点通常会带来更快的查询速度,但会消耗更多的内存。
- 类型: 整数。
- 默认值: 30。
- 作用: 在使用
'ball_tree'
或'kd_tree'
算法时,可以调整该值以优化查询性能。 - 示例:
leaf_size=20
-
p
:- 解释: 当使用
minkowski
距离度量时,定义了距离公式中的幂指数:- 当
p=1
时,使用曼哈顿距离(L1)。 - 当
p=2
时,使用欧几里得距离(L2)。
- 当
- 类型: 整数。
- 默认值: 2。
- 作用: 控制距离的计算方式,可以根据数据特性调整该参数。
- 示例:
p=1
(使用曼哈顿距离)
- 解释: 当使用
-
metric
:- 解释: 指定距离度量的方式。常用选项有:
'minkowski'
: 闵可夫斯基距离,是欧几里得距离和曼哈顿距离的泛化形式。'euclidean'
: 欧几里得距离,等同于minkowski
距离与p=2
的组合。'manhattan'
: 曼哈顿距离,等同于minkowski
距离与p=1
的组合。- 其他度量方法如
'chebyshev'
或自定义距离函数。
- 类型: 字符串或可调用函数。
- 默认值:
'minkowski'
。 - 作用: 控制如何计算样本之间的距离,影响最近邻居的选择。
- 示例:
metric='euclidean'
- 解释: 指定距离度量的方式。常用选项有:
-
metric_params
:- 解释: 距离度量函数的附加参数(可选)。如果使用自定义的距离函数,可以通过这个参数传递额外信息。
- 类型: 字典或
None
。 - 默认值:
None
。 - 作用: 用于在自定义度量函数时,提供额外的控制参数。
- 示例:
metric_params={'w': [1, 2, 3]}
(示例自定义权重)
-
n_jobs
:- 解释: 用于并行处理最近邻居搜索的线程数量。如果设置为
-1
,则使用所有可用的 CPU 核心进行计算。 - 类型: 整数。
- 默认值:
None
(使用单个 CPU 核心)。 - 作用: 在大数据集上可以使用多线程加速计算,缩短模型训练和预测时间。
- 示例:
n_jobs=-1
- 解释: 用于并行处理最近邻居搜索的线程数量。如果设置为
二.K-折交叉验证
K-折交叉验证(K-Fold Cross-Validation)是一种常用的模型评估方法,广泛用于机器学习中。它通过将数据集划分为 K 个相同大小的子集(称为“折”),来多次训练和测试模型,从而获得更稳定和可靠的性能评估。
工作原理
-
划分数据集:
- 将整个数据集随机划分成 K 个等大小的子集。每个子集称为一个“折”。
-
训练和验证:
- 在每次迭代中,选择其中一个折作为验证集,剩余的 K-1 个折作为训练集。
- 这个过程会重复 K 次,每次选择不同的折作为验证集,其余折作为训练集。
-
计算平均性能:
- 每次迭代都会得到一个模型的性能度量(如准确率、F1 分数等)。最终将 K 次迭代的性能结果进行平均,得到整体的模型性能。
优点
- 稳定的性能评估: 通过多次迭代,K-折交叉验证减小了模型评估中的随机性,得到的结果更具稳定性。
- 充分利用数据: 每一个样本都在不同的折中被用作训练和验证集,避免了数据浪费。
参数选择
- K 的取值: K 通常取值为 5 或 10,这两种配置在大多数应用中效果较好。较小的 K 值(如 2 或 3)会导致较大的方差,而较大的 K 值(如 20)则增加了计算开销。
- Shuffle(可选): 在划分数据集之前,可以选择对数据进行洗牌(shuffle),以确保每个折的样本分布更随机。
代码示例
下面是一个使用 scikit-learn 实现 K-折交叉验证的示例:
from sklearn.model_selection import KFold
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import numpy as np# 加载数据集
data = load_iris()
X = data.data
y = data.target# 初始化K折交叉验证
kf = KFold(n_splits=5, shuffle=True, random_state=42)# 存储每折的准确率
accuracies = []# 执行交叉验证
for train_index, test_index in kf.split(X):X_train, X_test = X[train_index], X[test_index]y_train, y_test = y[train_index], y[test_index]# 初始化并训练模型model = LogisticRegression(max_iter=200)model.fit(X_train, y_train)# 预测并计算准确率y_pred = model.predict(X_test)accuracy = accuracy_score(y_test, y_pred)accuracies.append(accuracy)# 输出结果
print(f"每折的准确率: {accuracies}")
print(f"平均准确率: {np.mean(accuracies)}")
解释
-
KFold(n_splits=5, shuffle=True, random_state=42)
:n_splits=5
指定将数据集划分为 5 个折。shuffle=True
表示在分割数据之前打乱数据,以确保每个折的样本分布更加随机。random_state=42
确保结果的可重复性。
-
kf.split(X)
:- 生成训练集和测试集的索引。对于每一折,都会用不同的折作为测试集。
三.分层k-折交叉验证(Stratified k-fold)
StratifiedKFold
参数
-
n_splits
:- 解释: 指定将数据集划分成多少个折(子集)。
- 类型: 整数。
- 默认值: 5。
- 示例:
n_splits=5
表示数据将被分成 5 个折。
-
shuffle
:- 解释: 指定是否在分割之前对数据进行洗牌(打乱顺序)。如果为
True
,则在分割数据之前会对数据进行打乱,减少样本顺序对模型评估的影响。 - 类型: 布尔值。
- 默认值:
False
。 - 示例:
shuffle=True
表示在分割之前打乱数据。
- 解释: 指定是否在分割之前对数据进行洗牌(打乱顺序)。如果为
-
random_state
:- 解释: 用于控制随机数生成器的种子,确保结果的可重复性。当
shuffle=True
时使用。 - 类型: 整数或
None
。 - 默认值:
None
。 - 示例:
random_state=42
确保在每次运行时数据划分的一致性。
- 解释: 用于控制随机数生成器的种子,确保结果的可重复性。当
-
min_groups
(仅在 scikit-learn 版本 0.24 及以后版本中可用):- 解释: 用于指定每个折中样本的最小组数。主要用于对分层 K-折交叉验证的样本量进行控制,确保每一折中至少有指定数量的组。
- 类型: 整数。
- 默认值: 1。
- 示例:
min_groups=5
表示每个折中至少包含 5 个组。
使用示例
from sklearn.model_selection import StratifiedKFold
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import numpy as np# 加载数据集
data = load_iris()
X = data.data
y = data.target# 初始化分层K折交叉验证
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)# 存储每折的准确率
accuracies = []# 执行交叉验证
for train_index, test_index in skf.split(X, y):X_train, X_test = X[train_index], X[test_index]y_train, y_test = y[train_index], y[test_index]# 初始化并训练模型model = LogisticRegression(max_iter=200)model.fit(X_train, y_train)# 预测并计算准确率y_pred = model.predict(X_test)accuracy = accuracy_score(y_test, y_pred)accuracies.append(accuracy)# 输出结果
print(f"每折的准确率: {accuracies}")
print(f"平均准确率: {np.mean(accuracies)}")
四.模型与加载
在 scikit-learn 中,保存和加载模型通常使用 joblib
或 pickle
。joblib
是 scikit-learn 推荐的方式,因为它在处理大型模型(如包含大量数组的模型)时效率更高。
1. 使用 joblib
保存和加载模型
模型保存
import joblib# 保存模型到文件
joblib.dump(knn, 'knn_model.pkl')
模型加载
# 从文件加载模型
loaded_model = joblib.load('knn_model.pkl')# 使用加载的模型进行预测
y_pred = loaded_model.predict(X_test)
2. 使用 pickle
保存和加载模型
模型保存
import pickle# 保存模型到文件
with open('knn_model.pkl', 'wb') as file:pickle.dump(knn, file)
模型加载
# 从文件加载模型
with open('knn_model.pkl', 'rb') as file:loaded_model = pickle.load(file)# 使用加载的模型进行预测
y_pred = loaded_model.predict(X_test)
总结
joblib
更适合包含大量数组的模型。pickle
适用于一般情况下的模型保存和加载。
五.超参数搜索
- 超参数搜索(Hyperparameter Tuning)是机器学习模型优化的重要步骤。不同的超参数配置会对模型的性能产生显著影响,因此找到最优的超参数组合对于提升模型性能至关重要。
class sklearn.model_selection.GridSearchCV(estimator, param_grid)
说明:
同时进行交叉验证(CV)、和网格搜索(GridSearch),GridSearchCV实计上也是一个估计器(estimator),同时它有几个重要属性:
best_params_ 最佳参数
best_score_ 在训练集中的准确率
best_estimator_ 最佳估计器
cv_results_ 交叉验证过程描述
best_index_最佳k在列表中的下标
完整示例代码
# best_params_ 最佳参数# best_score_ 在训练集中的准确率# best_estimator_ 最佳估计器# cv_results_ 交叉验证过程描述# best_index_最佳k在列表中的下标from sklearn.datasets import load_wine
from sklearn.preprocessing import StandardScaler #标准化
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier #KNN
from sklearn.model_selection import GridSearchCV #超参数GridSearchCV
from sklearn.decomposition import PCA #PCA降维
import pandas as pddata = load_wine()#数据结构
x = pd.DataFrame(data.data,columns=data.feature_names)#标准化
tr = StandardScaler()
x2 = tr.fit_transform(x)#数据结构
data2 = pd.DataFrame(x2,columns=data.feature_names)#PCA降维
transfer1 = PCA(n_components=0.5)
data2 = transfer1.fit_transform(data2)x_train,x_test,y_train,y_test = train_test_split(data2,data.target,test_size=0.2,random_state=33)#创建模型
param = {'n_neighbors':[1,2,3,4,5,6,7,8,9,10]}#knn
model = KNeighborsClassifier()
model = GridSearchCV(model,param)
model.fit(x_train,y_train)#预测
predict = model.predict(x_test)score = model.score(x_test,y_test)print("最佳模型:", model.best_estimator_)
print("最佳参数:\n",model.best_params_)
print("最佳k在列表中的下标:\n",model.best_index_)
print("在训练集中的准确率:\n",model.best_score_)
print("最佳估计器:\n",model.best_estimator_)
print("交叉验证过程描述:\n",model.cv_results_)
总结
best_params_
:最优的超参数组合。best_score_
:在交叉验证中的最佳平均得分。best_estimator_
:使用最佳超参数组合训练的模型。cv_results_
:交叉验证过程中所有超参数组合的详细结果。best_index_
:最优超参数组合在结果中的索引。
这些属性为你提供了全面的模型优化信息,帮助你选择和评估最佳模型。
实例:葡萄酒–分层k-折交叉验证
from sklearn.datasets import load_wine
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.model_selection import StratifiedKFold
import pandas as pd
import numpy as np
#加载数据
data = load_wine()X = pd.DataFrame(data=data.data,columns=data.feature_names)#标准化
transfer = StandardScaler()
X1 = transfer.fit_transform(X)
X2 = pd.DataFrame(X1,columns=data.feature_names)#降维
transfer1 = PCA(n_components=0.5)
data1 = transfer1.fit_transform(X2)#分层k-折交叉验证Stratified k-fold
skf = StratifiedKFold(n_splits=10,shuffle=True,random_state=2)#储存每折准确率
accuracies = []for train_index,test_index in skf.split(data1,data.target):x_train,x_test = data1[train_index],data1[test_index]y_train,y_test = data.target[train_index],data.target[test_index]#K近邻模型estimator = KNeighborsClassifier(n_neighbors=9)estimator.fit(x_train,y_train)#预测y_predict = estimator.predict(x_test)# print("y_predict:\n",y_test ==y_predict)#计算准确率score = estimator.score(x_test,y_test)accuracies.append(score)print(accuracies)
print(np.mean(accuracies))
实例2 葡萄酒–K-折交叉验证(K-fold)
from sklearn.datasets import load_wine
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import KFold
from sklearn.neighbors import KNeighborsClassifier
from sklearn.decomposition import PCA
import pandas as pd
import joblibdata = load_wine()x = pd.DataFrame(data.data,columns=data.feature_names)#标准化
sta = StandardScaler()
x1 = sta.fit_transform(x)x2 = pd.DataFrame(x1,columns=data.feature_names)#降维
tra = PCA(n_components=0.6)data1 = tra.fit_transform(x2)kf = KFold(n_splits=10,shuffle=True,random_state=33)
#标准化
accuracies =[]
best_accuracy = 0
best_model = Nonefor train_index,test_index in kf.split(data1,data.target):x_train,x_test = data1[train_index],data1[test_index]y_train,y_test = data.target[train_index],data.target[test_index]#创建模型model = KNeighborsClassifier(n_neighbors=7)model.fit(x_train,y_train)#预测predict = model.predict(x_test)#准确率score = model.score(x_test,y_test)accuracies.append(score)if score > best_accuracy:best_accuracy = scorebest_model = model# print("模型评估率:\n",accuracies)
# print("平均得分:\n",np.mean(accuracies))joblib.dump(best_model,'./src/KNNmodel.pkl')
# 输出结果
print(f"每折的准确率: {accuracies}")
print(f"最高准确率: {best_accuracy}")
实例:mytool 函数的功能
mytool 函数的功能是计算一个文本数据集中每个词的 TF-IDF 值。TF-IDF 是一种常用的文本挖掘方法,用于衡量一个词在文档中的重要性。
import math
from collections import defaultdict def calculate_tfidf(data): total_documents = len(data) word_document_count = defaultdict(int) # 统计每个词在文档中出现的次数 for document in data: unique_words = set(document.split()) for word in unique_words: word_document_count[word] += 1 tfidf_matrix = [] # 计算每个文档的TF-IDF for document in data: word_list = document.split() total_words = len(word_list) tfidf_scores = [] for word in set(word_list): TF = word_list.count(word) / total_words IDF = math.log(total_documents / (1 + word_document_count[word])) tfidf_scores.append(TF * IDF) tfidf_matrix.append(tfidf_scores) return tfidf_matrix # 示例使用
data = ['世界 你好 我 是 华清 远见 的 张三','你好 世界 我 是 李四 世界','华清 远见 666'
] result = calculate_tfidf(data)
print(result)
相关文章:

机器学习-KNN 算法
一.K-近邻(KNN) K-近邻(K-Nearest Neighbors, 简称 KNN)是一种基于实例的学习算法,主要用于分类和回归问题。KNN 的工作原理直观且简单,它基于相似性进行预测,也就是说给定一个新的数据点,KNN 算法会查找距…...

【Linux】如何快速查看 linux 服务器有几个cpu
如何快速查看 linux 服务器有几个cpu author: jayzhen date: 2024.08.22 文章目录 如何快速查看 linux 服务器有几个cpu1. 使用lscpu命令2. 使用nproc命令3. 使用/proc/cpuinfo文件4. 使用top或htop命令结论 在Linux服务器上,你可以通过多种方式快速查看系统中有几个…...

[数据集][目标检测]电力场景轭式悬架锈蚀分类数据集6351张2类别
数据集格式:仅仅包含jpg图片,每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数):6351 分类类别数:2 类别名称[corrosion,good] 每个类别图片数: corrosion 图片数:310 good 图片数:6041 …...

【嵌入式linux开发】智能家居入门5:老版ONENET,多协议接入(QT、微信小程序、HTTP协议、ONENET云平台、旭日x3派)
智能家居入门5(QT、微信小程序、HTTP协议、ONENET云平台、旭日x3派) 前言一、QT界面设计二、云平台产品创建与连接三、下位机端QT代码总览:四、微信小程序端代码总览五、板端测试 前言 前四篇智能家居相关文章都是使用STM32作为主控…...

软考-软件设计师(程序设计语言习题)
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...

「C++系列」vector 容器
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能教程 文章目录 一、vector 容器1. 基本特性2. 基本操作3. 注意事项 二、应用场景1. 应用场景2. 案例案例一࿱…...

梯度的概念
梯度 机器学习中,梯度下降法,牛顿法都会用到梯度概念 对于一元函数,梯度可以看成导数 对于多元函数,梯度可以看成偏导数 如果多元函数包含N个自变量: x 1 , x 2 , . . . , x n x_1, x_2, ..., x_n x1,x2,...,x…...

低代码开发:机遇与挑战并存的技术革新
近年来,随着数字化转型的加速,低代码开发平台如雨后春笋般涌现,承诺让非专业人士也能快速构建应用程序。这种新兴技术正在挑战传统软件开发模式,引发了IT行业的广泛讨论。低代码平台是提高效率的利器,还是降低了编程门…...

Linux之RabbitMQ集群部署
RabbitMQ 消息中间件 1、消息中间件 消息(message): 指在服务之间传送的数据。可以是简单的文本消息,也可以是包含复杂的嵌入对象的消息 消息队列(message queue): 指用来存放消息的队列,一般采用先进先出的队列方式,即最先进入的…...

【JAVA CORE_API】Day19 多线程API(2)、多线程并发安全问题、同步
多线程API 进程和线程 进程:进程就像是一个程序在电脑里运行时的一个实例。你可以把它想象成一个独立的小工人,专门负责完成某项任务(比如打开浏览器、播放音乐)。每个进程都有自己独立的资源(比如内存)和…...

最新Windows 11 23H2精简版,免费获取!稳定流畅!
今日,系统之家小编给大家带来了2024最新的Windows11 23H2精简版系统,该版本系统经过适度地优化与精简,保留大部分功能,完全能满足日常使用需求,兼容性非常出色,无需担心应用程序出现闪退问题。大家可以通过…...

PostgreSQL SELECT 语句:深入解析与实例应用
PostgreSQL SELECT 语句:深入解析与实例应用 PostgreSQL 是一款功能强大的开源关系数据库管理系统,它以稳定性、可靠性以及支持高级功能而著称。在 PostgreSQL 中,SELECT 语句是最基本也是最重要的查询语句之一,用于从数据库表中检索数据。本文将详细介绍 SELECT 语句的用…...

【自然语言处理】 构建文本对话系统
构建文本对话系统的框架如下: 根据聊天系统目的功用的不同,可分成三大类型: 闲聊式机器人:较有代表性的有微软小冰、微软小娜、苹果的 Siri、小 i 机器人等,主要以娱乐为目的。 **知识问答型机器人:**知识…...

java: 程序包org.slf4j不存在
当在Java项目中遇到“程序包org.slf4j不存在”的错误时,这通常意味着你的项目没有正确地包含SLF4J(Simple Logging Facade for Java)的库。SLF4J是一个Java的日志门面(Facade),它允许你在后端使用不同的日志…...

图片转PDF怎么转?教你3种快捷方便的jpg转pdf方法
图片文件以及PDF文档已经是我们工作当中不可或缺的一部分,我们在一些商务合作的场景下经常需要把拍摄下来的合同、企划书、画册等图片内容转换为PDF格式后再发送,这样能够极大程度的保证文件的安全性,那么图片应该如何转换成PDF文件呢?今天来…...

数据防泄密软件如何防止数据泄密?七大措施筑起数据安全壁垒
数据防泄密软件通过集成多种安全防护技术,旨在全面保护企业数据的安全性和保密性。以安企神软件为例,其实现全面防泄密的方式主要包括以下7个方面,为企业筑起数据安全壁垒。 1. 透明加密技术 安企神软件采用先进的透明加密技术,确…...

GNU/Linux - systemd介绍
systemd官网: System and Service Manager systemd systemd Github地址: https://github.com/systemd/systemd 首次发布 2010年3月30日 System and Service Manager systemd 是一套 Linux 系统的基本构件。它提供了一个系统和服务管理器,作为…...

如何理解递归
在二叉树的题目中,我们难免会用到递归方法,递归思想很简单,但运用起来却因为抽象而难以理解。 理解递归的关键在于认识到它是一种解决问题的方法,允许函数直接或间接地调用自身。以下是对递归的概述以及如何理解它的几个要点&…...

Spring Cache sync属性
在Spring Cache中,Cacheable注解用于标记一个方法,使其返回值可以被缓存。sync属性是Spring 4.3引入的一个新特性,用于控制缓存的同步行为。 sync 属性 sync属性的默认值是false,表示异步缓存。如果将sync设置为true,…...

【Unity】通用GM QA工具 运行时数值修改 命令行 测试工具
GM工具使用: GM工具通常用于游戏运行时修改数值(加钱/血量)、解锁关卡等,用于快速无死角测试游戏。一个通用型GM工具对于游戏项目是非常实用且必要的,但通用不能向易用妥协,纯命令行GM门槛太高,对QA不友好。 这类运行时命令行工具…...

[Spring] Spring原理(SpringBoot完结)
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...

python | rq,一个无敌的 关于Redis 的Python 库!
本文来源公众号“python”,仅用于学术分享,侵权删,干货满满。 原文链接:rq,一个无敌的 Python 库! 大家好,今天为大家分享一个无敌的 Python 库 - rq。 Github地址:https://githu…...

Redis的缓存淘汰策略
1. 查看Redis 最大的占用内存 打开redis配置文件, 设置maxmemory参数,maxmemory 是bytes字节类型, 注意转换 2. Redis默认内存多少可以用 注意: 在64bit系统下, maxmemory 设置为 0 表示不限制Redis内存使用 3. 一般生产上如何配置 一般推荐Redis 设置内…...

【C++】深度解析:用 C++ 模拟实现 priority_queue类,探索其底层实现细节(仿函数、容器适配器)
目录 ⭐前言 ✨堆 ✨容器适配器 ✨仿函数 ⭐priority_queue介绍 ⭐priority_queue参数介绍 ⭐priority_queue使用 ⭐priority_queue实现 ✨仿函数实现 ✨堆的向上调整和向下调整 ✨完整代码 ⭐前言 ✨堆 堆是一种特殊的树形数据结构,通常以二叉树的…...

1个人躲,5个人抓!《极限竞速:地平线5》全新游戏模式“捉迷藏”即将推出
风靡全球的赛车竞速游戏《极限竞速:地平线5》即将推出全新游戏模式——捉迷藏(Hide & Seek)。 《极限竞速:地平线5》日前发布了全新预告,展示了即将于 9 月 10 日推出的捉迷藏模式游戏玩法。该预告是日前举办的2024 年科隆国际游戏展 Xb…...

ARCGIS XY坐标excel转要素面
1、准备好excel 坐标 excel文件转为csv才能识别,CSV只能保留第一个工作表并且,不会保留格式。 2、在ArcGis中导入XY事件图层 创建XY事件图层 图层要素赋对象ID 将导入的图层导出为先新的图层,这样就给每个要素附加了唯一的值 选择点集转线…...

MyBatis源码系列3(解析配置文件,创建SqlSessionFactory对象)
创建SqlSessionFactory; 首先读取配置文件,使用构造者模式创建SqlSessionFactory对象。 InputStream inputStream Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder…...

企业级web应用服务器tomcat
目录 一、Web技术 1.1 HTTP协议和B/S 结构 1.2 前端三大核心技术 1.2.1 HTML 1.2.2 CSS(Cascading Style Sheets)层叠样式表 1.2.3 JavaScript 二、tomcat的功能介绍 2.1 安装 tomcat 环境准备 2.1.1 安装java环境 2.1.2 安装并启动tomcat …...

深入浅出,探讨IM(即时通讯-聊天工具)技术架构及用户界面设计
在数字化时代的浪潮中,即时通讯(IM)工具已然成为人们日常沟通的重要方式。从微信、QQ到飞信钉、喧喧IM、企业微信、钉钉、Slack,这些IM工具不仅为我们提供了便捷的沟通方式,更在技术架构和用户界面设计上展现了独特的魅…...

小米、友邦带领恒指大反攻!
港股三大指数反弹止步2连跌,恒生科技指数一度冲高至2%,恒指收涨1.44%。盘面上,大型科技股多数表现活跃,业绩超预期,小米大涨超8%表现尤其抢眼,京东涨约4%,百度涨1.71%,网易涨2.14%&a…...