Python教程-Python中的DBSCAN算法
在本教程中,我们将学习如何在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
当我们按Enter键时,numpy库将开始在系统中安装。
段时间后,我们将看到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()
输出:
如我们在输出中所看到的,我们使用数据集的数据点绘制了图表,并使用不同颜色标记数据点来可视化聚类。
步骤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()
输出:
通过调整DBSCAN函数的参数并观察输出,我们可以清晰地看到数据点聚类散布的变化。通过观察这些变化,我们也可以理解DBSCAN算法的工作原理以及它如何有助于可视化数据集中数据点的聚类散布情况。