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

【 Python 全栈开发 - 人工智能篇 - 45 】集成算法与聚类算法

文章目录

  • 一、集成算法
    • 1.1 概念
    • 1.2 常用集成算法
      • 1.2.1 Bagging
      • 1.2.2 Boosting
        • 1.2.2.1 AdaBoost
        • 1.2.2.2 GBDT
        • 1.2.2.3 XgBoost
      • 1.2.3 Stacking
  • 二、聚类算法
    • 2.1 概念
    • 2.2 常用聚类算法
      • 2.2.1 K-means
      • 2.2.2 层次聚类
      • 2.2.3 DBSCAN算法
      • 2.2.4 AP聚类算法
      • 2.2.5 高斯混合模型聚类算法


一、集成算法

1.1 概念

集成算法是一种通过组合多个基本模型来提高预测准确度的机器学习技术。这些基本模型可以是同一模型的不同实例,也可以是不同类型的算法。

集成算法的基本思想是将多个模型的预测结果结合起来,以获得更加准确的预测结果。

常见的集成算法包括:Bagging、Boosting、Stacking等。

  • Bagging:并行训练多个弱分类器
  • Boosting:迭代生成多个弱分类器
集成算法
Boosting
AdaBoost
GBDT
XgBoost
Bagging
RandomForest
Stacking(1992年被提出)

Boosting算法:

训练
预测
综合
转化
训练
预测
转化
训练
预测
......
训练
预测
训练集
子数据集1
基本模型1
预测结果集
最终结果
子数据集2
基本模型2
子数据集3
基本模型3
子数据集m
基本模型m

Bagging算法:

训练
训练
训练
训练
训练
训练集
子数据集1
基础模型1
预测结果1
最终结果
输出
子数据集2
基础模型2
预测结果2
子数据集3
基础模型3
预测结果3
......
......
......
子数据集n
基础模型n
预测结果n

Stacking算法:

请添加图片描述

现在我们逐一介绍几种常见的集成算法。

1.2 常用集成算法

1.2.1 Bagging

Bagging集成算法也称为自举聚合(Bootstrap Aggregating)。

在此算法中,每个基本模型都是基于不同数据子集进行训练的。每次训练时,从总训练数据中随机抽取一定比例的数据样本,作为当前模型的训练集。

这样做的好处是可以从不同角度进行训练,减少模型的过拟合风险。

对于多个模型预测出的多个结果,Bagging算法对回归任务进行平均或加权平均,对分类任务进行投票,最后得出结果。

流程就是:

① 从总数据中随机抽取n个样本,组成新的数据集
② 重复m次,得到m个不同数据集
③ 对每个数据集,使用同一种基本模型进行训练,得到m个基本模型
④ 对于新的测试数据,输入m个基本模型,得到m个预测结果
⑤ 使用平均或加权平均、投票法得到最终结果

接下来用python实现各流程。
①、②:

import pandas as pd
# 根据数量进行循环
for i in range(num_estimators):# 随机选择数据sample = data.sample(frac=sample_ratio, replace=True)# 获取特征和结果features = sample.drop(target_variable, axis=1)target = sample[target_variable]

③:

# 使用随机森林作为基本模型
from sklearn.ensemble import RandomForestClassifiermodel = RandomForestClassifier()
model.fit(features, target)

④:

# 将预测结果添加到predictions DataFrame中
prediction = model.predict(data.drop(target_variable, axis=1))
predictions[i] = prediction

⑤:

# 对每个样本的预测结果进行投票,选择最常见的类别作为最终预测结果
final_predictions = predictions.mode(axis=1)[0]

完整代码:

