[python数据处理系列] 深入理解与实践基于聚类的过采样与欠采样技术:以K-Means为例

目录

一、过采样介绍

(一)什么是过采样

(二)过采样的优点

(三)过采样的缺点

二、欠采样介绍

(一)什么是欠采样

(二)欠采样的优点

(三)欠采样的缺点

三、基于聚类的欠抽样方法(K-Means欠采样/KMeans-Undersampling)

(一)KMeans欠采样原理及其步骤介绍

(二)为什么不采用简单的欠采样或者过采样而选择Kmeans欠采样

(三)聚类结束后,如何确定多数类样本欠抽样的数据量,并从每个簇中选择样本?------类别权重调整

(1)确定多数类样本欠抽样的数据量-----类别权重调整

(2)从每个簇中选择样本

四、python实现K-Means欠采样

(一)生成数据集

(二)目的

(三)通过Kmeans对X1多数类样本进行聚类

(1)通过手肘法和目标函数确定KMeans的最优K值

(2)选择最优K值后,进行KMeans聚类

(3) 查看每个聚类后类别中的样本数

(4) 计算聚类后每个类别占多数类样本的比例

(5)计算聚类后每个类别中应该抽取的样本数

(6)抽取数据

①随机无放回抽取33个标签为0的样本

 ②随机无放回抽取30个标签为1的样本

 ③随机无放回抽取50个标签为2的样本

 ④随机无放回抽取52个标签为3的样本

 ④随机无放回抽取15个标签为4的样本

 ⑤合并各类抽取后的数据

(四) 将180个多数类样本,和90个少数类样本进行整合。(目标就是多数类样本:少数类样本=2:1)

五、基于聚类的过抽样方法(K-Means过抽样)

六、python实现KMeans过抽样

(一)目的

(二)通过Kmeans对X2少数类样本进行聚类

(1)通过手肘法和目标函数确定KMeans的最优K值

(2)选择最优K值后,进行KMeans聚类

(3) 查看每个聚类后类别中的样本数 

(4) 计算聚类后每个类别占少数类样本的比例 

(5)计算聚类后每个类别中应该抽取的样本数

(6)抽取数据

①随机无放回抽取2个标签为0的样本 

②随机无放回抽取2个标签为1的样本 

③随机无放回抽取3个标签为2的样本 

④随机无放回抽取3个标签为3的样本 

 ⑤合并各类抽取后的数据

(三) 将200个多数类样本,和100个少数类样本进行整合。(目标就是多数类样本:少数类样本=2:1) 


一、过采样介绍

(一)什么是过采样

过采样是一种处理数据不平衡问题的方法,特别是在分类问题中,当某个类别的样本数量远远少于其他类别时,会导致模型在训练和预测中对少数类别的识别能力下降。过采样的主要目的是增加少数类别的样本数量,以改善数据的平衡。

(二)过采样的优点

1.  提高模型对少数类别的识别能力:通过增加少数类别的样本数量,使得模型更容易学习并识别少数类别的特征,从而提高模型在少数类别上的性能。
2.  不丢失信息:过采样生成的新样本是基于原始数据生成的,因此不会丢失原始数据的信息,保留了数据的特征。

(三)过采样的缺点

1.  容易引入噪声:过采样生成的新样本可能并不完全符合真实数据分布,可能会引入噪声,导致模型过拟合。
2.  增加计算复杂度和训练时间:过采样会增加数据集的大小,从而增加模型的计算复杂度和训练时间,尤其是在数据量较大的情况下。

二、欠采样介绍

(一)什么是欠采样

欠采样是一种处理数据不平衡问题的方法,与过采样相反,它是通过减少多数类别的样本数量来实现数据平衡,从而解决在分类问题中多数类别样本数量远远大于少数类别样本数量的情况。

(二)欠采样的优点

1.  减少训练时间和计算复杂度:由于减少了多数类别的样本数量,可以减少模型的训练时间和计算复杂度,提高训练效率。
2.  降低过拟合的风险:减少多数类别的样本数量可以降低模型对多数类别的过度拟合,使得模型更加泛化。

(三)欠采样的缺点

