机器学习-KNN 算法

一.K-近邻(KNN)

  • K-近邻(K-Nearest Neighbors, 简称 KNN)是一种基于实例的学习算法,主要用于分类和回归问题。KNN 的工作原理直观且简单,它基于相似性进行预测,也就是说给定一个新的数据点,KNN 算法会查找距离最近的 K 个数据点,然后通过这些邻居来确定新数据点的类别(在分类任务中)或数值(在回归任务中)。

KNN 的工作原理

  1. 选择 K 值

    • K 是算法中的一个超参数,表示在做出预测时要参考的最近邻居的数量。常见的取值是 3、5、7 等。
    • K 值的选择直接影响模型性能。较小的 K 值使模型对局部噪声更敏感,而较大的 K 值则会使模型过于平滑,可能会错过局部模式。
  2. 计算距离

    • 常用的距离度量方式是欧几里得距离,也可以使用曼哈顿距离、闵可夫斯基距离等。
    • 欧几里得距离公式:
      d = ∑ i = 1 n ( x i − y i ) 2 d = \sqrt{\sum_{i=1}^{n} (x_i - y_i)^2} d=i=1n(xiyi)2

    其中,x 和 y 是两个数据点, n 是特征的数量。

  3. 确定最近的 K 个邻居

    • 根据计算得到的距离,选出距离最近的 K 个点作为邻居。
  4. 分类(对于分类问题)

    • 在分类任务中,KNN 通过让 K 个最近邻居中的多数投票来决定新数据点的类别。
    • 例如,如果在 K=5 的情况下,有 3 个邻居属于类别 A,2 个属于类别 B,那么预测结果将是类别 A。
  5. 回归(对于回归问题)

    • 在回归任务中,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 参数详细解释

  1. n_neighbors:

    • 解释: 指定参与投票的最近邻居的数量,即 K 值。
    • 类型: 整数。
    • 默认值: 5。
    • 作用: 决定了模型在分类时会考虑多少个最近邻居。例如,n_neighbors=3 表示将选择距离最近的 3 个样本进行投票。
    • 示例: n_neighbors=3
  2. weights:

    • 解释: 决定如何计算每个邻居的投票权重。常见的选项有:
      • 'uniform': 所有邻居的权重相等。
      • 'distance': 根据距离进行加权,距离越近的邻居权重越高。
      • 自定义函数:可以传入一个用户定义的函数,基于该函数计算权重。
    • 类型: 字符串或可调用函数。
    • 默认值: 'uniform'
    • 作用: 影响分类决策。如果选择 'distance',那么更近的邻居对分类结果影响更大。
    • 示例: weights='distance'
  3. algorithm:

    • 解释: 用于计算最近邻居的算法,有以下几种选择:
      • 'auto': 自动选择最合适的算法(根据数据的特征选择)。
      • 'ball_tree': 使用 Ball Tree 数据结构,适合高维数据。
      • 'kd_tree': 使用 KD Tree 数据结构,适合低维数据。
      • 'brute': 直接进行暴力搜索,计算所有点的距离。
    • 类型: 字符串。
    • 默认值: 'auto'
    • 作用: 控制最近邻居搜索的速度和内存效率,通常建议使用默认的 'auto' 选项。
    • 示例: algorithm='kd_tree'
  4. leaf_size:

    • 解释: 指定 Ball Tree 或 KD Tree 的叶子节点大小,影响树的构建和查询速度。较小的叶子节点通常会带来更快的查询速度,但会消耗更多的内存。
    • 类型: 整数。
    • 默认值: 30。
    • 作用: 在使用 'ball_tree''kd_tree' 算法时,可以调整该值以优化查询性能。
    • 示例: leaf_size=20
  5. p:

    • 解释: 当使用 minkowski 距离度量时,定义了距离公式中的幂指数:
      • p=1 时,使用曼哈顿距离(L1)。
      • p=2 时,使用欧几里得距离(L2)。
    • 类型: 整数。
    • 默认值: 2。
    • 作用: 控制距离的计算方式,可以根据数据特性调整该参数。
    • 示例: p=1(使用曼哈顿距离)
  6. metric:

    • 解释: 指定距离度量的方式。常用选项有:
      • 'minkowski': 闵可夫斯基距离,是欧几里得距离和曼哈顿距离的泛化形式。
      • 'euclidean': 欧几里得距离,等同于 minkowski 距离与 p=2 的组合。
      • 'manhattan': 曼哈顿距离,等同于 minkowski 距离与 p=1 的组合。
      • 其他度量方法如 'chebyshev' 或自定义距离函数。
    • 类型: 字符串或可调用函数。
    • 默认值: 'minkowski'
    • 作用: 控制如何计算样本之间的距离,影响最近邻居的选择。
    • 示例: metric='euclidean'
  7. metric_params:

    • 解释: 距离度量函数的附加参数(可选)。如果使用自定义的距离函数,可以通过这个参数传递额外信息。
    • 类型: 字典或 None
    • 默认值: None
    • 作用: 用于在自定义度量函数时,提供额外的控制参数。
    • 示例: metric_params={'w': [1, 2, 3]}(示例自定义权重)
  8. n_jobs:

    • 解释: 用于并行处理最近邻居搜索的线程数量。如果设置为 -1,则使用所有可用的 CPU 核心进行计算。
    • 类型: 整数。
    • 默认值: None(使用单个 CPU 核心)。
    • 作用: 在大数据集上可以使用多线程加速计算,缩短模型训练和预测时间。
    • 示例: n_jobs=-1