import pandas as pd
from sklearn.ensemble import RandomForestClassifierdef bagging_ensemble(data, target_variable, num_estimators, sample_ratio):# 用于存储基本模型的预测结果predictions = pd.DataFrame()# 根据数量进行循环for i in range(num_estimators):# 随机选择数据sample = data.sample(frac=sample_ratio, replace=True)# 获取特征和结果features = sample.drop(target_variable, axis=1)target = sample[target_variable]# 使用随机森林作为基本模型model = RandomForestClassifier()model.fit(features, target)# 将预测结果添加到predictions DataFrame中prediction = model.predict(data.drop(target_variable, axis=1))predictions[i] = prediction# 对每个样本的预测结果进行投票,选择最常见的类别作为最终预测结果final_predictions = predictions.mode(axis=1)[0]return final_predictions
# 读取数据
data = pd.read_csv('data.csv')# 调用方法进行集成学习
target_variable = 'result'
num_estimators = 10
sample_ratio = 0.8
predictions = bagging_ensemble(data, target_variable, num_estimators, sample_ratio)# 打印预测结果
print(predictions)

1.2.2 Boosting

Boosting算法的核心思想是通过迭代的方式,每次迭代都调整样本的权重或分布,使得在下一次迭代中,分类器能够更关注被错误分类的样本,从而提高整体分类准确性。

1.2.2.1 AdaBoost

算法步骤如下:

对每个弱分类器
根据错误率更新样本的权重分布,增加被错误分类的样本的权重,减少被正确分类的样本的权重
使用当前权重分布训练弱分类器
计算弱分类器的错误率
初始化训练数据的权重分布,使每个样本的权重相等
根据每个弱分类器的错误率计算其权重
构建最终的强分类器,将每个弱分类器的输出结果加权求和

接下来我们尝试使用sklearn库实现AdaBoost。

使用AdaBoost算法需要以下步骤:

  1. 导入所需的库和数据集:
import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_scoredata = pd.read_csv("data.csv")
X = data.iloc[:, :-1]
y = data.iloc[:, -1]X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
  1. 创建AdaBoost分类器:
ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1),n_estimators=200,algorithm="SAMME.R",learning_rate=0.5,random_state=42
)
  1. 使用训练数据拟合分类器:
ada_clf.fit(X_train, y_train)
  1. 使用分类器进行预测:
y_pred = ada_clf.predict(X_test)
  1. 计算准确率:
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

其中,DecisionTreeClassifier(max_depth=1)表示基础分类器,n_estimators表示基础分类器的数量,algorithm表示使用的算法,learning_rate表示学习率。最后,通过计算准确率来评估模型的性能。

完整代码:

# 导入所需的库和数据集
import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_scoredata = pd.read_csv("data.csv")
X = data.iloc[:, :-1]
y = data.iloc[:, -1]X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 创建AdaBoost分类器
ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1),n_estimators=200,algorithm="SAMME.R",learning_rate=0.5,random_state=42
)# 使用训练数据拟合分类器
ada_clf.fit(X_train, y_train)# 使用分类器进行预测
y_pred = ada_clf.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

1.2.2.2 GBDT

GBDT(Gradient Boosting Decision Tree)也是一种基于决策树的机器学习算法。GBDT算法通过迭代训练多个弱分类器,使用梯度下降来优化损失函数,最终得到一个强分类器。

GBDT算法的核心思想是在模型训练的过程中不断迭代地学习错误,每一次迭代都会训练一个新的决策树模型,该模型的目的是使得前面所有模型预测错误的样本得到更好的预测结果。因此,GBDT算法可以有效地处理非线性问题和高维数据集,适用于分类和回归任务。

GBDT算法的优点包括:

  • 高精度:GBDT算法在大规模数据、非线性问题和高维数据集上的表现非常出色,可以取得很高的精度。

  • 鲁棒性:GBDT算法具有很强的鲁棒性,在数据缺失、异常值等情况下能够保持较好的性能。

  • 特征选择:GBDT算法可以选择对预测效果最佳的特征,提高模型的泛化能力。

  • 可解释性:由于GBDT算法采用决策树模型,因此可以输出变量的重要性,方便模型解释和特征工程。

GBDT算法的缺点包括:

  • 训练时间长:GBDT算法需要多次迭代训练,因此训练时间较长。

  • 容易过拟合:由于GBDT算法采用的是Boosting思想,容易出现过拟合问题。为避免过拟合问题,需要调节模型参数和控制模型复杂度。

