机器学习实战篇——肿瘤良性/恶性分类器(二元逻辑回归)

机器学习之实战篇——肿瘤良性/恶性分类器(二元逻辑回归)

  • 前言
  • 数据集和实验文件下载
  • 相关文章推荐
  • 实验过程
    • 导入相关模块
    • 数据预处理
    • 手写二元逻辑回归模型(小批量梯度下降)
    • sklearn逻辑回归器

前言

实验中难免有许多缺陷和错误,望批评指正!
如环境配置(jupyter notebook、模块不兼容)遇到问题,可参考传送门

数据集和实验文件下载

通过百度网盘分享的文件:肿瘤诊断.zip
链接:https://pan.baidu.com/s/1Q55Y71pEC4G51AFjfuJ18g?pwd=tmdt
提取码:tmdt

相关文章推荐

二元逻辑回归详细笔记可以看这篇,本实验中的核心内容在文章中均有详细解析:
机器学习之监督学习(二)二元逻辑回归

实验过程

导入相关模块

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from logistic_regression import *
import sklearn
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score,precision_score,recall_score,roc_auc_score,roc_curve,confusion_matrix,precision_recall_curve,f1_score,fbeta_score,auc
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_validate,train_test_split

其中logistic_regression.py是自己编写的模块,主要包括两部分内容:
①手动二元逻辑回归(正则化+批量梯度下降)实现代码;
②分类模型效果评估,输出多个评价指标(包括准确率、精确率、召回率、f1_score、fbeta_score、P-R曲线图,ROC曲线,AUC值)
内容如下:

import numpy as np
from math import exp#预测函数
def logistic_predict(X, w, b,sigma=0.5):#simga:阈值,默认值0.5#p:预测的概率向量,y_pred:预测的类别向量m = X.shape[0]y_pred = np.zeros(m)p=np.zeros(m)for i in range(m):z_i = np.dot(X[i], w) + by_pred[i] = sigmoid(z_i) >= sigma  # p[i]=sigmoid(z_i)return p,y_pred# sigmoid函数
def sigmoid(z):return 1 / (1 + exp(-z))# 计算代价的函数(引入正则化)
def get_cost_logistic(X, y, w, b, lamb):m = X.shape[0]cost = 0.0for i in range(m):z_i = np.dot(X[i], w) + bf_wb_i = sigmoid(z_i)cost += -y[i] * np.log(f_wb_i) - (1 - y[i]) * np.log(1 - f_wb_i)cost = cost / m# 添加正则化项reg_cost = (lamb / (2 * m)) * np.sum(np.square(w))cost += reg_costreturn cost# 计算梯度的函数(引入正则化)
def get_gradient(X, y, w, b, lamb):m, n = X.shapedj_dw = np.zeros((n,))dj_db = 0for i in range(m):error = sigmoid(np.dot(X[i, :], w) + b) - y[i]dj_db += errorfor j in range(n):dj_dw[j] += (error * X[i, j])# 平均梯度dj_db /= mdj_dw /= m# 添加正则化项的梯度dj_dw += (lamb / m) * wreturn dj_dw, dj_db# 批量梯度下降函数
def gradient_descent(X, y, w_in, b_in, alpha=0.01, lamb=0.01, iters=1000, batch_size=32):'''Args:X:特征矩阵y:目标向量w_in:初始权重向量b_in:初始偏置值alpha:学习率,默认0.01lamb:正则化系数,默认0.01iters:梯度下降迭代次数,默认1000batch_size:随机梯度下降批量,默认32Outputs:w:训练好的权重向量b:训练好的偏置值p:训练中最后的输出概率向量y_hat:训练中最后的输出类别向量cost_his:记录训练过程中的代价历史'''m = X.shape[0]w = w_inb = b_incost_his = []for i in range(iters):# 随机选择batch_size的数据indices = np.random.choice(m, batch_size, replace=False)X_batch = X[indices]y_batch = y[indices]dj_dw, dj_db = get_gradient(X_batch, y_batch, w, b, lamb)w = w - dj_dw * alphab = b - dj_db * alphacost_his.append(get_cost_logistic(X, y, w, b, lamb))  # 计算整个数据集的代价if (i) % (iters / 10) == 0:print(f'iteration: {i}, cost: {cost_his[i]}')print(f'final w: {w}, b: {b}')p,y_hat=logistic_predict(X,w,b)return w, b,p, y_hat,cost_his#绘制P-R曲线函数
def plot_precision_recall_curve(y_train,y_score):# 计算精确率和召回率_precision, _recall, thresholds = precision_recall_curve(y_train, y_score)# 绘制精确率-召回率曲线plt.figure(figsize=(8, 6))plt.plot(_recall, _precision, color='blue')plt.xlabel('召回率 (Recall)')plt.ylabel('精确率 (Precision)')plt.title('Precision-Recall Curve')plt.show()#绘制roc曲线图的函数
def plot_roc_curve(y_train,y_score):# 计算 ROC 曲线fpr, tpr, thresholds = roc_curve(y_train, y_score)# 计算 AUCroc_auc = auc(fpr, tpr)# 绘制 ROC 曲线plt.figure(figsize=(8, 6))plt.plot(fpr, tpr, color='blue', label=f'ROC Curve (AUC = {roc_auc:.2f})')plt.plot([0, 1], [0, 1], color='red', linestyle='--')  # 对角线plt.xlim([0.0, 1.0])plt.ylim([0.0, 1.0])plt.xlabel('假阳性率 (False Positive Rate)')plt.ylabel('真阳性率 (True Positive Rate)')plt.title('Receiver Operating Characteristic (ROC) Curve')plt.legend(loc='lower right')plt.grid()plt.show()return roc_auc#分类效果评价,输出多个评价指标(包括准确率、精确率、召回率、f1_score、fbeta_score、P-R曲线图,ROC曲线,AUC值)
def judge_classification(y_target,y_predicted,y_score):'''Args:y_target:目标向量y_predicted:预测类别向量y_score:预测概率向量'''option=int(input('是否设置fbeta_score,1-yes,0-no'))if option:beta=int(input('输入beta:'))else:beta=1#计算相关指标accuracy = accuracy_score(y_target, y_predicted)confusion_Matrix=confusion_matrix(y_target, y_predicted)precision = precision_score(y_target, y_predicted)recall = recall_score(y_target, y_predicted)F1_score=f1_score(y_target, y_predicted)fBeta_score=fbeta_score(y_target,y_predicted,beta)AUC=roc_auc_score(y_target,y_score)# 打印结果print(f"准确率 (Accuracy): {accuracy:.4f}")print(f'混淆矩阵(Confusion Matrix):{confusion_Matrix}')print(f"精确率 (Precision): {precision:.4f}")print(f"召回率 (Recall): {recall:.4f}")print(f'f1 score:{F1_score:.4f}')if option:print(f'fbeta score:{fBeta_score:4f}')print('P-R曲线图如下:')plot_precision_recall_curve(y_target,y_score)print('roc曲线图如下:')plot_roc_curve(y_target,y_score)print(f'roc_auc_score:{AUC:4f}')

除此外,为了绘图中正确显示中文和负号,需要进行预配置:

# 设置中文字体
import matplotlib
matplotlib.rcParams['font.family'] = 'SimHei'  # 或者 'Microsoft YaHei'
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决负号 '-'

数据预处理

使用pandas的read_excel函数读入数据集,由于原文件中已经将良性和恶性肿瘤的数据分隔开,因此先使用sample函数进行随机打乱,frac=1表示按行打乱

data=pd.read_excel('datasets/肿瘤数据.xlsx',sheet_name='Sheet1').sample(frac=1,random_state=42)

查看数据前五行

data.head()

在这里插入图片描述
查看数据总结信息