1.  可能丢失重要信息:欠采样会舍弃多数类别的样本,可能会丢失一些重要信息,导致模型在多数类别上的性能下降。
2.  容易丢失少数类别的特征:由于减少了多数类别的样本数量,模型可能无法充分学习到少数类别的特征,导致在少数类别上的性能下降。

三、基于聚类的欠抽样方法(K-Means欠采样/KMeans-Undersampling)

(一)KMeans欠采样原理及其步骤介绍

KMeans欠采样是一种处理不平衡数据集的方法,它结合了聚类和欠采样的思想,通过聚类的方式选择代表性样本,以平衡数据集并提高模型性能。

具体步骤如下:

1.  数据预处理:对数据进行预处理,包括缺失值处理、数据标准化等。
    
2.  KMeans聚类:使用KMeans聚类算法对数据的多类样本数据进行聚类,将数据分成K个簇。
    
3.  选择代表性样本:从每个簇中选择代表性样本,可以选择簇中的中心点或者随机选择一个样本,若在这个簇中需要选取多个样本,可以考虑有放回选取和无放回选取,建议采用无放回选取
    
4.  构建新的数据集:将选择的代表性样本组成新的数据集,用于模型训练和预测。
    
5.  模型训练和预测:使用新的数据集训练模型,并对测试集进行预测。

通过KMeans欠采样,可以有效地平衡数据集,提高模型对少数类样本的学习能力,从而提高分类性能。

(二)为什么不采用简单的欠采样或者过采样而选择Kmeans欠采样

简单的欠采样和过采样方法在处理不平衡数据集时存在一些问题,比如欠采样可能导致信息丢失,过采样可能引入噪声。

KMeans欠采样是一种结合了聚类和欠采样的方法,可以一定程度上克服简单欠采样和过采样的缺点,具有以下优点:

1.  保留数据分布特征:KMeans欠采样通过聚类的方式选择代表性样本,能够更好地保留原始数据的分布特征,避免了简单欠采样可能导致的信息丢失问题。
    
2.  减少噪声引入:KMeans欠采样在选择样本时考虑了样本之间的相似性,避免了简单过采样可能引入的噪声问题,提高了模型的泛化能力。
    
3.  降低计算成本:KMeans欠采样通过聚类的方式减少了样本数量,可以降低模型训练和预测的计算成本,提高了效率。
    
4.  提高分类性能:KMeans欠采样能够更好地平衡数据集,提高了模型对少数类样本的学习能力,从而提高了分类性能。

综上所述,KMeans欠采样是一种比简单欠采样和过采样更加有效的处理不平衡数据集的方法,能够在一定程度上解决不平衡数据集带来的挑战,提高模型性能。

(三)聚类结束后,如何确定多数类样本欠抽样的数据量,并从每个簇中选择样本?------类别权重调整

(1)确定多数类样本欠抽样的数据量-----类别权重调整

前提:正类数量:负类数量>真实世界的真实比例

在处理二分类问题时,我们经常遇到正类和负类样本数量不平衡的情况。假设在一个实际的二分类问题中,正类的样本数量为 N1,而负类的样本数量为N2,并且 N1显著大于 N2。N1/N2的比例远大于真实世界这两种类别的比例。

一旦我们知道了真实的正负类比例ratio,我们可以使用这个信息来调整训练数据,使得模型训练过程中的样本分布更加接近真实世界的分布。为了达到这个目的,我们可以采用KMeans欠采样策略,以负类样本的数量N2作为基准,对正类样本进行欠采样。

通过欠采样,我们希望获得的新的正类样本数量 N1_new 应该与负类样本数量N2成比例,

即:

N1_new=ratio*N2

这就是通过进行类别权重调整,来确定多数类样本欠抽样时的数据量。

这样,经过欠采样后的正类样本数量  将更接近于实际情况下的正负类比例,有助于提高模型的泛化能力和避免过拟合。

补充:这个ratio我们也可以人为的设定

(2)从每个簇中选择样本

上边我们确定了多数类样本也就是正类样本进行欠抽样的数据量N2_new

那么怎么从K个簇中,每个簇中抽取样本呢?

首先,确定从每个簇中抽取的样本量ni:

ni=(N1_i/N2)*N1_new

i=1,2,3,4,5,6......k(k个簇)

其中N1_i,代表聚类后第i个簇中的样本量,N1_i/N1代表第i个簇中的样本量占整个多类样本数量的比例

ni也就是确定的每个簇中抽取的样本量

每次从各个簇中抽取样本时,建议采用不放回抽样,这样可以保证尽量不丢失原始数据的信息,保留数据的特征。

四、python实现K-Means欠采样

(一)生成数据集

import numpy as np
from sklearn.datasets import make_blobsX1, Y1 = make_blobs(n_samples=200, centers=1, random_state=0)
X2, Y2 = make_blobs(n_samples=90, centers=1, random_state=0)X = np.vstack((X1, X2))
Y = np.hstack((Y1, Y2 + 1))  # 将第二个类别的标签设置为1,以便与第一个类别区分开

如果想要控制每个类别的数量,可以使用n_samples参数分别设置每个类别的数量,然后使用numpy库将数据合并。例如,生成200个样本属于第一个类别,90个样本属于第二个类别:.

import pandas as pd# 将 Y 转换为 Pandas Series
Y_series = pd.Series(Y)# 计算 Y 中每个类别的数量
class_counts = Y_series.value_counts()print(class_counts)

(二)目的

我们想控制Y1类和Y2类的数量比例ratio是2:1,故若采取欠抽样的话,需要从Y1的的样本中抽取出180个样本量,或者说去除20个样本量 。

(三)通过Kmeans对X1多数类样本进行聚类

(1)通过手肘法和目标函数确定KMeans的最优K值
from matplotlib import pyplot as plt
from sklearn.cluster import KMeans
# 使用手肘法确定最佳的K值
plt.rcParams['font.sans-serif'] = ['SimHei']
inertia = []
for k in range(1, 20):kmeans = KMeans(n_clusters=k, random_state=0,init="k-means++")kmeans.fit(X1)inertia.append(kmeans.inertia_)
# 绘制手肘法图表
plt.figure(figsize=(5, 3),dpi=144)
plt.plot(range(1,20), inertia, marker='o', linestyle='--')plt.xlabel('K值')
plt.ylabel('距离平方和')
plt.title('手肘法图表')
plt.savefig('手肘法图.png',dpi=300)
# plt.grid(True)# 设置横坐标刻度值为整数
plt.xticks(range(1, 20, 1))plt.show()

import numpy as np
# Find the K value with the smallest inertia change
#距离平方和得差,也就是每次K值距上一次K值所对应得距离平方和下降程度
inertia_diff = np.diff(inertia)plt.figure(figsize=(5, 3),dpi=144)
inertia_diff_abs = np.abs(inertia_diff)  # 取绝对值,使所有值变为非负
plt.plot(range(2, 20), inertia_diff_abs, marker='o', linestyle='--')
#inertia_diff_abs:取绝对值
plt.xlabel('K值')
plt.ylabel('距离平方和下降程度')
plt.title('目标函数(聚类内部元素的总平方距离下降程度)表')
# plt.savefig('手肘法图.png',dpi=300)
# plt.grid(True)# 设置横坐标刻度值为整数
plt.xticks(range(2, 20, 1))plt.show()

 

通过分析,K的最优取值为5。具体原理和分析过程,不在这里再具体阐述,感兴趣的小伙伴可以查看上一篇博客进行了解。链接如下:

[机器学习系列]深入解析K-Means聚类算法:理论、实践与优化-CSDN博客

(2)选择最优K值后,进行KMeans聚类
kmeans = KMeans(n_clusters=5, random_state=0)
kmeans.fit(X1)print(kmeans.labels_)#获取训练数据所属的类别
(3) 查看每个聚类后类别中的样本数
import pandas as pd# 将 Y 转换为 Pandas Series
kmeans.labels_series = pd.Series(kmeans.labels_)# 计算 Y 中每个类别的数量
class_counts = kmeans.labels_series.value_counts()print(class_counts)

(4) 计算聚类后每个类别占多数类样本的比例
# 计算总数(所有类别的数量)
total_count = class_counts.sum()# 计算每个类别占总数的比例
class_proportions = class_counts / total_countprint(class_proportions)