Python中实现GBDT算法可以使用sklearn库中的GradientBoostingRegressorGradientBoostingClassifier模块。以下是一个简单的示例:

from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier# 加载数据集
X_train, y_train = ...
X_test, y_test = ...# 创建GBDT模型
gbdt = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=3)# 训练模型
gbdt.fit(X_train, y_train)# 预测
y_pred = gbdt.predict(X_test)# 计算准确率或均方误差等指标
score = gbdt.score(X_test, y_test)

其中,GradientBoostingRegressor用于回归任务,GradientBoostingClassifier用于分类任务。参数n_estimators表示迭代次数,learning_rate表示学习率,max_depth表示决策树的最大深度。

1.2.2.3 XgBoost

XgBoost(eXtreme Gradient Boosting)在Boosting的基础上,在优化算法和提高速度方面做了很多改进。它支持分类、回归和排名任务,并且在各种机器学习竞赛中表现优异。

Python中实现XgBoost算法可以使用xgboost库。以下是一个简单的示例:

import xgboost as xgb# 加载数据集
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)# 设置参数
params = {'booster': 'gbtree',  # 树模型'objective': 'reg:squarederror',  # 回归任务'eta': 0.1,  # 学习率'max_depth': 5,  # 树的最大深度'subsample': 0.8,  # 每棵树样本采样比例'colsample_bytree': 0.8,  # 每棵树特征采样比例'eval_metric': 'rmse'  # 评估指标
}# 训练模型
num_round = 100  # 迭代次数
model = xgb.train(params, dtrain, num_round)# 预测
y_pred = model.predict(dtest)# 计算准确率或均方误差等指标
score = model.score(dtest, y_test)

其中,需要将数据集转换为DMatrix格式,设置参数和训练模型的方式与GBDT类似。需要注意的是,XgBoost也是一种集成学习方法,通常需要和其他特征工程、模型选择、模型融合等技术一起使用,才能发挥出最好的效果。

1.2.3 Stacking

Stacking是基于多个模型进行组合预测的。它的基本思想是:将多个不同类型的弱学习器的预测结果作为输入来训练一个强学习器,以产生最终的预测结果。

Stacking算法的大致步骤如下:

以不同的方式将原始数据集划分为训练集和测试集
在训练集上使用多个不同的基模型进行训练,并在测试集上生成预测结果
将基模型的预测结果作为输入,构建新的训练集和测试集
在新的训练集上使用一个次级学习器进行训练
在测试集上使用次级学习器进行预测,得到最终的结果

Stacking算法是一种高效而且准确的集成学习方法,因为它可以同时融合多个不同的预测模型,从而产生更准确的预测结果。但是,它需要更多的计算成本和时间,同时也需要更多的调整和优化来避免过拟合和欠拟合等问题。

Python实现:

import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier# 构造训练数据集
X, y = make_classification(n_samples=1000, n_informative=5, n_classes=2, random_state=1)
n_folds = 5
kf = KFold(n_folds, shuffle=True, random_state=1)# 定义基分类器
lr = LogisticRegression()
dt = DecisionTreeClassifier()
nb = GaussianNB()
rf = RandomForestClassifier()# 训练基分类器并得到其预测结果
def get_oof(clf, X_train, y_train, X_test):oof_train = np.zeros((X_train.shape[0],))oof_test = np.zeros((X_test.shape[0],))oof_test_skf = np.empty((n_folds, X_test.shape[0]))for i, (train_index, test_index) in enumerate(kf.split(X_train)):kf_X_train = X_train[train_index]kf_y_train = y_train[train_index]kf_X_test = X_train[test_index]clf.fit(kf_X_train, kf_y_train)oof_train[test_index] = clf.predict(kf_X_test)oof_test_skf[i, :] = clf.predict(X_test)oof_test[:] = oof_test_skf.mean(axis=0)return oof_train.reshape(-1, 1), oof_test.reshape(-1, 1)# 训练多个基分类器并得到其输出结果
lr_oof_train, lr_oof_test = get_oof(lr, X, y, X)
dt_oof_train, dt_oof_test = get_oof(dt, X, y, X)
nb_oof_train, nb_oof_test = get_oof(nb, X, y, X)
rf_oof_train, rf_oof_test = get_oof(rf, X, y, X)# 将多个基分类器的输出结果作为元特征集,训练元分类器
X_train = np.concatenate((lr_oof_train, dt_oof_train, nb_oof_train, rf_oof_train), axis=1)
X_test = np.concatenate((lr_oof_test, dt_oof_test, nb_oof_test, rf_oof_test), axis=1)meta_model = LogisticRegression()
meta_model.fit(X_train, y)# 使用元分类器进行预测
predictions = meta_model.predict(X_test)

