python+sklearn实现DBSCAN算法

本文所用文件的链接

链接:https://pan.baidu.com/s/1RWNVHuXMQleOrEi5vig_bQ
提取码:p57s

DBSCAN算法

从样本空间中任意选择一个样本, 以事先给定的半径做圆. 凡是被该圆圈中的样本都视为与该样本处于同样的聚类. 以这些被圈中样本为圆心继续做圆.不断的扩大被圈中样本的规模, 直到没有新的样本加入为止, 由此得到一个聚类.

在剩余样本中重复以上过程,直到耗尽样本空间中所有的样本为止.

DBSCAN算法的特点:

  1. 实现给定的半径会影响最后的聚类效果, 可以根据轮廓系数选择较优的方案.

  2. 根据聚类的形成过程, DBSCAN算法支持把样本分为3类:

    外周样本: 被其他样本聚集到某个聚类中, 但无法引入新样本的样本.

    孤立样本: 聚类中样本数低于所设置的下限, 则不称其为聚类, 反之称为孤立样本.

    核心样本: 除了外周样本和孤立样本外的其他样本.

# 构建DBSCAN聚类模型
# eps: 半径
# min_samples: 最小样本数,若低于该值,则为孤立样本
model = sc.DBSCAN(eps=1, min_samples=5)
model.fit(x)
# 获取核心样本的索引
core_indices=best_model.core_sample_indices_
"""
dbscan算法
"""
import numpy as np
import sklearn.cluster as sc
import sklearn.metrics as sm
import matplotlib.pyplot as mp

x = np.loadtxt('../ml_data/perf.txt', 
		       delimiter=',')

# 准备训练模型相关数据
epsilons, scores, models = \
	np.linspace(0.3, 1.2, 10), [], []
# 遍历所有的半径, 训练模型, 查看得分
for epsilon in epsilons:
	model=sc.DBSCAN(eps=epsilon,min_samples=5)
	model.fit(x)
	score=sm.silhouette_score(x, model.labels_, 
		sample_size=len(x), metric='euclidean')
	scores.append(score)
	models.append(model)
# 转成ndarray数组
scores = np.array(scores)
best_i = scores.argmax() # 最优分数的索引
best_eps = epsilons[best_i]
best_sco = scores[best_i]
print(best_eps)
print(best_sco)
# 获取最优模型
best_model = models[best_i]

# 对输入x进行预测得到预测类别
pred_y = best_model.fit_predict(x)

# 获取孤立样本, 外周样本, 核心样本
core_mask = np.zeros(len(x), dtype=bool)
# 获取核心样本的索引, 把对应位置的元素改为True
core_mask[best_model.core_sample_indices_]=True
# 孤立样本的类别标签为-1
offset_mask = best_model.labels_ == -1
# 外周样本掩码 (不是核心也不是孤立样本)
p_mask = ~(core_mask | offset_mask)

# 绘制这些样本数据
mp.figure('DBSCAN cluster', facecolor='lightgray')
mp.title('DBSCAN cluster', fontsize=16)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
# 绘制核心样本
mp.scatter(x[core_mask][:,0], x[core_mask][:,1],
	s=60, cmap='brg', c=pred_y[core_mask])
# 绘制外周样本
mp.scatter(x[p_mask][:,0], x[p_mask][:,1],
	s=60, cmap='brg', c=pred_y[p_mask], 
	alpha=0.5)
# 绘制孤立样本
mp.scatter(x[offset_mask][:,0], 
	x[offset_mask][:,1], s=60, c='gray')
mp.show()

在这里插入图片描述

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值