(5)计算聚类后每个类别中应该抽取的样本数

至于为什么*180,请参考(二)目的第一部分,其中有阐述。

class_proportions*180

那么按照四舍五入,标签为3的这一类从中随机无放回抽取52个样本,标签为2的这一类从中随机无放回抽取50个样本,标签为0的这一类从中随机无放回抽取33个样本,标签为1的这一类从中随机无放回抽取30个样本,标签为4的这一类从中随机无放回抽取15个样本.52+50+33+30+15=180.

(6)抽取数据
# 将 X 转换为 DataFrame
import pandas as pd
df = pd.DataFrame(X1, columns=['Feature1', 'Feature2'])# 将簇标签添加到原始数据中
df["聚类标签结果"]=kmeans.labels_
df

①随机无放回抽取33个标签为0的样本
cluster_zero_df = df[df["聚类标签结果"] == 0]import pandas as pd# 不放回地随机抽取33行数据
sampled_zero = cluster_zero_df.sample(n=33, replace=False)# print(sampled_zero)# 在这段代码中,sample函数用于从DataFrame中抽取样本。参数n=33指定了要抽取的样本数量,而replace=False确保了抽取是不放回的。
 ②随机无放回抽取30个标签为1的样本
cluster_one_df = df[df["聚类标签结果"] == 1]
sampled_one = cluster_one_df.sample(n=30, replace=False)
 ③随机无放回抽取50个标签为2的样本
cluster_two_df = df[df["聚类标签结果"] == 2]
sampled_two = cluster_two_df.sample(n=50, replace=False)
 ④随机无放回抽取52个标签为3的样本
cluster_three_df = df[df["聚类标签结果"] == 3]
sampled_three = cluster_three_df.sample(n=52, replace=False)
 ④随机无放回抽取15个标签为4的样本
cluster_four_df = df[df["聚类标签结果"] == 4]
sampled_four = cluster_four_df.sample(n=15, replace=False)
 ⑤合并各类抽取后的数据
combined_df = pd.concat([sampled_zero, sampled_one, sampled_two, sampled_three,sampled_four], axis=0)

(四) 将180个多数类样本,和90个少数类样本进行整合。(目标就是多数类样本:少数类样本=2:1)

combined_df=combined_df.iloc[:, :2]combined_df["标签"] = 0df_0类样本=combined_dfdf_1类样本= pd.DataFrame(X2, columns=['Feature1', 'Feature2'])df_1类样本["标签"]=Y2+1 #这里Y2为什么加1呢,因为最开始我们生成数据集时,是分开分别生成了两对数据集X1 Y1 和 X2 Y2,实际上Y1和Y2的标签都是0,所以这里让Y2+1变成标签1data= pd.concat([df_0类样本, df_1类样本], axis=0)

五、基于聚类的过抽样方法(K-Means过抽样)

K-Means过抽样的内容和Kmeans欠抽样几乎一致,

不过唯一的不同点就是:

K-means过抽样是以多数类样本为基础,对少数类样本进行聚类。

比如我们想要多数类样本N1_new:少数类样本N2_new=2:1

但是现在多数类样本N1=200,少数类样本N2=90,此时200:90不等2:1

如果以多数类样本N1=N1_New为基础不变,那么N2_new就得等于100,此时少数类样本N2有90个样本了,为了使数据信息充分被利用,那么少数类样本依然选择这90个数据,然后还缺100-90=10个少数类样本,此时就对90个少数类样本进行聚类,聚成K个簇

确定从每个簇中抽取的样本量ni:

ni=(N2_i/N2)*(N2_new-N2)

i=1,2,3,4,5,6......k(k个簇)

其中N2_i,代表第i个簇中的样本量,N2_i/N2代表第i个簇中的样本量占整个多类样本数量的比例

ni也就是确定的每个簇中抽取的样本量

N2_new是希望 抽样结束后,少数类样本的总个数

N2是原始数据中少数类样本的总个数

(N2_new-N2)是希望通过聚类过抽样抽取的少数样本总数。

六、python实现KMeans过抽样

(一)目的