二、聚类算法

2.1 概念

聚类算法是一种无监督学习算法,其目标是将一组未标记的数据样本分成多个相似的群组,群组内部的样本相似度高,群组之间的样本差异度也高。

聚类算法根据相似性度量在数据集中找到相似的数据点,并将其分配到不同的簇中,簇内数据点之间相似度高,簇与簇之间的相似度低。

聚类算法的一般流程如下:

  1. 随机选择K个簇心(簇心是聚类的中心点)。
  2. 计算每个样本与K个簇心之间的距离,并将样本分配到距离最近的簇。
  3. 重新计算每个簇的中心点。
  4. 重复步骤2和3直到收敛,即簇不再发生变化。

聚类算法在各种领域广泛应用,例如文本聚类、图像分割、市场营销、医学、生物信息学等。

2.2 常用聚类算法

常用的聚类算法包括以下几种:

  1. K-means算法:是最常用和最经典的聚类算法之一。它以欧几里得距离作为相似性度量,将数据样本分成K个簇。

  2. 层次聚类算法:该算法通过计算样本之间的距离将数据点不断合并成越来越大的簇,最终形成一棵层次结构。

  3. DBSCAN算法:该算法通过局部密度来确定样本是否属于同一个簇,可以有效地处理噪声和离群值。

  4. AP聚类算法:该算法通过簇内数据点之间的传递消息来确定簇的数量和簇心位置,具有很好的稳健性和鲁棒性。

  5. 高斯混合模型聚类算法:该算法将每个簇看作一个高斯分布,通过最大化似然函数来确定簇的数量,具有良好的灵活性和可解释性。

以上算法各有优缺点,在不同应用场景下选取合适的算法可以获得更好的聚类效果。

2.2.1 K-means

K-means算法是一种常见且经典的聚类算法,它将数据样本分成K个簇,并且每个簇的中心被称为簇心。该算法的基本步骤如下:

  1. 随机选择K个中心点作为簇心,可以选择样本中的K个点或者通过其他方法选取。

  2. 将每个样本点分配到最近的簇心所在的簇中。

  3. 更新每个簇的簇心,计算该簇内所有样本点的平均值并将其作为新簇心。

  4. 重复步骤2和3,直到所有样本点的簇分配不再变化或达到最大迭代次数。

K-means算法需要选择合适的K值,通常采用肘部法则选择最佳的K值。肘部法则是指在不同的K值下,计算聚类的平均距离平方和(SSE),选择一个SSE急剧下降的点作为最佳的K值。

K-means算法的优点包括简单、易于实现、计算效率高,但其缺点也很明显,如需要预先确定簇的数量、对初始点的选择敏感,容易陷入局部最优解等。

Python可以简单的使用sklearn库实现此算法。

from sklearn.cluster import KMeans
import numpy as np# 构造样本数据
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])# 设置簇数K为2
kmeans = KMeans(n_clusters=2)# 训练模型,预测簇分配
kmeans.fit(X)
labels = kmeans.predict(X)# 输出结果
print("样本数据:\n", X)
print("簇分配:\n", labels)
print("簇心:\n", kmeans.cluster_centers_)
样本数据:[[1 2][1 4][1 0][4 2][4 4][4 0]]
簇分配:[0 0 0 1 1 1]
簇心:[[ 1.          2.        ][ 4.          2.        ]]