二.K-折交叉验证

K-折交叉验证(K-Fold Cross-Validation)是一种常用的模型评估方法,广泛用于机器学习中。它通过将数据集划分为 K 个相同大小的子集(称为“折”),来多次训练和测试模型,从而获得更稳定和可靠的性能评估。

工作原理

  1. 划分数据集:

    • 将整个数据集随机划分成 K 个等大小的子集。每个子集称为一个“折”。
  2. 训练和验证:

    • 在每次迭代中,选择其中一个折作为验证集,剩余的 K-1 个折作为训练集。
    • 这个过程会重复 K 次,每次选择不同的折作为验证集,其余折作为训练集。
  3. 计算平均性能:

    • 每次迭代都会得到一个模型的性能度量(如准确率、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 参数

  1. n_splits:

    • 解释: 指定将数据集划分成多少个折(子集)。
    • 类型: 整数。
    • 默认值: 5。
    • 示例: n_splits=5 表示数据将被分成 5 个折。
  2. shuffle:

    • 解释: 指定是否在分割之前对数据进行洗牌(打乱顺序)。如果为 True,则在分割数据之前会对数据进行打乱,减少样本顺序对模型评估的影响。
    • 类型: 布尔值。
    • 默认值: False
    • 示例: shuffle=True 表示在分割之前打乱数据。
  3. random_state:

    • 解释: 用于控制随机数生成器的种子,确保结果的可重复性。当 shuffle=True 时使用。
    • 类型: 整数或 None
    • 默认值: None
    • 示例: random_state=42 确保在每次运行时数据划分的一致性。
  4. 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 中,保存和加载模型通常使用 joblibpicklejoblib 是 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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/52154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JUC知识点总结

JUC应用场景 1. 网页服务器处理并发请求 当一个网页服务器需要处理大量并发请求时,可以使用多线程来提高处理效率。 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; ​ public class WebServer {public static void main(S…

8月21日笔记

Frp Frp(Fast e Reverse ) Proxy) 是一款简单,好用,稳定的隧道工具。Frp 使用 Go语言开发,支持跨平台,仅需下载对应平台的二进制文件即可执行,没有额外依赖。它是一款高性能的反向代理应用,可以轻松地进行…

Spring DI 数据类型—— set 方法注入

首先新建项目&#xff0c;可参考 初识IDEA、模拟三层--控制层、业务层和数据访问层 一、spring 环境搭建 &#xff08;一&#xff09;pom.xml 导相关坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.or…

http连接未释放导致生产故障

凌晨4点运维老大收到报警&#xff08;公司官网页面超时&#xff0c;上次故障因为运维修改nginx导致官网域名下某些接口不可用后&#xff0c;运维在2台nginx服务器上放了检测程序&#xff0c;检测官网页面&#xff09;&#xff0c;运维自己先看了看服务器相关配置&#xff0c;后…

Java实现STL中的全排列函数next_permutation()

目录 一、引言 二、全排列函数next_permutation() 三、next_permutation()的使用 四、Java实现next_permutation() 五、使用next_permutation()实现全排列 一、引言 相信很多小伙伴们都做过全排列的算法题&#xff0c;输入一个n&#xff0c;输出1~n的全排列。对于这个问题…

k8s相关命令

一、Kubectl是什么 控制K8S通信的命令工具。 格式&#xff1a; kubectl [command] [TYPE] [NAME] [FLAGS] 二、Kubectl命令 1.查看容器命令 kubectl get pod kubectl get pod -n default #查看当前的命名空间的pod kubectl get pod -A #查看所有命名空间的pod kubectl de…

.Net插件开发开源框架

在.NET开发中&#xff0c;有许多开源框架可以用于插件开发&#xff0c;以下是一些最常见的框架&#xff1a; MEF&#xff08;Managed Extensibility Framework&#xff09; MEF是一个用于创建可插拔软件应用程序的库&#xff0c;它可以在不修改原始应用程序的情况下扩展应用程…

JVM 有哪些垃圾回收器?

JVM 有哪些垃圾回收器&#xff1f; 图中展示了7种作用于不同分代的收集器&#xff0c;如果两个收集器之间存在连线&#xff0c;则说明它们可以搭配使用。虚拟机所处的区域则表示它是属于新生代还是老年代收集器。 新生代收集器&#xff08;全部的都是复制算法&#xff09;&…

【安全靶场】-DC-7

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 一、收集信息 1.查看主机是否存活 nmap -T4 -sP 192.168.216.149 2.主动扫描 看开放了哪些端口和功能 n…

【网络】UDP和TCP之间的差别和回显服务器

文章目录 UDP 和 TCP 之间的差别有连接/无连接可靠传输/不可靠传输面向字节流/面向数据报全双工/半双工 UDP/TCP API 的使用UDP APIDatagramSocket构造方法方法 DatagramPacket构造方法方法 回显服务器&#xff08;Echo Server&#xff09;1. 接收请求2. 根据请求计算响应3. 将…

JVM分代回收

JVM分代回收 堆中分为两份:新生代和老年代(1:2) 新生代 新生代的内部分为了三个区域 Eden区,From区,To区[8:1:1] 当eden区内存不足时,就会使用可达性分析算法进行标记 标记eden区和from区的存活对象 将这些对象复制到to区,对eden区和from区进行清除 如果eden下次又出现…

黑马头条vue2.0项目实战(十一)——功能优化(组件缓存、响应拦截器、路由跳转与权限管理)

1. 组件缓存 1.1 介绍 先来看一个问题&#xff1f; 从首页切换到我的&#xff0c;再从我的回到首页&#xff0c;我们发现首页重新渲染原来的状态没有了。 首先&#xff0c;这是正常的状态&#xff0c;并非问题&#xff0c;路由在切换的时候会销毁切出去的页面组件&#xff…

Java之HashMap的底层实现

Java之HashMap的底层实现 摘要HashMap的底层原理哈希值转换为数组下标节点初始化put(Object key, Object value)重写toString()get(Object key)增加泛化remove(K key) 摘要 本博客主要讲述了Java的HashMap的底层实现 HashMap的底层原理 底层原理&#xff1a;数组链表 过程…

【ARM 芯片 安全与攻击 5.6 -- 侧信道与隐蔽信道的区别】

文章目录 侧信道与隐蔽信道的区别侧信道攻击(Side-channel Attack)侧信道攻击简介侧信道攻击 使用方法侧信道攻击示例隐蔽信道(Covert Channel)隐蔽信道简介隐蔽信道使用方法隐蔽信道代码示例侧信道与隐蔽信道在芯片及系统安全方面的使用侧信道的应用隐蔽信道的应用Summary…

【C/C++】菱形继承问题

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

python进阶语法---异常处理

在 Python 中&#xff0c;异常处理是一种机制&#xff0c;用于处理程序运行时可能发生的错误&#xff0c;以确保程序能够优雅地处理错误情况&#xff0c;而不是直接崩溃。异常处理机制的核心是使用 try、except、else 和 finally 语句。 一、基础语法 异常处理的基本语法如下…

【JAVA CORE_API】Day18 网络编程、线程、在线聊天室v1.0

C/S&#xff1a;客户端/服务器端&#xff0c;所有网络应用都是基于客户端服务器端进行的&#xff0c;Java写的是服务端&#xff0c;客户端是一个软件&#xff0c;服务端也是一个软件&#xff0c;两个软件之间交互&#xff1b;&#xff08;只能连接对应的服务器&#xff09; B/…

深度学习-k-mean实现聚类

对模拟函数生成的随机数据&#xff0c;分为三个族群。 1.生成数据 设定样本数量、特征数、族群数&#xff0c;以及簇内标准差之后&#xff0c;通过make_blobs生成随机数据。 scikit-learn库中的make_blobs函数来生成模拟数据集的&#xff0c;用于创建多类单标签数据集&#…

吐血整理 ChatGPT 3.5/4.0/4o 新手使用手册~

都知道ChatGPT很强大&#xff0c;聊聊天、写论文、搞翻译、写代码、写文案、审合同等等&#xff0c;无所不能~ 那么到底怎么使用呢&#xff1f;其实很简单了&#xff0c;国内AI产品发展也很快&#xff0c;很多都很好用了~ 我一直在用&#xff0c;建议收藏下来~ 有最先进、最…

基于 Appium 的 App 爬取实战

除了运行 Appium 的基本条件外&#xff0c;还要一个日志输出库 安装&#xff1a; pip install loguru 思路分析 首先我们观察一下整个 app5 的交互流程&#xff0c;其首页分条显示了电影数据&#xff0c; 每个电影条目都包括封面&#xff0c;标题&#xff0c; 类别和评分 4…