我们想控制Y1类和Y2类的数量比例ratio是2:1,故若采取过抽样的话,以多数类样本数量200不动,少数类样本数量要从90变成100,那么就要将90个少数类样本进行聚类,然后按照比例从每簇中抽取数据,共从中随机无放回抽取出10个少数类样本。

(二)通过Kmeans对X2少数类样本进行聚类

(1)通过手肘法和目标函数确定KMeans的最优K值
from matplotlib import pyplot as plt
from sklearn.cluster import KMeans
# 使用手肘法确定最佳的K值
plt.rcParams['font.sans-serif'] = ['SimHei']
inertia = []
for k in range(1, 20):kmeans = KMeans(n_clusters=k, random_state=0,init="k-means++")kmeans.fit(X2)inertia.append(kmeans.inertia_)
# 绘制手肘法图表
plt.figure(figsize=(5, 3),dpi=144)
plt.plot(range(1,20), inertia, marker='o', linestyle='--')plt.xlabel('K值')
plt.ylabel('距离平方和')
plt.title('手肘法图表')
plt.savefig('手肘法图.png',dpi=300)
# plt.grid(True)# 设置横坐标刻度值为整数
plt.xticks(range(1, 20, 1))plt.show()

import numpy as np
# Find the K value with the smallest inertia change
#距离平方和得差,也就是每次K值距上一次K值所对应得距离平方和下降程度
inertia_diff = np.diff(inertia)plt.figure(figsize=(5, 3),dpi=144)
inertia_diff_abs = np.abs(inertia_diff)  # 取绝对值,使所有值变为非负
plt.plot(range(2, 20), inertia_diff_abs, marker='o', linestyle='--')
#inertia_diff_abs:取绝对值
plt.xlabel('K值')
plt.ylabel('距离平方和下降程度')
plt.title('目标函数(聚类内部元素的总平方距离下降程度)表')
# plt.savefig('手肘法图.png',dpi=300)
# plt.grid(True)# 设置横坐标刻度值为整数
plt.xticks(range(2, 20, 1))plt.show()

通过分析,K的最优取值为5。具体原理和分析过程,不在这里再具体阐述,感兴趣的小伙伴可以查看上一篇博客进行了解。链接如下:

[机器学习系列]深入解析K-Means聚类算法:理论、实践与优化-CSDN博客

(2)选择最优K值后,进行KMeans聚类
kmeans = KMeans(n_clusters=4, random_state=0)
kmeans.fit(X2)
(3) 查看每个聚类后类别中的样本数 
import pandas as pd# 将 Y 转换为 Pandas Series
kmeans.labels_series = pd.Series(kmeans.labels_)# 计算 Y 中每个类别的数量
class_counts = kmeans.labels_series.value_counts()print(class_counts)

(4) 计算聚类后每个类别占少数类样本的比例 
# 计算总数(所有类别的数量)
total_count = class_counts.sum()# 计算每个类别占总数的比例
class_proportions = class_counts / total_countprint(class_proportions)

我们想使多数类样本:少数类样本=2:1,现在是过抽样,以多数类样本的数量200为基础不动,少数类样本应该是有100个,但是现在只有90个,所以需要对这90个样本进行聚类,聚成K个类,然后按照比例分别从这K个类中抽取样本,总共抽取的样本是10个,这样90+10=100少数类样本就一共有100个了,多数类样本:少数类样本就满足比例2:1了。 

(5)计算聚类后每个类别中应该抽取的样本数
class_proportions*10

那么按照四舍五入,标签为2的这一类从中随机无放回抽取3个样本,标签为3的这一类从中随机无放回抽取3个样本,标签为1的这一类从中随机无放回抽取2个样本,标签为0的这一类从中随机无放回抽取2个样本.3+3+2+2=10. 

(6)抽取数据
# 将 X 转换为 DataFrame
import pandas as pd
df = pd.DataFrame(X2, columns=['Feature1', 'Feature2'])# 将簇标签添加到原始数据中
df["聚类标签结果"]=kmeans.labels_
df

