在本教程中,我们将学习如何在Python中实现和使用DBSCAN算法。

1996年,首次提出了DBSCAN(Density-Based Spatial Clustering of Applications with Noise)聚类算法,并在2014年获得了“时间考验”奖。数据挖掘会议KDD授予了DBSCAN“时间考验”奖。在这里,我们将不学习DBSCAN算法本身,只讨论如何在Python中实现DBSCAN算法。但是,如果要理解DBSCAN算法的实现,我们应该至少对它有一个基本的了解。因此,如果您不知道DBSCAN算法是什么以及它如何工作,建议您首先学习DBSCAN算法及其工作原理。

在Python中实现DBSCAN算法

我们将在本节中执行DBSCAN算法的实现操作,我们将分步进行,以便更容易理解和学习。在此实现过程中,我们将使用一个数据集来执行各种操作(包括在DBSCAN算法中执行的操作)。在开始实现过程之前,我们应该满足在Python程序中实现DBSCAN算法的先决条件。

实现DBSCAN算法的先决条件:

在继续本节中的DBSCAN算法实现之前,我们必须满足以下先决条件:

1. Numpy库: 确保numpy库已安装在我们的系统中,并且是最新版本,因为我们将在实现过程中使用numpy库的功能在数据集上执行操作。如果numpy库未在系统中安装或以前未安装,则可以使用以下命令在设备中的命令提示符终端中安装它:

pip install numpy  

325-1.png

当我们按Enter键时,numpy库将开始在系统中安装。

325-2.png

段时间后,我们将看到numpy库成功地安装到我们的系统中(在这里,我们的系统中已经有了numpy库)。

2. Pandas库: 与numpy库类似,pandas库也是必需的库,应该在我们的系统中。如果它未在系统中安装,我们可以使用以下命令使用pip安装它:

pip install pandas  

3. Matplotlib库: 这也是DBSCAN算法实现过程中的重要库,因为该库的功能将帮助我们显示数据集的结果。如果matplotlib库未在系统中存在,则可以使用以下命令在命令提示符终端中安装它:

pip install matplotlib  

4. Sklearn库: Sklearn库将是DBSCAN算法实现操作的主要要求之一,因为我们必须在程序中从Sklearn库的各个模块中导入各种模块,例如预处理、分解等。因此,我们应该确保Sklearn库是否存在于我们的系统中,如果没有,可以使用以下命令在命令提示符终端中安装它:

pip install matplotlib  

5.最后但同样重要的是,我们还应该了解DBSCAN算法(它是什么以及它如何工作),如前所述,以便我们可以轻松理解在Python中的实现。

在继续之前,我们应该确保已满足上面列出的所有先决条件,以便在遵循实施步骤时不会遇到任何问题。

实施DBSCAN算法的步骤:

现在,我们将在Python中执行DBSCAN算法的实现。正如前面提到的,我们将分步进行,以便实现部分不会变得复杂,我们可以轻松理解它。为了实现DBSCAN算法及其逻辑,我们必须遵循以下步骤:

步骤1:导入所有必需的库:

首先,我们必须导入在先决条件部分安装的所有必需库,以便我们可以在实施DBSCAN算法时使用它们的功能。

在这里,我们首先在程序中导入了所有必需的库或库的模块:

# Importing numpy library as nmp  
import numpy as nmp  
# Importing pandas library as pds  
import pandas as pds  
# Importing matplotlib library as pplt  
import matplotlib.pyplot as pplt  
# Importing DBSCAN from cluster module of Sklearn library  
from sklearn.cluster import DBSCAN  
# Importing StandardSclaer and normalize from preprocessing module of Sklearn library  
from sklearn.preprocessing import StandardScaler  
from sklearn.preprocessing import normalize  
# Importing PCA from decomposition module of Sklearn  
from sklearn.decomposition import PCA  

步骤2:加载数据:

在这一步中,我们必须加载数据,我们可以通过导入或加载数据集(DBSCAN算法需要处理的数据集)到程序中来完成这一步。要加载数据集到程序中,我们将使用pandas库的read.csv()函数,并打印数据集的信息,如下所示:

# Loading the data inside an initialized variable  
M = pds.read_csv('sampleDataset.csv') # Path of dataset file  
# Dropping the CUST_ID column from the dataset with drop() function  
M = M.drop('CUST_ID', axis = 1)  
# Using fillna() function to handle missing values  
M.fillna(method ='ffill', inplace = True)  
# Printing dataset head in output  
print(M.head())  

输出:

       BALANCE  BALANCE_FREQUENCY  ...  PRC_FULL_PAYMENT  TENURE
0    40.900749           0.818182  ...          0.000000      12
1  3202.467416           0.909091  ...          0.222222      12
2  2495.148862           1.000000  ...          0.000000      12
3  1666.670542           0.636364  ...          0.000000      12
4   817.714335           1.000000  ...          0.000000      12

[5 rows x 17 columns]

当我们运行程序时,将打印出如上所示的数据,我们将使用从加载的数据集文件中的数据。

步骤3:数据预处理:

现在,我们将开始在此步骤中对数据集的数据进行预处理,使用Sklearn库函数的预处理模块的功能。在预处理数据时,我们必须使用以下技术:

# Initializing a variable with the StandardSclaer() function  
scalerFD = StandardScaler()  
# Transforming the data of dataset with Scaler  
M_scaled = scalerFD.fit_transform(M)  
# To make sure that data will follow gaussian distribution  
# We will normalize the scaled data with normalize() function  
M_normalized = normalize(M_scaled)  
# Now we will convert numpy arrays in the dataset into dataframes of panda  
M_normalized = pds.DataFrame(M_normalized)  

步骤4:降低数据的维度:

在这一步中,我们将降低已标准化和规范化数据的维度,以便更容易在程序中可视化数据。为了转换数据并降低其维度,我们必须使用PCA函数的以下方式:

# Initializing a variable with the PCA() function  
pcaFD = PCA(n_components = 2) # components of data  
# Transforming the normalized data with PCA  
M_principal = pcaFD.fit_transform(M_normalized)  
# Making dataframes from the transformed data  
M_principal = pds.DataFrame(M_principal)  
# Creating two columns in the transformed data  
M_principal.columns = ['C1', 'C2']  
# Printing the head of the transformed data  
print(M_principal.head())  

输出:

         C1        C2
0 -0.489949 -0.679976
1 -0.519099  0.544828
2  0.330633  0.268877
3 -0.481656 -0.097610
4 -0.563512 -0.482506

如输出中所示,我们使用PCA将规范化后的数据转换为两个组件,即两列(可以在输出中看到它们),然后使用pandas库的dataframe()函数从转换后的数据中创建数据框。

步骤5:构建聚类模型:

现在,这是实现中最重要的一步,因为在这里我们必须构建数据的聚类模型(在其上执行操作),我们可以使用Sklearn库的DBSCAN函数来完成这一步,如下所示:

# Creating clustering model of the data using the DBSCAN function and providing parameters in it  
db_default = DBSCAN(eps = 0.0375, min_samples = 3).fit(M_principal)  
# Labelling the clusters we have created in the dataset  
labeling = db_default.labels_  

步骤6:可视化聚类模型:

# Visualization of clustering model by giving different colours  
colours = {}  
# First colour in visualization is green  
colours[0] = 'g'  
# Second colour in visualization is black  
colours[1] = 'k'  
# Third colour in visualization is red  
colours[2] = 'r'  
# Last colour in visualization is blue  
colours[-1] = 'b'  
# Creating a colour vector for each data point in the dataset cluster  
cvec = [colours[label] for label in labeling]  
# Construction of the legend  
# Scattering of green colour  
g = pplt.scatter(M_principal['C1'], M_principal['C2'], color ='g');  
# Scattering of black colour  
k = pplt.scatter(M_principal['C1'], M_principal['C2'], color ='k');  
# Scattering of red colour  
r = pplt.scatter(M_principal['C1'], M_principal['C2'], color ='r');  
# Scattering of green colour  
b = pplt.scatter(M_principal['C1'], M_principal['C2'], color ='b');   
# Plotting C1 column on the X-Axis and C2 on the Y-Axis  
# Fitting the size of the figure with figure function  
pplt.figure(figsize =(9, 9))  
# Scattering the data points in the Visualization graph  
pplt.scatter(M_principal['C1'], M_principal['C2'], c = cvec)  
# Building the legend with the coloured data points and labelled  
pplt.legend((g, k, r, b), ('Label M.0', 'Label M.1', 'Label M.2', 'Label M.-1'))  
# Showing Visualization in the output  
pplt.show()  