data.info()
<class 'pandas.core.frame.DataFrame'>
Index: 675 entries, 396 to 102
Data columns (total 11 columns):#   Column                          Non-Null Count  Dtype 
---  ------                          --------------  ----- 0   id                              675 non-null    int64 1   Clump Thickness                 675 non-null    int64 2   Uniformity of Cell Size         675 non-null    int64 3   Uniformity of Cell Shape        675 non-null    int64 4   Marginal Adhesion               675 non-null    int64 5   Single Epithelial Cell Size     675 non-null    int64 6   Bare Nuclei                     675 non-null    object7   Bland Chromatin                 675 non-null    int64 8   Normal Nucleoli                 675 non-null    int64 9   Mitoses                         675 non-null    int64 10  Class                           675 non-null    object
dtypes: int64(9), object(2)
memory usage: 63.3+ KB

可以发现第6列数据类型为object,说明有异常数值,需要进行数据清洗

数据清洗,'Bare nuclei’一列中有缺失数据,用’?‘表示,将存在缺失数据的行删除,并将该列数据类型调整为int

data['Bare Nuclei']=data['Bare Nuclei'].astype('string')
cond=(data['Bare Nuclei']!='?')
data=data[cond]
data['Bare Nuclei']=data['Bare Nuclei'].astype('int')

观察到id并非有用特征,因此将编号列设为索引

data.set_index('id',drop=True,inplace=True)

提取特征和目标部分

X_=data.iloc[:,:-1]
y_=data.iloc[:,-1]

分割数据集(训练集:测试集=7:3){此实验中不设置验证集}

X_train,X_test,y_train,y_test=train_test_split(X_,y_,test_size=0.3)
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)
(462, 9)
(462,)
(199, 9)
(199,)

特征缩放,使用sklearn.preprocessing的标准化模块,注意这里的数据集由Dataframe直接转化为ndarray类型

scaler=StandardScaler()
X_s=scaler.fit_transform(X_)
X_train_s=scaler.fit_transform(X_train)
X_test_s=scaler.fit_transform(X_test)

输出编码:1-恶性,0-良性,使用map映射函数,传入转化字典

y_train=y_train.map({'良性':0,'恶性':1}).values
y_test=y_test.map({'良性':0,'恶性':1}).values
y_=y_.map({'良性':0,'恶性':1}).values

对另外的预测数据集(无标签)做同样的处理

#读入文件
data_predicted=pd.read_excel('datasets/肿瘤测试数据.xlsx',sheet_name='Sheet1')
#标签列作为索引
data_predicted.set_index('id',drop=True,inplace=True)
X_predicted=data_predicted.iloc[:,:-1]
#用该列均值填充缺失值
X_predicted.replace('?',np.nan,inplace=True)
X_predicted['Bare Nuclei']=X_predicted['Bare Nuclei'].fillna(X_test['Bare Nuclei'].mean())
#特征缩放
X_predicted_s=scaler.fit_transform(X_predicted)
X_predicted_s

手写二元逻辑回归模型(小批量梯度下降)

获取训练集大小,初始化权重向量和偏置值

m,n=X_train_s.shape
w_in=np.zeros(n)
b_in=0

调用手写训练函数开始训练,其中学习率和正则化系数采用默认值0.01,梯度下降批量也采用默认值32,迭代次数设置10000次

%%time
w1,b1,p_train,y_train_hat,his=gradient_descent(X_train_s,y_train,w_in,b_in,iters=10000)
iteration: 0, cost: 0.6835531909218033
iteration: 1000, cost: 0.09561179284006076
iteration: 2000, cost: 0.08143988852386196
iteration: 3000, cost: 0.07602179037731364
iteration: 4000, cost: 0.07297962427710258
iteration: 5000, cost: 0.07104092210035404
iteration: 6000, cost: 0.06952930739554782
iteration: 7000, cost: 0.06836304664921707
iteration: 8000, cost: 0.0674995109940224
iteration: 9000, cost: 0.0668178167569174
final w: [1.45252021 0.53480326 0.76912313 0.661257   0.15524646 1.34568650.90781468 0.86672594 0.80311382], b: -0.7663124236956939
CPU times: total: 25.5 s
Wall time: 1min 33s