①随机无放回抽取2个标签为0的样本 
cluster_zero_df = df[df["聚类标签结果"] == 0]
sampled_zero = cluster_zero_df.sample(n=2, replace=False)
②随机无放回抽取2个标签为1的样本 
cluster_one_df = df[df["聚类标签结果"] == 1]
sampled_one = cluster_one_df.sample(n=2, replace=False)
③随机无放回抽取3个标签为2的样本 
cluster_two_df = df[df["聚类标签结果"] == 2]
sampled_two = cluster_two_df.sample(n=3, replace=False)
④随机无放回抽取3个标签为3的样本 
cluster_three_df = df[df["聚类标签结果"] == 3]
sampled_three = cluster_three_df.sample(n=3, replace=False)
 ⑤合并各类抽取后的数据
combined_df = pd.concat([sampled_zero, sampled_one, sampled_two, sampled_three], axis=0)

(三) 将200个多数类样本,和100个少数类样本进行整合。(目标就是多数类样本:少数类样本=2:1) 

combined_df=combined_df.iloc[:, :2]combined_df["标签"] = 1df_1类抽样样本=combined_dfdf_1类样本= pd.DataFrame(X2, columns=['Feature1', 'Feature2'])df_0类样本= pd.DataFrame(X1, columns=['Feature1', 'Feature2'])
df_0类样本["标签"]=Y1
data= pd.concat([df_0类样本, df_1类样本,df_1类抽样样本], axis=0)

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

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

相关文章

clickhouse学习笔记05

ClickHouseSpringBoot2.XMybatisPlus整合搭建 添加需要的依赖: 添加clickhouse依赖: 配置数据库配置: 我们框架就搭建完了。 ClickHouse的项目案例统计需求讲解 ClickHouse的项目案例统计库表和数据准备 添加数据: 数据都插入进来…

js逆向进阶篇-某团酒店

提示!本文章仅供学习交流,严禁用于任何商业和非法用途,未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,如有侵权,可联系本文作者删除! 案例分析: 先来看看请求中有哪些参数是需要我们逆向,如下: mtgsig、fp、roh…

ERROR: [7df2405] missing Change-Id in commit message footer

git push origin HEAD:refs/for/[分支名] 使用“git push origin HEAD:refs/for/[分支名]”,报错信息见下图 报错信息:ERROR: [7df2405] missing Change-Id in commit message footer 解决办法 根据git的提示依次执行下面的语句即可 第一步:输入下面的语句,下载一个 g…

Java---数据类型与变量

1.字面常量 字面常量就是我们经常所说的常量,常量即在程序运行期间,固定不变的量。且常量是无法改变的,如果我们的代码有改变常量的操作,程序就会报错。 1.1字面常量的分类 字符串常量,整型常量,浮点数常…

FileLink内外网文件摆渡系统产品介绍

在现代企业中,往往存在着多个网络、系统之间的数据孤岛问题,数据难以互相访问和共享。 一、常用的内外网文件摆渡方式 传统的数据交换方式往往需要人工介入,效率低下且容易出错。如:U盘、FTP、VPN等,极易引发各种各样…

Mysql事务—隔离级别—脏读、不可重复读、幻读-遥遥领先版

事务的基本概念 事务就是一组原子性的操作,这些操作要么全部发生,要么全部不发生。事务把数据库从一种一致性状态转换成另一种一致性状态。 事务最经典也经常被拿出来说例子就是转账了。 假如小明要给小红转账1000元,这个转账会涉及到两个…

libcudart.so.10.2: cannot open shared object file: No such file or directory

