8种Python异常检测算法总结

news2025/2/24 3:17:42

异常检测是通过数据挖掘方法发现与数据集分布不一致的异常数据,也被称为离群点、异常值检测等等。本文为大家整理了8个常见的Python异常检测算法,希望对大家有所帮助

一、异常检测简介

异常检测是通过数据挖掘方法发现与数据集分布不一致的异常数据,也被称为离群点、异常值检测等等。

 

1.1 异常检测适用的场景

异常检测算法适用的场景特点有:(1)无标签或者类别极不均衡;(2)异常数据跟样本中大多数数据的差异性较大;(3)异常数据在总体数据样本中所占的比例很低。常见的应用案例如:

金融领域:从金融数据中识别”欺诈用户“,如识别信用卡申请欺诈、信用卡盗刷、信贷欺诈等;安全领域:判断流量数据波动以及是否受到攻击等等;电商领域:从交易等数据中识别”恶意买家“,如羊毛党、恶意刷屏团伙;生态灾难预警:基于天气指标数据,判断未来可能出现的极端天气;医疗监控:从医疗设备数据,发现可能会显示疾病状况的异常数据;

 

1.2 异常检测存在的挑战

异常检测是热门的研究领域,但由于异常存在的未知性、异质性、特殊性及多样性等复杂情况,整个领域仍有较多的挑战:

1)最具挑战性的问题之一是难以实现高异常检测召回率。由于异常非常罕见且具有异质性,因此很难识别所有异常。

2)异常检测模型要提高精确度(precision)往往要深度结合业务特征,否则效果不佳,且容易导致对少数群体产生算法偏见。

二、异常检测方法

按照训练集是否包含异常值可以划分为异常值检测(outlier detection)及新颖点检测(novelty detection),新颖点检测的代表方法如one class SVM。

按照异常类别的不同,异常检测可划分为:异常点检测(如异常消费用户),上下文异常检测(如时间序列异常),组异常检测(如异常团伙)。

按照学习方式的不同,异常检测可划分为:有监督异常检测(Supervised Anomaly Detection)、半监督异常检测(Semi-Supervised Anomaly Detection)及无监督异常检测(Unsupervised Anomaly Detection)。现实情况的异常检测问题,由于收集异常标签样本的难度大,往往是没有标签的,所以无监督异常检测应用最为广泛。

无监督异常检测按其算法思想大致可分为如下下几类:

2.1 基于聚类的方法

基于聚类的异常检测方法通常依赖下列假设,1)正常数据实例属于数据中的一个簇,而异常数据实例不属于任何簇;2)正常数据实例靠近它们最近的簇质心,而异常数据离它们最近的簇质心很远;3)正常数据实例属于大而密集的簇,而异常数据实例要么属于小簇,要么属于稀疏簇;通过将数据归分到不同的簇中,异常数据则是那些属于小簇或者不属于任何一簇或者远离簇中心的数据。

  • 将距离簇中心较远的数据作为异常点:这类方法有 SOM、K-means、最大期望( expectation maximization,EM)及基于语义异常因子( semantic anomaly factor)算法等;
  • 将聚类所得小簇数据作为异常点:代表方法有K-means聚类;
  • 将不属于任何一簇作为异常点:代表方法有 DBSCAN、ROCK、SNN 聚类。

2.2 基于统计的方法

基于统计的方法依赖的假设是数据集服从某种分布( 如正态分布、泊松分布及二项式分布等) 或概率模型,通过判断某数据点是否符合该分布/模型( 即通过小概率事件的判别) 来实现异常检测。根据概率模型可分为:

1)参数方法,由已知分布的数据中估计模型参数( 如高斯模型) ,其中最简单的参数异常检测模型就是假设样本服从一元正态分布,当数据点与均值差距大于两倍或三倍方差时,则认为该点为异常;

2)非参数方法,在数据分布未知时,可绘制直方图通过检测数据是否在训练集所产生的直方图中来进行异常检测。还可以利用数据的变异程度( 如均差、标准差、变异系数、四分位数间距等) 来发现数据中的异常点数据。

2.3 基于深度的方法