绘制学习曲线cost-iteration

plt.plot(his)

在这里插入图片描述
查看训练效果,各种指标的意义请参考机器学习之监督学习(二)二元逻辑回归,输出图可在实验文件中查看。

judge_classification(y_train,y_train_hat,p_train)
是否设置fbeta_score,1-yes,0-no 1
输入beta: 2
C:\Users\21316\.conda\envs\ai\lib\site-packages\sklearn\utils\validation.py:70: FutureWarning: Pass beta=2 as keyword args. From version 1.0 (renaming of 0.25) passing these as positional arguments will result in an errorwarnings.warn(f"Pass {args_msg} as keyword args. From version "
准确率 (Accuracy): 0.9762
混淆矩阵(Confusion Matrix):[[294   4][  7 157]]
精确率 (Precision): 0.9752
召回率 (Recall): 0.9573
f1 score:0.9662
fbeta score:0.960832
P-R曲线图如下:
roc曲线图如下:
推荐阈值0.30989255200204613
roc_auc_score:0.997299

可以看到分类效果还是相当不错的,只有4个假阳性,7个假阴性(从混淆矩阵中看出)。笔者考虑召回率:精准率的权重β=2理由是:个人认为,相比于避免良性肿瘤被误诊为恶性肿瘤,希望更多的恶性肿瘤患者被成功诊断,因此看重召回率,采用f2_score。训练集中的f2_score为0.961,auc=0.997。同时推荐了阈值0.3,我们再测试一下阈值为0.3时的效果。

y_train_hat_=(p_train>0.3)
judge_classification(y_train,y_train_hat_,p_train)
是否设置fbeta_score,1-yes,0-no 1
输入beta: 2
C:\Users\21316\.conda\envs\ai\lib\site-packages\sklearn\utils\validation.py:70: FutureWarning: Pass beta=2 as keyword args. From version 1.0 (renaming of 0.25) passing these as positional arguments will result in an errorwarnings.warn(f"Pass {args_msg} as keyword args. From version "
准确率 (Accuracy): 0.9805
混淆矩阵(Confusion Matrix):[[290   8][  1 163]]
精确率 (Precision): 0.9532
召回率 (Recall): 0.9939
f1 score:0.9731
fbeta score:0.985490
P-R曲线图如下:
roc曲线图如下:
推荐阈值0.30989255200204613
roc_auc_score:0.997299

f2_score提升到了0.9855,显然模型能力得到了提升,因此0.3是更适合这个肿瘤分类器的阈值

再检验手写模型在测试集中表现

p_test,y_test_hat=logistic_predict(X_test_s,w1,b1,0.3)
judge_classification(y_test,y_test_hat,p_test)
是否设置fbeta_score,1-yes,0-no 1
输入beta: 2
C:\Users\21316\.conda\envs\ai\lib\site-packages\sklearn\utils\validation.py:70: FutureWarning: Pass beta=2 as keyword args. From version 1.0 (renaming of 0.25) passing these as positional arguments will result in an errorwarnings.warn(f"Pass {args_msg} as keyword args. From version "
准确率 (Accuracy): 0.9648
混淆矩阵(Confusion Matrix):[[125   5][  2  67]]
精确率 (Precision): 0.9306
召回率 (Recall): 0.9710
f1 score:0.9504
fbeta score:0.962644
P-R曲线图如下:
roc曲线图如下:
推荐阈值0.19691750268862288
roc_auc_score:0.994426

总结一下手写模型:

train(σ=0.5)train(σ=0.3)test (σ=0.3)
ACC0.9630.9800.965
Precision0.9750.9530.931
Recall0.9570.9930.971
f1_score0.9660.9730.950
f2_score0.9610.9850.962
auc0.9970.9970.994

sklearn逻辑回归器

#创建逻辑回归分类器,拟合数据,predict输出预测类别向量,predict_proba输出预测概率向量,采用默认阈值0.5

LR=LogisticRegression()
LR.fit(X_train_s,y_train)
y_train_S=LR.predict(X_train_s)
p_train_S=LR.predict_proba(X_train_s)[:,1]

检验训练效果

judge_classification(y_train,y_train_S,p_train_S)
是否设置fbeta_score,1-yes,0-no 1
输入beta: 2
C:\Users\21316\.conda\envs\ai\lib\site-packages\sklearn\utils\validation.py:70: FutureWarning: Pass beta=2 as keyword args. From version 1.0 (renaming of 0.25) passing these as positional arguments will result in an errorwarnings.warn(f"Pass {args_msg} as keyword args. From version "
准确率 (Accuracy): 0.9740
混淆矩阵(Confusion Matrix):[[293   5][  7 157]]
精确率 (Precision): 0.9691
召回率 (Recall): 0.9573
f1 score:0.9632
fbeta score:0.959658
P-R曲线图如下:
roc曲线图如下:
推荐阈值0.2884938390167448
roc_auc_score:0.997626

测试

y_test_S=LR.predict(X_test_s)
p_test_S=LR.predict_proba(X_test_s)[:,1]
judge_classification(y_test,y_test_S,p_test_S)
是否设置fbeta_score,1-yes,0-no 1
输入beta: 2
C:\Users\21316\.conda\envs\ai\lib\site-packages\sklearn\utils\validation.py:70: FutureWarning: Pass beta=2 as keyword args. From version 1.0 (renaming of 0.25) passing these as positional arguments will result in an errorwarnings.warn(f"Pass {args_msg} as keyword args. From version "
准确率 (Accuracy): 0.9648
混淆矩阵(Confusion Matrix):[[125   5][  2  67]]
精确率 (Precision): 0.9306
召回率 (Recall): 0.9710
f1 score:0.9504
fbeta score:0.962644
P-R曲线图如下:
roc曲线图如下:
推荐阈值0.1641399332130378
roc_auc_score:0.994091

可以看出sklearn逻辑回归器的测试效果和我们手写模型几项指标几乎相等,因此两个模型性能相当。在实验文件中还对另一个无标签数据集进行预测,两个模型预测结果一样,读者可以打开实验文件查看。

最后对整个测试集进行10折交叉验证,可以看到准确率达到0.967

k = 10  # 设定折数
cv_scores = cross_validate(LR, X_s, y_, cv=k, scoring=['precision','recall','accuracy'])print(f"{k}-折交叉验证的平均精准率: {np.mean(cv_scores['test_precision']):.4f}")
print(f"{k}-折交叉验证的平均召回率: {np.mean(cv_scores['test_recall']):.4f}")
print(f"{k}-折交叉验证的平均准确率: {np.mean(cv_scores['test_accuracy']):.4f}")
10-折交叉验证的平均精准率: 0.9579
10-折交叉验证的平均召回率: 0.9486
10-折交叉验证的平均准确率: 0.9667

在这里插入图片描述

对比matlab工具箱中各个分类器的交叉验证结果,可以看出我们设计的分类器效果可以名列前茅,相当不戳。

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

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

相关文章

Mac M1安装Hive

一、下载解压Hive 1.官网地址 https://dlcdn.apache.org/hive/ 2.选择对应版本进行下载&#xff0c;这里我以3.1.3为例&#xff1b; 3.下载好后&#xff0c;进行解压&#xff0c;并重命名为hive-3.1.3&#xff0c;放到资源库目录下&#xff1b; 二、配置系统环境 1.打开~/…

Hack The Box-Infiltrator【更新中】

信息收集&端口利用 nmap -sSVC infiltrator.htbStarting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-02 09:17 CST Nmap scan report for infiltrator.htb Host is up (0.61s latency). Not shown: 987 filtered tcp ports (no-response) PORT STATE SERVICE …

C++竞赛初阶L1-15-第六单元-多维数组(34~35课)551: T456501 计算矩阵边缘元素之和

题目内容 输入一个整数矩阵&#xff0c;计算位于矩阵边缘的元素之和。 所谓矩阵边缘的元素&#xff0c;就是第一行和最后一行的元素以及第一列和最后一列的元素。 输入格式 第 1 行包含两个整数&#xff0c;分别为行数 m 和列数 n&#xff0c;两个整数之间空格隔开。 第 2 …

【单调栈 】2289. 使数组按非递减顺序排列

本文涉及的基础知识点 单调栈分类、封装和总结 LeetCode2289. 使数组按非递减顺序排列 给你一个下标从 0 开始的整数数组 nums 。在一步操作中&#xff0c;移除所有满足 nums[i - 1] > nums[i] 的 nums[i] &#xff0c;其中 0 < i < nums.length 。 重复执行步骤&a…

Sobel算子,Scharr算子和Laplacian算子

图像边缘检测大幅度地减少了数据量&#xff0c;并且剔除了可以认为不相关的信息&#xff0c;保留了图像重要的结构属性。有许多方法用于边缘检测&#xff0c; 绝大部分可以划分为两类&#xff1a;基于搜索和基于零穿越。 基于搜索:通过寻找图像一阶导数中的最大值来检测边界&am…

4.1 数据分析-excel 基本操作

第四节&#xff1a;数据分析-excel 基本操作 课程目标 学会excel 基本操作 课程内容 数据伪造 产生一份招聘数据 import pandas as pd from faker import Faker import random import numpy as np# 创建一个Faker实例&#xff0c;用于生成假数据&#xff0c;指定中文本地…

c# 笔记 winform添加右键菜单,获取文件大小 ,多条件排序OrderBy、ThenBy,list<double>截取前5个

Winform右键菜单‌ 要在C# Winform应用程序中添加右键菜单&#xff0c;‌你可以按照以下步骤操作&#xff1a;‌ 1.‌创建菜单项‌ 在Form的构造函数或加载事件中&#xff0c;‌创建ContextMenuStrip控件的实例&#xff0c;‌并为其添加菜单项。‌ 2.‌绑定到控件‌ 将Con…

踩坑记录(序列化与反序列化)

问题描述 实体类中设定字段名称为 sValue和yValue 返回给前段后,变成了svalue,yvalue 字段设置 测试结果:与字段不符,匹配失败 解决方法 在字段上添加JsonProperty("字段名")注解

报告 | 以消费者为中心,消费品零售行业数字化建设持续深化

​2024年是“消费促进年”&#xff0c;国内消费市场稳步复苏。在消费需求多样化、国家政策的推动下&#xff0c;“数字化转型”仍是消费品零售行业的年度主题词&#xff0c;是品牌方获取核心竞争力的必要途径。消费品零售行业的数字化转型重心有所调整&#xff0c;从线上渠道布…

虚拟系统VS

定义 虚拟系统VS&#xff08;Virtual System&#xff09;是指将一台物理设备PS&#xff08;Physical System&#xff09;虚拟成多个相互隔离的逻辑系统。每个VS独立工作&#xff0c;在业务功能上等同于一台独立的传统物理设备&#xff0c;如图2-1所示。 目的 随着网络规模的不…

macos OneNote 2016 for Mac 官方pkg下载地址 - macos 10.15 Catalion 可用Onenote版本官方下载地址

macos 10.15 Catalion 版本的系统已经无法正常从应用商店下载到可用的Onenote 应用,原因是版本不受支持, 而且onenote官方链接的应用商店地址https://apps.apple.com/us/app/microsoft-onenote/id784801555?mt12在中国地区也无法访问, 所以中国地区用户如果想使用onenote应用…

C语言 | Leetcode C语言题解之第394题字符串解码

题目&#xff1a; 题解&#xff1a; #define N 2000typedef struct {int data[30];;int top; } Stack;void push(Stack *s, int e) { s->data[(s->top)] e; }int pop(Stack *s) { return s->data[--(s->top)]; }//多位数字串转换成int int strToInt(char *s) {cha…

Charles抓包全流程(Mac端+iOS端)

文章目录 与其他抓包软件的对比FiddlerWireShark Charles下载安装及配置Charles抓包实践小结 Charles Proxy是一个广泛使用的网络调试代理工具&#xff0c;它允许开发者监控和分析所有经过计算机的HTTP和SSL/HTTPS网络流量信息。 与其他抓包软件的对比 Fiddler Charles 支持多…

Leetcode3250. 单调数组对的数目 I

Every day a Leetcode 题目来源&#xff1a;3250. 单调数组对的数目 I 解法1&#xff1a;记忆化搜索 题目输入一个数组nums。 假设有两个数组A和B&#xff0c;A递增&#xff0c;B递减&#xff0c;且 Ai Bi numsi ​ 问有多少对(A,B)数组对。 解法&#xff1a; 代码&…

自动回复的客服系统-支持关键词回复或AI智能回复

用户咨询量很大的时候&#xff0c;迫切需要一个自动回复的工具 对于公域流量&#xff0c;非常推荐大家使用网页版在线客服系统&#xff0c;与访客沟通。 既能实现自动回复&#xff0c;又能人工后台即时回复 \/x : llike620

Redis集群搭建以及用idea连接集群

一、redis的集群搭建&#xff1a; 判断一个是集群中的节点是否可用,是集群中的所用主节点选举过程,如果半数以上的节点认为当前节点挂掉,那么当前节点就是挂掉了,所以搭建redis集群时建议节点数最好为奇数&#xff0c;搭建集群至少需要三个主节点,三个从节点,至少需要6个节点。…

Qt/C++百度地图/高德地图/天地图/腾讯地图/谷歌地图/加载绘图工具栏

一、前言说明 在地图中提供一个绘图工具栏&#xff0c;可以便捷的在地图上添加各种覆盖物&#xff0c;比如折线、多边形、矩形、圆形等&#xff0c;然后可以获取这些覆盖物的路径以及中心点等属性。这里有几个小插曲&#xff0c;比如百度地图gl版本默认不提供这个功能&#xf…

TPH-YOLOv5:基于Transformer预测头的改进YOLOv5,用于无人机捕获场景的目标检测

摘要 提出了TPH-YOLOv5。在YOLOv5的基础上&#xff0c;增加了一个预测头来检测不同尺度的目标。然后用Transformer Prediction Heads&#xff08;TPH&#xff09;代替原有的预测头&#xff0c;探索自注意机制的预测潜力。还集成了卷积块注意力模型&#xff08;CBAM&#xff09;…

传统CV算法——图像特征算法之斑点检测算法

文章目录 3. 斑点检测3.1 斑点的理解3.1.1 斑点定义3.1.2 斑点检测 3.2斑点检测基本原理3.3LoG计算流程及原理1. 高斯函数2. 拉普拉斯算子3. 组合高斯和平滑4. 计算 LoG4.1. 一阶导数4.2. 二阶导数4.3. 组合二阶导数 5. LoG 的特性6.多尺度检测 3.4 DOG3.4.1 DoG 的基本原理3.4…

Java中调用第三方接口

文章目录 0、测试接口1、JDK的HttpURLConnection2、Apache的HttpClient3、SpringBoot的RestTemplate3.1 GET3.2 POST 4、SpringCloud的Feign5、Hutool的HttpUtil6、失败后重试 0、测试接口 写两个测试接口&#xff0c;一个GET&#xff0c;一个POST RestController RequestMap…