DBSCAN数据流聚类算法跑S1,S2数据集都成功了,格式相同的S3数据集跑不通,求助

S3:    453320    606542 
    520651    594591
    516664    660290
    570023    570741
    524035    518443
    544957    505968
    503105    577815
    515747    601704
    588509    666153
    533602    584471
    488815    736618
    555436    648459
    525149    598859
    527235    597804
    532163    487880
    456899    535857
    458240    649408
    449835    681607
    536283    664397
    490765    641584
    454105    462204
    452479    733351
    530851    640929
    537285    484173
    517205    604160
    523280    604275
    587302    609986
    474852    625772
    524603    621588
    541442    643798
    533275    597808
    561366    639125
    542921    577831
    535727    568446
    505281    579015
    507854    513056
    519839    594718
    543050    594144
    502642    615006

S2:    845753    636607
    812954    643720
    868217    609046
    920248    607272
    841621    639394
    843907    598777
    817712    620917
    865980    632292
    876539    639944
    805247    642901
    829227    565484
    834679    669557
    851242    630615
    890325    702688
    832159    638667
    833736    637738
    778784    571492
    844489    672382
    825802    638894
    875471    622426
    879225    639387
    819482    633447
    818212    633262
    839324    651033
    817439    678071
    876202    600942
    841025    623927
    850781    619234
    754610    657392
    842733    640979

# encoding:utf-8
import matplotlib.pyplot as plt
import random
import numpy as np
import math
from sklearn import datasets
import matplotlib.pyplot as plt
 
list_1 = []
list_2 = []
# 数据集一:随机生成散点图,参数为点的个数
# def scatter(num):
#     for i in range(num):
#         x = random.randint(0, 100)
#         list_1.append(x)
#         y = random.randint(0, 100)
#         list_2.append(y)
#     print(list_1)
#     print(list_2)
#     data = list(zip(list_1, list_2))
#     print(data)
#     #plt.scatter(list_1, list_2)
#     #plt.show()
#     return data
#scatter(50)
 
def loadDataSet(fileName, splitChar='\t'):
    dataSet = []
    with open(fileName) as fr:
        for line in fr.readlines():
            curline = line.strip().split(splitChar)
            fltline = list(map(float, curline))
            dataSet.append(fltline)
    return dataSet
 
# 计算两个点之间的欧式距离,参数为两个元组
def dist(t1, t2):
    dis = math.sqrt((np.power((t1[0]-t2[0]),2) + np.power((t1[1]-t2[1]),2)))
    # print("两点之间的距离为:"+str(dis))
    return dis
 
# dis = dist((1,1),(3,4))
# print(dis)
 
 
# DBSCAN算法,参数为数据集,Eps为指定半径参数,MinPts为制定邻域密度阈值
def dbscan(Data, Eps, MinPts):
    num = len(Data)  # 点的个数
     #print("点的个数:"+str(num))
    unvisited = [i for i in range(num)]  # 没有访问到的点的列表
    # print(unvisited)
    visited = []  # 已经访问的点的列表
    C = [-1 for i in range(num)]
    # C为输出结果,默认是一个长度为num的值全为-1的列表
    # 用k来标记不同的簇,k = -1表示噪声点
    k = -1
    # 如果还有没访问的点
    while len(unvisited) > 0:
        # 随机选择一个unvisited对象
        p = random.choice(unvisited)
        unvisited.remove(p)
        visited.append(p)
        # N为p的epsilon邻域中的对象的集合
        N = []
        for i in range(num):
            if (dist(Data[i], Data[p]) <= Eps): #and (i!=p):
                N.append(i)
        # 如果p的epsilon邻域中的对象数大于指定阈值,说明p是一个核心对象
        if len(N) >= MinPts:
            k = k+1
            # print(k)
            C[p] = k
            # 对于p的epsilon邻域中的每个对象pi
            for pi in N:
                if pi in unvisited:
                    unvisited.remove(pi)
                    visited.append(pi)
                    # 找到pi的邻域中的核心对象,将这些对象放入N中
                    # M是位于pi的邻域中的点的列表
                    M = []
                    for j in range(num):
                        if (dist(Data[j], Data[pi])<=Eps): #and (j!=pi):
                            M.append(j)
                    if len(M)>=MinPts:
                        for t in M:
                            if t not in N:
                                N.append(t)
                # 若pi不属于任何簇,C[pi] == -1说明C中第pi个值没有改动
                if C[pi] == -1:
                    C[pi] = k
        # 如果p的epsilon邻域中的对象数小于指定阈值,说明p是一个噪声点
        else:
            C[p] = -1
 
    return C
 
 

dataSet = loadDataSet('S3.txt', splitChar='    ')
C = dbscan(dataSet,2 , 14)

print(C)

x = []
y = []
for data in dataSet:
    x.append(data[0])
    y.append(data[1]);
plt.figure(figsize=(30, 15), dpi=100)
plt.scatter(x,y,c=C,marker='o')
plt.show()
# print(x)
# print(y)


 

报错:

  • ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-58-c7005e106e03> in <module>()
         97 
         98 
    ---> 99 dataSet = loadDataSet('S3.txt', splitChar='    ')
        100 C = dbscan(dataSet,2 , 14)
        101 '''
    
    <ipython-input-58-c7005e106e03> in loadDataSet(fileName, splitChar)
         30         for line in fr.readlines():
         31             curline = line.strip().split(splitChar)
    ---> 32             fltline = list(map(float, curline))
         33             dataSet.append(fltline)
         34     return dataSet
    
    ValueError: could not convert string to float: 

 

数据里面有字符串吧,非数值符号,无法转换为float类型。

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y

请问,你的s1的参数是多少呀?