2.2.2 层次聚类

层次聚类算法(Hierarchical Clustering)是一种基于树形结构的聚类方法,它的主要思想是不断将相似的对象合并成为更大的簇,直到所有对象都被合并到同一个簇中或达到某个预设的阈值。

层次聚类算法有两种不同的方法:自底向上的聚合(Agglomerative Clustering)和自顶向下的分裂(Divisive Clustering)。

自底向上的聚合是一种自下而上的聚类方法,将每个样本数据都置为一个初始簇,然后重复以下步骤直至达到停止条件:

  1. 计算两个最近的簇之间的距离(可以使用不同的距离度量方式)
  2. 合并两个最近的簇为一个新的簇
  3. 计算新的簇与所有旧簇(或新簇)之间的距离

自顶向下的分裂是一种自上而下的聚类方法,将所有样本数据都置为一个初始簇,然后重复以下步骤直至达到停止条件:

  1. 计算当前簇中样本的方差
  2. 选取方差最大的簇进行分裂,将其分为两个新的簇
  3. 递归地对新的两个簇进行2步骤操作

Python中,可以使用scikit-learn库中的AgglomerativeClustering类来实现自底向上的聚合层次聚类算法,以下是一个简单的示例代码:

from sklearn.cluster import AgglomerativeClustering
import numpy as np# 构造样本数据
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])# 设置簇数K为2
agg_clustering = AgglomerativeClustering(n_clusters=2)# 训练模型,预测簇分配
labels = agg_clustering.fit_predict(X)# 输出结果
print("样本数据:\n", X)
print("簇分配:\n", labels)

其中,AgglomerativeClustering类的n_clusters参数指定簇数,fit_predict方法用于训练模型并预测簇分配。输出结果显示,所有的样本数据都被正确的分配到了两个簇中。

2.2.3 DBSCAN算法

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)算法是一种基于密度的聚类算法,主要用于发现任意形状的密度相连簇集,可以有效地处理噪声和局部密度变化的数据。

DBSCAN算法的核心思想是给定一个密度阈值eps和一个最小包含点数minPts,将样本分为核心点、边界点和噪声点三类,具体步骤如下:

  1. 随机选取一个未访问的样本点p
  2. 判断p是否是核心点(周围半径为eps内至少包含minPts个样本点)
  3. 如果p是核心点,则将其周围eps半径内的所有样本点加入一个新的簇中,并且将这些样本点标记为已访问
  4. 如果p不是核心点,则标记为噪声点并标记为已访问
  5. 重复以上步骤,直到所有样本点都被访问

Python中,可以使用scikit-learn库中的DBSCAN类来实现DBSCAN算法,以下是一个简单的示例代码:

from sklearn.cluster import DBSCAN
import numpy as np# 构造样本数据
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])# 设置密度阈值eps为1,最小包含点数minPts为2
dbscan = DBSCAN(eps=1, min_samples=2)# 训练模型,预测簇分配
labels = dbscan.fit_predict(X)# 输出结果
print("样本数据:\n", X)
print("簇分配:\n", labels)

其中,DBSCAN类的eps参数指定密度阈值,min_samples参数指定最小包含点数,fit_predict方法用于训练模型并预测簇分配。输出结果显示,所有的样本数据都被正确的分配到了两个簇中。值得注意的是,-1表示噪声点。

2.2.4 AP聚类算法

AP聚类算法(Affinity Propagation clustering algorithm)是一种基于"消息传递"的聚类算法,它能够有效地自动划分聚类中心和样本点,并且不需要事先指定聚类数量。AP聚类算法的核心思想是利用样本点之间的相似度信息来进行聚类,通过传递消息的方式不断优化聚类中心和样本点的划分。