该方法将数据映射到 k 维空间的分层结构中,并假设异常值分布在外围,而正常数据点靠近分层结构的中心(深度越高)。

半空间深度法( ISODEPTH 法) ,通过计算每个点的深度,并根据深度值判断异常数据点。

最小椭球估计 ( minimum volume ellipsoid estimator,MVE)法。根据大多数数据点( 通常为 > 50% ) 的概率分布模型拟合出一个实线椭圆形所示的最小椭圆形球体的边界,不在此边界范围内的数据点将被判断为异常点。

 

孤立森林。上述两种基于深度的基础模型随着特征维度k的增加,其时间复杂性呈指数增长,通常适用于维度k≤3 时,而孤立森林通过改变计算深度的方式,也可以适用于高维的数据。

 

孤立森林算法是基于 Ensemble 的异常检测方法,因此具有线性的时间复杂度。且精准度较高,在处理大数据时速度快,所以目前在工业界的应用范围比较广。其基本思想是:通过树模型方法随机地切分样本空间,那些密度很高的簇要被切很多次才会停止切割(即每个点都单独存在于一个子空间内),但那些分布稀疏的点(即异常点),大都很早就停到一个子空间内了。算法步骤为:

1)从训练数据中随机选择 Ψ 个样本,以此训练单棵树。

2)随机指定一个q维度(attribute),在当前节点数据中随机产生一个切割点p。p切割点产生于当前节点数据中指定q维度的最大值和最小值之间。

3)在此切割点的选取生成了一个超平面,将当前节点数据空间切分为2个子空间:把当前所选维度下小于 p 的点放在当前节点的左分支,把大于等于 p 的点放在当前节点的右分支;

4)在节点的左分支和右分支节点递归步骤 2、3,不断构造新的叶子节点,直到叶子节点上只有一个数据(无法再继续切割) 或树已经生长到了所设定的高度 。(设置单颗树的最大高度是因为异常数据记录都比较少,其路径长度也比较低,而我们也只需要把正常记录和异常记录区分开来,因此只需要关心低于平均高度的部分就好,这样算法效率更高。)

5)由于每颗树训练的切割特征空间过程是完全随机的,所以需要用 ensemble 的方法来使结果收敛,即多建立几棵树,然后综合计算每棵树切分结果的平均值。对于每个样本 x,通过下面的公式计算综合的异常得分s。

 

h(x) 为 x 在每棵树的高度,c(Ψ) 为给定样本数 Ψ 时路径长度的平均值,用来对样本 x 的路径长度 h(x) 进行标准化处理。

2.4 基于分类模型

代表方法是One class SVM,其原理是寻找一个超平面将样本中的正例圈出来,预测就是用这个超平面做决策,在圈内的样本就认为是正样本。由于核函数计算比较耗时,在海量数据的场景用的并不多。

 

依赖的假设是:正常数据实例位于密集的邻域中,而异常数据实例附近的样例较为稀疏。可以继续细分为 基于密度/邻居:

基于密度,该方法通过计算数据集中各数据区域的密度,将密度较低区域作为离群区域。经典的方法为:局部离群因子( local outlier factor,LOF) 。LOF 法与传统异常点非彼即此定义不同,将异常点定义局域是异常点,为每个数据赋值一个代表相对于其邻域的 LOF 值,LOF 越大,说明其邻域密度较低,越有可能是异常点。但在 LOF 中难以确定最小近邻域,且随着数据维度的升高,计算复杂度和时间复杂度增加。

基于距离,其基本思想是通过计算比较数据与近邻数据集合的距离来检测异常,正常数据点与其近邻数据相似,而异常数据则有别于近邻数据。

2.5 基于偏差的方法

当给定一个数据集时,可通过基于偏差法找出与整个数据集特征不符的点,并且数据集方差会随着异常点的移除而减小。该方法可分为逐个比较数据点的序列异常技术和 OLAP 数据立方体技术。目前该方法实际应用较少。

2.6 基于重构的方法