文章目录 整体过程细节在虚拟环境中安装cuda 10.2在虚拟环境中安装cuda 12.1 整体过程 首先出现这个报错说明在/usr/local/cuda-11.5/lib64目录中确实没有libcudart.so.10.2这个文件,然后按照网上的教程,我在虚拟环境中安装了cuda10.2(由于用…

mysql面试题九(SQL优化)

目录 1.一条 SQL 是如何执行的 2.索引失效的几种情况 3.EXPLAIN 4.Where 子句如何优化 5.超大分页或深度分页如何处理 6.大表查询如何优化 7.分库分表 基本概念 分库分表方法 水平拆分 垂直拆分 分库分表后的注意事项 1.一条 SQL 是如何执行的 在MySQL中&#xff0…

uni-app - 使用地图功能打包安卓apk的完美流程以及重要的注意事项(带您一次打包成功)

在移动应用开发中,地图功能是一个非常常见且实用的功能,可以帮助用户快速定位并浏览周边信息。而在uni-app开发中,使用地图功能也是一项必备技能。本文将介绍uni-app使用地图功能打包安卓apk的注意事项,帮助开发者顺利完成地图功能…

掼蛋跟牌技巧

掼蛋跟牌是指其他玩家领出牌,自己跟着出牌,在跟牌的时候,分为强牌和弱牌两种情况,一般强牌以顺牌为主,弱牌以顶牌为主。 一、上家领出牌 在游戏前期,上家领出牌的时候,应该尽量跟牌,…

Pulsar 2

文章目录 一、Pulsar高级组件基本使用1、Funcation(轻量级计算流程)概念与使用Function背景介绍什么是Functions如何使用 2、Pulsar Connector 连接器Pulsar Connector 连接器 ----> Pulsar Flink Connector 3、Transactions事务支持相关的操作Pulsar如何实现Exactly-OncePu…

2024年的Java版本选择?java 17 安装

文章目录 2024年的Java版本选择?java 1.8 和 java17 什么区别?java 17 安装windows 11安装java 17C:\Program Files\Common Files\Oracle\Java\javapath是什么 2024年的Java版本选择? 3年前,java 1.8是市场主流(还有一…

BUU_RE

findit String m String.valueOf(x) valueOf()将不同类型数据转换为字符串 m.equals(edit.getText().toString()) edit.getText()通常用于从用户界面中获取文本输入,toString()方法将其转换为字符串,然后使用equals()方法进行比较 我改成了c代码&a…

乐观锁悲观锁

视频:什么是乐观锁?什么是悲观锁?_哔哩哔哩_bilibili

大象机器人开源六轴协作机械臂myCobot 320 手机摄影技术!

引言 有没有遇到过这样的情况:当你手持手机或相机准备拍摄视频时,心中已经构想了完美的画面,但却因为实际的限制无法捕捉到理想中的角度?这种情况可能会让人感到挫折。例如,如果想要从地面一只蚂蚁的视角拍摄&#xff…

【数据结构7-1-查找-线性-二分法-二叉树-哈希表】

目录 1 查找基本概念2 线性表的查找2.1 顺序查找2.2 二分法查找2.3 分块查找 3 树表的查询3.1 二叉排序树3.1.1 定义3.1.2 二叉树的建立、遍历、查找、增加、删除:3.1.3 代码实现: 3.2 平衡二叉树3.2.1 平横因子3.2.2 不平横树的调整-左旋3.2.3 不平横树…

[系统安全] 六十.威胁狩猎 (1)APT攻击检测及防御与常见APT组织的攻击案例分析

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…

[极客大挑战 2019]Upload、[ACTF2020 新生赛]Upload、[MRCTF2020]你传你呢

[极客大挑战 2019]Upload 打开环境&#xff0c;是上传一句话木马的题 先上传1.php试试&#xff0c;发现不可以 试试改后缀为phtml&#xff0c;提示语句中不能包含<?&#xff0c;只能改木马&#xff1a; <script language"php">eval($_POST[line]);</sc…

机器学习-11-卷积神经网络-基于paddle实现神经网络

文章目录 总结参考本门课程的目标机器学习定义第一步&#xff1a;数据准备第二步&#xff1a;定义网络第三步&#xff1a;训练网络第四步&#xff1a;测试训练好的网络 总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍基于paddle实现神经网络。 参考 MNIST 训练_副…

编译Qt6.5.3LTS版本(Mac/Windows)的mysql驱动(附带编译后的全部文件)

文章目录 0 背景1 编译过程2 福利参考 0 背景 因为项目要用到对MYSQL数据库操作&#xff0c;所以需要连接到MYSQL数据库。但是连接需要MYSQL驱动&#xff0c;但是Qt本身不自带MYSQL驱动&#xff0c;需要自行编译。网上有很多qt之前版本的mysql驱动&#xff0c;但是没有找到qt6…