具体地,AP聚类算法的过程如下:

  1. 计算样本点之间的相似度矩阵S
  2. 初始化两个矩阵R和A,其中R[i, k]表示样本点i选择样本点k作为其聚类中心的相对适合度,A[i, k]表示样本点i将样本点k作为聚类中心的相对适合度调整值
  3. 通过迭代更新矩阵R和A来不断优化聚类中心和样本点的划分,直到满足停止准则(例如收敛或达到最大迭代次数)
  4. 最后,根据聚类中心和样本点的划分结果来进行聚类

Python中,可以使用scikit-learn库中的AffinityPropagation类来实现AP聚类算法,以下是一个简单的示例代码:

from sklearn.cluster import AffinityPropagation
import numpy as np# 构造样本数据
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])# 设置阻尼因子damping为0.5
ap = AffinityPropagation(damping=0.5)# 训练模型,预测簇分配
labels = ap.fit_predict(X)# 输出结果
print("样本数据:\n", X)
print("簇分配:\n", labels)

其中,AffinityPropagation类的damping参数指定阻尼因子,fit_predict方法用于训练模型并预测簇分配。输出结果显示,所有的样本数据都被正确地分配到了两个簇中。

2.2.5 高斯混合模型聚类算法

高斯混合模型聚类算法(Gaussian Mixture Model clustering algorithm)是一种基于概率模型的聚类算法,它假设样本数据是由多个高斯分布混合而成的,并通过最大化似然函数来估计模型参数和聚类结果。高斯混合模型聚类算法能够适用于各种形状、大小和密度的聚类,并且可以进行密度估计和异常检测。

具体地,高斯混合模型聚类算法的过程如下:

  1. 随机初始化高斯混合模型的参数(包括每个高斯分布的均值、方差和混合系数)
  2. 根据当前的高斯混合模型参数,计算样本数据属于每个高斯分布的概率,并根据概率大小分配样本数据到对应的簇中
  3. 基于当前的样本簇分配,更新高斯混合模型的参数,最大化似然函数
  4. 重复步骤2和步骤3,直到满足停止准则(例如收敛或达到最大迭代次数)
  5. 最后,根据样本簇分配结果来进行聚类

Python中,可以使用scikit-learn库中的GaussianMixture类来实现高斯混合模型聚类算法,以下是一个简单的示例代码:

from sklearn.mixture import GaussianMixture
import numpy as np# 构造样本数据
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])# 设置高斯分布数量为2
gmm = GaussianMixture(n_components=2)# 训练模型,预测簇分配
labels = gmm.fit_predict(X)# 输出结果
print("样本数据:\n", X)
print("簇分配:\n", labels)

其中,GaussianMixture类的n_components参数指定高斯分布数量,fit_predict方法用于训练模型并预测簇分配。输出结果显示,所有的样本数据都被正确地分配到了两个簇中。


这一期我写了3天,很高兴你能看到这里,给个免费的赞可以吗?谢谢!

相关文章:

【 Python 全栈开发 - 人工智能篇 - 45 】集成算法与聚类算法

文章目录 一、集成算法1.1 概念1.2 常用集成算法1.2.1 Bagging1.2.2 Boosting1.2.2.1 AdaBoost1.2.2.2 GBDT1.2.2.3 XgBoost 1.2.3 Stacking 二、聚类算法2.1 概念2.2 常用聚类算法2.2.1 K-means2.2.2 层次聚类2.2.3 DBSCAN算法2.2.4 AP聚类算法2.2.5 高斯混合模型聚类算法 一、…...

SSM商城项目实战:账户充值功能实现

SSM商城项目实战:账户充值功能实现 在一个电商平台中,用户账户充值是一个非常重要的功能。本文将介绍如何在SSM(SpringSpringMVCMyBatis)商城项目中实现账户充值功能。通过本文的指导,你将学会如何在项目中添加账户充…...

wireshark工具pcap文件转换