代表方法为PCA。PCA在异常检测方面的做法,大体有两种思路:一种是将数据映射到低维特征空间,然后在特征空间不同维度上查看每个数据点跟其它数据的偏差;另外一种是将数据映射到低维特征空间,然后由低维特征空间重新映射回原空间,尝试用低维特征重构原始数据,看重构误差的大小。

2.7 基于神经网络的方法

代表方法有自动编码器( autoencoder,AE) ,长短期记忆神经网络(LSTM)等。

LSTM可用于时间序列数据的异常检测:利用历史序列数据训练模型,检测与预测值差异较大的异常点。

Autoencoder异常检测 Autoencoder本质上使用了一个神经网络来产生一个高维输入的低维表示。Autoencoder与主成分分析PCA类似,但是Autoencoder在使用非线性激活函数时克服了PCA线性的限制。算法的基本上假设是异常点服从不同的分布。根据正常数据训练出来的Autoencoder,能够将正常样本重建还原,但是却无法将异于正常分布的数据点较好地还原,导致其基于重构误差较大。当重构误差大于某个阈值时,将其标记为异常值。

 

小结:无监督异常检测方法的要素为选择相关的特征以及基于合理假设选择合适的算法,可以更好的发挥异常检测效果。

三、项目实战:信用卡反欺诈

项目为kaggle上经典的信用卡欺诈检测,该数据集质量高,正负样本比例非常悬殊。我们在此项目主要用了无监督的Autoencoder新颖点检测,根据重构误差识别异常欺诈样本。

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

#!/usr/bin/env python 

# coding: utf-8 

   

import warnings 

