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的参数是多少呀?