pcap详解_pcap_loop_小虎随笔的博客-CSDN博客 分析802.11无线报文hexdump内容:利用wireshark自带二进制工具text2pcap将hexdump内容转换为pcap文件..._weixin_30835933的博客-CSDN博客 text2pcap: 将hex转储文本转换为Wireshark可打开的pcap文件(wireshark,数据) …...

Python+TinyPNG熊猫网站自动化的压缩图片

前言 本篇在讲什么 PythonTinyPNG自动化处理图片 本篇需要什么 对Python语法有简单认知 依赖Python2.7环境 依赖TinyPNG工具 本篇的特色 具有全流程的图文教学 重实践,轻理论,快速上手 提供全流程的源码内容 ★提高阅读体验★ 👉…...

【Linux】socket 编程基础

文章目录 📕 网络间的通信📕 socket 是什么1. socket 套接字2. 套接字描述符3. 基本的 socket 接口函数3.1 头文件3.2 socket() 函数3.3 bind() 函数struct sockaddr主机序列与网络序列 3.4 listen() 函数3.5 connect() 函数3.6 accept() 函数IP 地址风格…...

openGauss学习笔记-51 openGauss 高级特性-列存储

文章目录 openGauss学习笔记-51 openGauss 高级特性-列存储51.1 语法格式51.2 参数说明51.3 示例 openGauss学习笔记-51 openGauss 高级特性-列存储 openGauss支持行列混合存储。行存储是指将表按行存储到硬盘分区上,列存储是指将表按列存储到硬盘分区上。 行、列…...

ReactNative 密码生成器实战

效果展示图 使用插件 Formik 负责表单校验、监听表单提交、数据校验错误信息展示 Yup 负责表单校验规则 分析页面 从上述的展示图我们可以看到的主要元素有:输入框、单选按钮和按钮。其中生成的密码长度不可能很大也不可能为负数和 0,所以我们可以限…...

开始MySQL之路——外键关联和多表联合查询详细概述

多表查询和外键关联 实际开发中,一个项目通常需要很多张表才能完成。例如,一个商城项目就需要分类表,商品表,订单表等多张表。且这些表的数据之间存在一定的关系,接下来我们将在单表的基础上,一起学习多表…...

无涯教程-PHP - intval() 函数

PHP 7引入了一个新函数 intdiv()&#xff0c;该函数对其操作数执行整数除法并将该除法返回为int。 <?php$valueintdiv(10,3);var_dump($value);print(" ");print($value); ?> 它产生以下浏览器输出- int(3) 3 PHP - intval() 函数 - 无涯教程网无涯教程网…...

2023年国赛数学建模思路 - 案例:粒子群算法

文章目录 1 什么是粒子群算法&#xff1f;2 举个例子3 还是一个例子算法流程算法实现建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 什么是粒子群算法&#xff1f; 粒子群算法&#xff08;Pa…...

【1++的数据结构】之map与set(一)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的数据结构】 文章目录 一&#xff0c;关联式容器与键值对二&#xff0c;setset的使用 三&#xff0c;mapmap的使用 四&#xff0c;multiset与multimap 一&#xff0c;关联式容器与键值对 像l…...

Ubuntu断电重启后黑屏左上角光标闪烁,分辨率低解决办法,ubuntu系统display只有4:3 怎么办?太卡

这个问题主要是显卡驱动问题&#xff0c;按照步骤更新显卡驱动 1&#xff0c;选择metapackage 并且选择proprietary版本&#xff0c;选择版本号选择最新的版本。 2&#xff0c;具体步骤参考 前言 笔者在安装显卡驱动时并未遇到问题&#xff0c;主要是后续屏幕亮度无法调节&…...

Java 微服务当中POST form 、url、json的区别

在Java微服务的Controller中&#xff0c;你可以处理来自客户端的不同类型的POST请求&#xff0c;包括POST form、POST URL参数和POST JSON数据。以下是它们的区别以及在微服务Controller中的示例说明&#xff1a; POST Form 表单数据&#xff1a; 当客户端以表单方式提交数据…...

repo 常用命令汇总——202308

