DBScan+iris数据集实现+参数调节

关于DBScan的理论就不再黏贴了,这里记录一个讲的比较详细的网站 : https://www.cnblogs.com/pinard/p/6208966.html
下午尝试着用iris数据集去测试一下, 但发现效果不太理想,后面又用比较简单的参数调节方法去调参数,似乎也不理想,这里把记录下来以供后面继续研究。

  1. Load data from iris.csv
import pandas as pd
import numpy as np
import math
import operator
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN

data = pd.read_csv("iris.csv")
data = np.mat(data)
  1. Use sklearn.DBSCAN to do the clustering
y_pred = DBSCAN(eps=0.5, min_samples=5).fit_predict(data[:, 1:5])

  1. Show the result
colors = 'gbycm'
y_pred_color = []
category = []
for pred in y_pred:
    if pred == -1:
        color = 'r'
    else:
        color = colors[pred]
    y_pred_color.append(color)

for type in data[:, 5]:
    if type == 'setosa':
        category.append(0)
    elif type == 'versicolor':
        category.append(1)
    elif type == 'virginica':
        category.append(2)
        
plt.scatter(data[:, 0].tolist(), category, c=y_pred_color)
plt.show()

DBScan+iris数据集实现+参数调节_第1张图片

原始数据里是分成三个类别的,但是做了聚类以后只分出了两个类别,考虑可能是eps=0.5, min_samples=5这两个参数选的不好,于是尝试其他参数,但也没有得到3个分类的目标
于是找了一些参数调节的方法,下面这个是说的比较多的算法:

  • 计算每个点与其他所有点之间的欧几里德距离 计算每个点的k-距离值,并对所有点的k-距离集合进行升序排序,输出的排序后的k-距离值
  • 将所有点的k-距离值,在Excel中用散点图显示k-距离变化趋势 根据散点图确定半径Eps的值
  • 根据给定MinPts=4,以及半径Eps的值,计算所有核心点,并建立核心点与到核心点距离小于半径Eps的点的映射
  • 根据得到的核心点集合,以及半径Eps的值,计算能够连通的核心点,并得到离群点
  • 将能够连通的每一组核心点,以及到核心点距离小于半径Eps的点,都放到一起,形成一个簇

尝试实现一下 :

data = pd.read_csv("iris.csv")
data = np.mat(data)

k = 4
distances = {}
for x in range(len(data)):
    distancesForRow = []
    for y in range(len(data)):
        if x != y:
            dist = euclideanDistance(data[x, 1:5], data[y, 1:5])
            distancesForRow.append(dist)
    distancesForRow.sort(reverse = True)
    distances[x] = distancesForRow[k-1]

newDistances = sorted(distances.items(), key = operator.itemgetter(1))
for x in range(len(newDistances)):
    plt.scatter(x, newDistances[x][1])

plt.show()

结果:也没找到什么明显的拐点。。。能给什么帮助,先记录在这里,等有空再研究吧
DBScan+iris数据集实现+参数调节_第2张图片

你可能感兴趣的:(聚类)