warnings.filterwarnings("ignore"

   

import pandas as pd 

import numpy as np 

import pickle 

import matplotlib.pyplot as plt 

plt.style.use('seaborn'

import tensorflow as tf 

import seaborn as sns 

from sklearn.model_selection import train_test_split 

from keras.models import Model, load_model 

from keras.layers import Input, Dense 

from keras.callbacks import ModelCheckpoint 

from keras import regularizers 

from sklearn.preprocessing import StandardScaler 

from sklearn.metrics import roc_curve, auc, precision_recall_curve 

# 安利一个异常检测Python库 https://github.com/yzhao062/Pyod 

   

# 读取数据 :信用卡欺诈数据集地址https://www.kaggle.com/mlg-ulb/creditcardfraud 

d = pd.read_csv('creditcard.csv'

   

# 查看样本比例 

num_nonfraud = np.sum(d['Class'] == 0

num_fraud = np.sum(d['Class'] == 1

plt.bar(['Fraud', 'non-fraud'], [num_fraud, num_nonfraud], color='dodgerblue'

plt.show() 

   

# 删除时间列,对Amount进行标准化 

data = d.drop(['Time'], axis=1

data['Amount'] = StandardScaler().fit_transform(data[['Amount']]) 

   

# 为无监督新颖点检测方法,只提取负样本,并且按照8:2切成训练集和测试集 

mask = (data['Class'] == 0

X_train, X_test = train_test_split(data[mask], test_size=0.2, random_state=0

X_train = X_train.drop(['Class'], axis=1).values 

X_test = X_test.drop(['Class'], axis=1).values 

   

# 提取所有正样本,作为测试集的一部分 

X_fraud = data[~mask].drop(['Class'], axis=1).values 

   

# 构建Autoencoder网络模型 

# 隐藏层节点数分别为16,8,8,16 

# epoch为5,batch size为32 

input_dim = X_train.shape[1

encoding_dim = 16 

num_epoch = 5 

batch_size = 32 

   

input_layer = Input(shape=(input_dim, )) 

encoder = Dense(encoding_dim, activation="tanh",  

                activity_regularizer=regularizers.l1(10e-5))(input_layer) 

encoder = Dense(int(encoding_dim / 2), activation="relu")(encoder) 

decoder = Dense(int(encoding_dim / 2), activation='tanh')(encoder) 

decoder = Dense(input_dim, activation='relu')(decoder) 

autoencoder = Model(inputs=input_layer, outputs=decoder) 

autoencoder.compile(optimizer='adam',  

                    loss='mean_squared_error',  

                    metrics=['mae']) 

   

# 模型保存为model.h5,并开始训练模型 

checkpointer = ModelCheckpoint(filepath="model.h5"

                               verbose=0

                               save_best_only=True

history = autoencoder.fit(X_train, X_train, 

                          epochs=num_epoch, 

                          batch_size=batch_size, 

                          shuffle=True

                          validation_data=(X_test, X_test), 

                          verbose=1,  

                          callbacks=[checkpointer]).history 

   

   

# 画出损失函数曲线 

plt.figure(figsize=(14, 5)) 

plt.subplot(121

plt.plot(history['loss'], c='dodgerblue', lw=3

plt.plot(history['val_loss'], c='coral', lw=3

plt.title('model loss'

plt.ylabel('mse'); plt.xlabel('epoch'

plt.legend(['train', 'test'], loc='upper right'

   

plt.subplot(122

plt.plot(history['mae'], c='dodgerblue', lw=3

plt.plot(history['val_mae'], c='coral', lw=3

plt.title('model mae'

plt.ylabel('mae'); plt.xlabel('epoch'

plt.legend(['train', 'test'], loc='upper right'

   

   

# 读取模型 

autoencoder = load_model('model.h5'

   

# 利用autoencoder重建测试集 

pred_test = autoencoder.predict(X_test) 

# 重建欺诈样本 

pred_fraud = autoencoder.predict(X_fraud)   

   

# 计算重构MSE和MAE误差 

mse_test = np.mean(np.power(X_test - pred_test, 2), axis=1

mse_fraud = np.mean(np.power(X_fraud - pred_fraud, 2), axis=1

mae_test = np.mean(np.abs(X_test - pred_test), axis=1

mae_fraud = np.mean(np.abs(X_fraud - pred_fraud), axis=1

mse_df = pd.DataFrame() 

mse_df['Class'] = [0] * len(mse_test) + [1] * len(mse_fraud) 

mse_df['MSE'] = np.hstack([mse_test, mse_fraud]) 

mse_df['MAE'] = np.hstack([mae_test, mae_fraud]) 

mse_df = mse_df.sample(frac=1).reset_index(drop=True

   

# 分别画出测试集中正样本和负样本的还原误差MAE和MSE 

markers = ['o', '^'

markers = ['o', '^'

colors = ['dodgerblue', 'coral'

labels = ['Non-fraud', 'Fraud'

   

plt.figure(figsize=(14, 5)) 

plt.subplot(121

for flag in [1, 0]: 

    temp = mse_df[mse_df['Class'] == flag] 

    plt.scatter(temp.index,  

                temp['MAE'],   

                alpha=0.7,  

                marker=markers[flag],  

                c=colors[flag],  

                label=labels[flag]) 

plt.title('Reconstruction MAE'

plt.ylabel('Reconstruction MAE'); plt.xlabel('Index'

plt.subplot(122

for flag in [1, 0]: 

    temp = mse_df[mse_df['Class'] == flag] 

    plt.scatter(temp.index,  

                temp['MSE'],   

                alpha=0.7,  

                marker=markers[flag],  

                c=colors[flag],  

                label=labels[flag]) 

plt.legend(loc=[1, 0], fontsize=12); plt.title('Reconstruction MSE'

plt.ylabel('Reconstruction MSE'); plt.xlabel('Index'

plt.show() 

# 下图分别是MAE和MSE重构误差,其中橘黄色的点是信用欺诈,也就是异常点;蓝色是正常点。我们可以看出异常点的重构误差整体很高。 

   

# 画出Precision-Recall曲线 

plt.figure(figsize=(14, 6)) 

for i, metric in enumerate(['MAE', 'MSE']): 

    plt.subplot(1, 2, i+1

    precision, recall, _ = precision_recall_curve(mse_df['Class'], mse_df[metric]) 

    pr_auc = auc(recall, precision) 

    plt.title('Precision-Recall curve based on %s\nAUC = %0.2f'%(metric, pr_auc)) 

    plt.plot(recall[:-2], precision[:-2], c='coral', lw=4

    plt.xlabel('Recall'); plt.ylabel('Precision'

plt.show() 

   

# 画出ROC曲线 

plt.figure(figsize=(14, 6)) 

for i, metric in enumerate(['MAE', 'MSE']): 

    plt.subplot(1, 2, i+1

    fpr, tpr, _ = roc_curve(mse_df['Class'], mse_df[metric]) 

    roc_auc = auc(fpr, tpr) 

    plt.title('Receiver Operating Characteristic based on %s\nAUC = %0.2f'%(metric, roc_auc)) 

    plt.plot(fpr, tpr, c='coral', lw=4

    plt.plot([0,1],[0,1], c='dodgerblue', ls='--'

    plt.ylabel('TPR'); plt.xlabel('FPR'

plt.show() 

# 不管是用MAE还是MSE作为划分标准,模型的表现都算是很好的。PR AUC分别是0.51和0.44,而ROC AUC都达到了0.95。 

   

# 画出MSE、MAE散点图 

markers = ['o', '^'

colors = ['dodgerblue', 'coral'

labels = ['Non-fraud', 'Fraud'

   

plt.figure(figsize=(10, 5)) 

for flag in [1, 0]: 

    temp = mse_df[mse_df['Class'] == flag] 

    plt.scatter(temp['MAE'],  

                temp['MSE'],   

                alpha=0.7,  

                marker=markers[flag],  

                c=colors[flag],  

                label=labels[flag]) 

plt.legend(loc=[1, 0]) 

plt.ylabel('Reconstruction RMSE'); plt.xlabel('Reconstruction MAE'

plt.show() 

到此这篇关于8种Python异常检测算法总结的文章就介绍到这了。

点击拿去
50G+学习视频教程
100+Python初阶、中阶、高阶电子书籍

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

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

相关文章

Centos7系统部署搭建Kafka集群

kafka集群搭建 一、环境准备1.1 服务器准备1.2 版本信息1.3 启动kafka环境1.3.1 获取kafka1.3.2 启动kafka1.3.2.1 kafka && ZooKeeper1.3.2.2 kafak && KRaft 1.4 创建主题1.5 事件写入主题1.6 事件读取1.7 停止kafka环境 二、搭建 kafka 集群2.1 ZooKeeper 集…

chatgpt赋能python:Python如何读取照片

Python如何读取照片 介绍 Python是一种高级编程语言,其简单易用、可扩展性强等特点,使其在数据分析、机器学习等领域得到了广泛应用。而在图像处理领域,Python同样也有着较为优异的表现。本文将介绍Python读取照片的方法,并探讨…

普通2本,去过字节外包,到现在年薪30W+的测试开发,我的2年转行心酸经历...

个人简介 我是一个普通二本大学机械专业毕业,17年毕业,19年转行,目前做IT行业的软件测试已经有3年多,职位是高级测试工程师,坐标上海… 我想现在我也有一点资格谈论关于转行这个话题;希望你在决定转行之前…

Linux下面安装jdk和tomcat

1、jdk的安装 1、上传jdk到 opt目录下面 2、解压jdk tar -xvf jdk-8u281-linux-x64.tar.gz3、一般把jdk放到/usr/local (软件的安装都是放到usr下面) mv jdk1.8.0_281 /usr/local/4、配置环境变量 找到 /etc/profile 进行编辑修改 export JAVA_HOM…

速下载 | 200页幻灯片图解新版《商用密码管理条例》

国家高度重视商用密码工作。2023年4月14日,国务院常务会议审议通过了《商用密码条例》(以下简称《条例》)修订草案。5月24日中华人民共和国中央人民政府网站正式公开修订后的正式稿全文。本次《条例》在密码法框架下进行了全面修订&#xff0…

面试“我“又踩坑了,高频软件测试面试题,项目经验板块(付答案)...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 问题1&#xff1a…

(学习日记)2023.06.07

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

基于ChatGPT使用报告 (针对嵌入式领域测试及心得)

目录 1、基于驱动的日志解析提问 错误日志分析【100%】 报错日志分析【90%】 错误日志分析【60%】 2、基于安卓设备调试提问 adb调试i2c【效率50%】 adb调试gpio【50%】 3、基于高通代码的提问 基于高通代码含义的解析【效率80%】 基于高通新增TP驱动提问【效率50%】…

【区块链 | L2】详解Layer 2扩展解决方案Optimism(OP)是如何工作的?

Optimism是一个快速、稳定、可扩展和低成本的以太坊Layer 2区块链。这意味着它在以太坊区块链(Layer1)之上运行,以帮助缓解拥塞,进而降低交易成本和处理时间。作为现有以太坊软件的最小扩展,Optimism的EVM-equivalent 架构可以扩展以太坊应用程序。如果它能在以太坊上工作…

移动端的加解密

目录 引言 算法分类 密钥介绍 模式介绍 算法介绍 小结 写在最后 引言 今天给大家分享一篇有关移动端加解密的文章。随着移动设备的普及,加密技术在保护用户数据方面变得越来越重要。 本文将为您介绍Android加解密算法的分类、优缺点特性及应用,…

前端Vue实现国际化

国际化实现原理 假设我们有一个变量 msg,但是这个 msg 有两个值,一个是 hello,一个是 你好,现在需要我们根据需要切换 msg 的值,如何做呢? // 定义 msg 值的数据源 const msgList {en: {msg: hello},zh:…

智能批量复制文件,轻松实现文件批量复制并实现编号

您有没有遇到过需要将相同类型的多个文件复制到不同文件夹的情况?这个过程可能会非常耗时,尤其当文件的数量很大且需要进行重复编号时,更是一项非常烦琐的工作。细有一个快手的方法可以实现,如下: 首先,第…

基于spring boot框架访问zookeeper

本地部署zookeeper: 进入zookeeper-3.3.6/conf目录下,将zoo_sample.cfg文件改名为zoo.cfg,再用文本编辑器打开这个文件,修改如下红框位置的内容,改成本地一个可以访问的已有目录: 打开命令行窗口&#xff…

高考开始了,计算机专业未来还会火吗?

2023年高考,今天开始第一场考试。而走出考场,考生们也将面临选报专业的难题。高考人数逐年攀升,录取率却不断下降。 过去10年,计算机专业可谓红透半边天,早早进入这个行业的,基本都吃到了很高的红利。然而…

动态规划母题:01背包问题

1. 前置知识 动态规划与图论,前缀和与差分等有模板的算法不同,动态规划更考察思维能力,而不是运用模板的能力。 个人认为 Acwing 关于动态规划的讲解比较容易理解。我会根据 Acwing 的动态规划解题思路来讲解题目。 虽说动态规划没有固定的模…

基于Locust实现MQTT协议服务的压测脚本

一、背景简介 业务背景大概介绍一下,就是按照国标规定,车辆需要上传一些指定的数据到ZF的指定平台,同时车辆也会把数据传到企业云端服务上,于是乎就产生了一些性能需求。 目前我们只是先简单的进行了一个性能场景的测试&#xf…

PMP考试到底难在哪里?

那么,PMP考试到底难在哪? 01涉及面广 目前PMP考试内容大部分来源于教材《PMBOK指南》和《敏捷实践指南》。 作为考试出题的知识基础《PMBOK指南》,总共有700多页,所覆盖的知识面很广。 另一方面,根据最新版考纲&am…

使用大型语言模(LLM)构建系统(二):内容审核、预防Prompt注入

今天我学习了DeepLearning.AI的 Building Systems with LLM 的在线课程,我想和大家一起分享一下该门课程的一些主要内容。 下面是我们访问大型语言模(LLM)的主要代码: import openai#您的openai的api key openai.api_key YOUR-OPENAI-API-KEY def get_…

媒体邀约分步详解

传媒如春雨,润物细无声,大家好,我是51媒体网 胡老师。 邀请媒体参加活动的有哪些步骤: 活动落地执行:在整个活动方案中,邀请媒体来报道活动,往往会安排在整个活动的中期去做,因此在…

spring-boot集成spring-brick实现动态插件

spring-boot集成spring-brick实现动态插件 spring-boot集成spring-brick实现动态插件 项目结构 & 需求实现spring-boot集成spring-brick 环境说明1. 主程序集成spring-brick 第一步:引入相关依赖第二步:修改程序入口方法第三步:编写配置…