输出:

325-3.png

325-4.png

如我们在输出中所看到的,我们使用数据集的数据点绘制了图表,并使用不同颜色标记数据点来可视化聚类。

步骤7:调整参数:

在这一步中,我们将通过更改以前在DBSCAN函数中给定的参数来调整模型的参数,如下所示:

# Tuning the parameters of the model inside the DBSCAN function  
dts = DBSCAN(eps = 0.0375, min_samples = 50).fit(M_principal)  
# Labelling the clusters of data points  
labeling = dts.labels_  

步骤8:可视化更改:

现在,在调整了我们创建的聚类模型的参数之后,我们将通过以前的方式使用不同颜色标记数据集中的数据点来可视化更改。

# Labelling with different colours  
colours1 = {}  
# labelling with Red colour  
colours1[0] = 'r'  
# labelling with Green colour  
colours1[1] = 'g'  
# labelling with Blue colour  
colours1[2] = 'b'  
colours1[3] = 'c'  
# labelling with Yellow colour  
colours1[4] = 'y'  
# Magenta colour  
colours1[5] = 'm'  
# labelling with Black colour  
colours1[-1] = 'k'  
# Labelling the data points with the colour variable we have defined  
cvec = [colours1[label] for label in labeling]  
# Defining all colour that we will use  
colors = ['r', 'g', 'b', 'c', 'y', 'm', 'k' ]  
# Scattering the colours onto the data points  
r = pplt.scatter(  
        M_principal['C1'], M_principal['C2'], marker ='o', color = colors[0])  
g = pplt.scatter(  
        M_principal['C1'], M_principal['C2'], marker ='o', color = colors[1])  
b = pplt.scatter(  
        M_principal['C1'], M_principal['C2'], marker ='o', color = colors[2])  
c = pplt.scatter(  
        M_principal['C1'], M_principal['C2'], marker ='o', color = colors[3])  
y = pplt.scatter(  
        M_principal['C1'], M_principal['C2'], marker ='o', color = colors[4])  
m = pplt.scatter(  
        M_principal['C1'], M_principal['C2'], marker ='o', color = colors[5])  
k = pplt.scatter(  
        M_principal['C1'], M_principal['C2'], marker ='o', color = colors[6])  
# Fitting the size of the figure with figure function  
pplt.figure(figsize =(9, 9))  
# Scattering column 1 into X-axis and column 2 into y-axis  
pplt.scatter(M_principal['C1'], M_principal['C2'], c = cvec)  
# Constructing a legend with the colours we have defined  
pplt.legend((r, g, b, c, y, m, k),  
           ('Label M.0', 'Label M.1', 'Label M.2', 'Label M.3', 'Label M.4','Label M.5', 'Label M.-1'), # Using different labels for data points  
           scatterpoints = 1, # Defining the scatter point  
           loc ='upper left', # Location of cluster scattering  
           ncol = 3, # Number of columns  
           fontsize = 10) # Size of the font  
# Displaying the visualisation of changes in cluster scattering  
pplt.show()  

输出:

325-5.png
325-6.png

通过调整DBSCAN函数的参数并观察输出,我们可以清晰地看到数据点聚类散布的变化。通过观察这些变化,我们也可以理解DBSCAN算法的工作原理以及它如何有助于可视化数据集中数据点的聚类散布情况。

标签: Tkinter教程, Tkinter安装, Tkinter库, Tkinter入门, Tkinter学习, Tkinter入门教程, Tkinter, Tkinter进阶, Tkinter指南, Tkinter学习指南, Tkinter进阶教程, Tkinter编程