dbscan算法_sklearn常用聚类算法模型「KMeans、DBSCAN」实践

聚类算法是很重要的一类算法模型,在实际的应用实践中是会经常使用到的,最近的工作类型中大多偏向于有监督学习类型模型的使用,而对于无监督算法模型的使用则使用得相对少了很多,今天就简单的回归一下聚类算法模型,主要是KMeans模型和DBSACN模型的使用。

这两种模型可以说是聚类算法领域里面很具有代表性的算法了,前者是基于样本之间距离的聚类,后者是基于样本集密度的聚类。殊途同归,本二者的本质都是为了最终实现:簇间距离最大,簇内距离最小的目的。

本来想好好介绍一番原理,可是忽然觉得想着想着就越想越多了,这里索性就不再讲解原理了,网上也有很多系列的原理讲解的文章,可以去看看的,这里主要是实践使用分析为主。

使用聚类算法,首先我们要有数据集才可以,这里为了简单,直接使用的是sklearn提供的数据集生成模块,来直接生成我们所需要的数据集,具体实现如下:

def getClusterData(flag=True,ns=1000,nf=2,centers=[[-1,-1],[1,1],[2,2]],cluster_std=[0.4,0.5,0.2]): ''' 得到回归数据 centers(簇中心的个数或者自定义的簇中心) cluster_std(簇数据方差代表簇的聚合程度) ''' if flag: cluster_X,cluster_y=datasets.make_circles(n_samples=ns,factor=.6,noise=.05) else: cluster_X,cluster_y=datasets.make_blobs(n_samples=ns,n_features=nf,centers=centers, cluster_std=cluster_std,random_state=9) return cluster_X,cluster_y

数据集生成的代码块中已经加入了我的注释,相信是比较容易看明白的。

接下来,我们要对原始生成的数据集进行划分,生成训练集和测试集,具体实现方法如下:

def dataSplit(dataset,label,ratio=0.3): ''' 数据集分割-----训练集、测试集合 ''' try: X_train,X_test,y_train,y_test=train_test_split(dataset,label,test_size=ratio) except: dataset,label=np.array(dataset),np.array(label) X_train,X_test,y_train,y_test=train_test_split(dataset,label,test_size=ratio) print '--------------------------------split_data shape-----------------------------------' print len(X_train), len(y_train) print len(X_test), len(y_test) return X_train,X_test,y_train,y_test

上述代码块实现了原始数据集的分割。

之后,我们需要做一点模型持久化存储于加载使用的工作,这也是机器学习或者是深度学习里面很重要的组成部分了,因为当数据集体量增大的时候,每次使用模型都重复去训练模型的时间代价或者是计算代价都是很大的,所以这里要做好已训练完成模型的持久化工作,具体实现方式如下:

 def saveModel(model,save_path="model.pkl"): ''' 模型持久化存储 ''' joblib.dump(model,save_path) print u"持久化存储完成!"  def loadModel(model_path="model.pkl"): ''' 加载保存本地的模型 ''' model=joblib.load(model_path) return model

上述的代码块实现了训练完成模型的本地化存储于加载使用。

完成上述全部工作后,就要开始模型的搭建使用了,具体如下:

def clusterModel(flag=True): ''' Kmeans算法关键参数: n_clusters:数据集中类别数目 DBSCAN算法关键参数: eps: DBSCAN算法参数,即我们的ϵ-邻域的距离阈值,和样本距离超过ϵ的样本点不在ϵ-邻域内 min_samples: DBSCAN算法参数,即样本点要成为核心对象所需要的ϵ-邻域的样本数阈值 ''' X,y=getClusterData(flag=flag,ns=3000,nf=5,centers=[[-1,-1],[1,1],[2,2]], cluster_std=[0.4,0.5,0.2]) X_train,X_test,y_train,y_test=dataSplit(X,y,ratio=0.3) #绘图 plt.figure(figsize=(16,8)) #Kmeans模型 model=KMeans(n_clusters=3,random_state=9) model.fit(X_train) y_pred=model.predict(X_test) plt.subplot(121) plt.scatter(X_test[:, 0], X_test[:, 1],c=y_pred) plt.title('KMeans Cluster Result') #DESCAN模型 # 下面的程序报错:AttributeError: 'DBSCAN' object has no attribute 'predict' # model=DBSCAN(eps=0.1,min_samples=10) # model.fit(X_train) # y_pred=model.predict(X_test) # 改为这样形式的可以了 y_pred=DBSCAN(eps=0.05,min_samples=10).fit_predict(X_test) plt.subplot(122) plt.scatter(X_test[:, 0], X_test[:, 1],c=y_pred) plt.title('DBSCAN Cluster Result') if flag: plt.savefig('circleData.png') else: plt.savefig('blobData.png')

上述代码块实现了KMeans模型和DBSACN模型的构建、训练和使用,我们对测试集的预测结果进行了可视化分析具体如下所示:

Circle数据集模型结果:

b55e583fe6a8d8b29d2d59475a9a8fd0.png

非Circle数据集模型结果:

5464f89ebae3a84c30a5647cadbedbb5.png

整体来看,上述两个数据集KMeans的综合表现优于DBSACN模型,不过这个只是一个简单的实验说明,就是为了熟练一下这两种常用聚类模型的使用,记录学习一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用KMeans聚类、DBSCAN算法对模拟数据进行聚类的示例代码: ```python # 导入必要的库 from sklearn.datasets import make_classification from sklearn.cluster import KMeans, DBSCAN import matplotlib.pyplot as plt # 生成模拟数据 X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, class_sep=0.5, random_state=42) # 使用KMeans聚类 kmeans = KMeans(n_clusters=3, random_state=42) kmeans_labels = kmeans.fit_predict(X) # 使用DBSCAN算法聚类 dbscan = DBSCAN(eps=0.3, min_samples=5) dbscan_labels = dbscan.fit_predict(X) # 绘制聚类结果图像 plt.figure(figsize=(12, 5)) # 绘制KMeans聚类结果 plt.subplot(1, 2, 1) plt.scatter(X[:, 0], X[:, 1], c=kmeans_labels, cmap='rainbow') plt.title('KMeans Clustering') plt.xlabel('Feature 1') plt.ylabel('Feature 2') plt.colorbar() # 绘制DBSCAN聚类结果 plt.subplot(1, 2, 2) plt.scatter(X[:, 0], X[:, 1], c=dbscan_labels, cmap='rainbow') plt.title('DBSCAN Clustering') plt.xlabel('Feature 1') plt.ylabel('Feature 2') plt.colorbar() plt.show() ``` 在上述代码中,我们使用`make_classification`函数生成了一个包含两个特征、三个簇的模拟数据集。接着,我们分别使用KMeans聚类、DBSCAN算法对数据集进行聚类,并将聚类结果绘制成图像。 在图像中,我们可以看到KMeans聚类和DBSCAN算法聚类的结果。其中,KMeans聚类将数据集分成了三个簇,而DBSCAN算法则将数据集中的一些异常点(如图中的蓝色点)作为噪声进行了处理。不同的簇用不同的颜色表示,可以清晰地看出聚类的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值