文章目录 1. 下载repo&#xff1a;2. 获取工程repo信息3. 下载代码4. 创建并切换本地分支5. repo forall6. repo upload7. repo list8. repo info9. repo help 1. 下载repo&#xff1a; 使用下面命令&#xff0c;具体版本号参考前面网页中显示的最新版本号。 curl http://git…...

[Linux]命令行参数和进程优先级

[Linux]命令行参数和进程优先级 文章目录 [Linux]命令行参数和进程优先级命令行参数命令行参数的概念命令函参数的接收编写代码验证 进程优先级进程优先级的概念PRI and NI使用top指令修改nice值 命令行参数 命令行参数的概念 命令行参数是指用于运行程序时在命令行输入的参数…...

Android13新特性之通知权限提升

Android13新特性之通知权限提升 随着移动通信的高速发展&#xff0c;保障通信的安全性变得尤为重要。在Android 13的最新版本中&#xff0c;通知权限的管理得到了进一步加强。为了实现安全的通信和确保用户的隐私&#xff0c;必须正确申请通知权限。本文将详细探讨如何在Andro…...

206. 反转链表 (简单系列)

给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3&#xff1a; 输…...

攻防世界-Fakebook

原题 解题思路 点击join就可以进行注册 username看起来是个超链&#xff0c;点击跳转 在url里出现了no1&#xff0c;看起来可以注入&#xff0c;改成no1 and 12报错。本来想用sqlmap&#xff0c;可能是网速有问题&#xff0c;啥都没出来。no1order by 5报错&#xff0c;一共有…...

0基础入门C++之类和对象下篇

目录 1.再谈构造函数1.1构造函数赋值1.2初始化列表1.3explicit关键字 2.static成员2.1概念2.1静态成员变量2.2静态成员函数2.3特性 3.匿名对象4.友元函数4.1友元函数4.2友元类 5.内部类6.再次理解类和对象 1.再谈构造函数 首先我们先来回忆一下构造函数&#xff1a; 构造函数是…...

ECMAScript 2023

从尾到头搜索数组 在 JavaScript 中&#xff0c;通过 find() 和 findIndex() 查找数组中的值是一种常见做法。不过&#xff0c;这些方法从数组的开始进行遍历&#xff1a; const array [{v: 1}, {v: 2}, {v: 3}, {v: 4}, {v: 5}];array.find(elem > elem.v > 3); // {v:…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...

前端工具库lodash与lodash-es区别详解

lodash 和 lodash-es 是同一工具库的两个不同版本&#xff0c;核心功能完全一致&#xff0c;主要区别在于模块化格式和优化方式&#xff0c;适合不同的开发环境。以下是详细对比&#xff1a; 1. 模块化格式 lodash 使用 CommonJS 模块格式&#xff08;require/module.exports&a…...

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.

这个警告表明您在使用Vue的esm-bundler构建版本时&#xff0c;未明确定义编译时特性标志。以下是详细解释和解决方案&#xff1a; ‌问题原因‌&#xff1a; 该标志是Vue 3.4引入的编译时特性标志&#xff0c;用于控制生产环境下SSR水合不匹配错误的详细报告1使用esm-bundler…...

基于Java项目的Karate API测试

Karate 实现了可以只编写Feature 文件进行测试,但是对于熟悉Java语言的开发或是测试人员,可以通过编程方式集成 Karate 丰富的自动化和数据断言功能。 本篇快速介绍在Java Maven项目中编写和运行测试的示例。 创建Maven项目 最简单的创建项目的方式就是创建一个目录,里面…...

Fractal Generative Models论文阅读笔记与代码分析

何恺明分型模型这篇文章在二月底上传到arXiv预出版网站到现在已经过了三个月&#xff0c;当时我也听说这篇文章时感觉是大有可为&#xff0c;但是几个月不知道忙啥了&#xff0c;可能错过很多机会&#xff0c;但是亡羊补牢嘛&#xff0c;而且截至目前&#xff0c;该文章应该也还…...