这个是我的关于eps和min_samples预估判断的代码,但是会在最下面rs.columns=['eps','min_samples','score','raito','n_clusters']位置报错ValueError: Length mismatch: Expected axis has 0 elements, new values have 5 elements,不晓得是怎么回事,请高手帮帮忙,多谢!
import numpy as np from sklearn.cluster import DBSCAN from sklearn import metrics import seaborn as sns import pandas as pd path=r"C:/Users/Siewking.L/Desktop/第九步虹桥全天2018-10.csv" #文档路径输入 #将第1列作为索引,提取2,3,4,5,6列数据,时间为第1列 df=pd.read_csv(path,index_col=1,usecols=['ID','GroudSpeed','Height','Longitude','Latitude'],parse_dates=[0]) print("这份数据包含 {} 个数据.".format(len(df))) #数据量统计 df_min = df.iloc[::50, :] #每 50行取一组数据 coords=df_min[['Longitude','Latitude']].values data = pd.DataFrame(coords) data.columns=['x','y'] sns.relplot(x="x",y="y",data=data) rs=[] #存放各个参数的组合计算出来的模型评估得分和噪声比 eps = np.arange(1,5,1) #eps参数从0.2开始到7,每隔0.2进行一次 min_samples=np.arange(20,100,20) #min_samples参数从20开始到100 best_score = 0 best_score_eps = 0 best_score_min_samples = 0 for i in eps: for j in min_samples: try:#因为不同的参数组合,有可能导致计算得分出错,所以用try db = DBSCAN(eps=i, min_samples=j).fit(data) labels= db.labels_#得到DBSCAN预测的分类便签 k=metrics.silhouette_score(data,labels) #轮廓系数评价聚类的好坏,值越大越好 raito = len(labels[labels[:] == -1]) / len(labels) #计算噪声点个数占总数的比例 n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0) # 获取分簇的数目 rs.append([i,j,k,raito,n_clusters_]) if k>best_score: best_score=k best_score_eps=i best_score_min_samples=j else: db='' except: db='' #这里用try就是遍历i,j 计算轮廓系数会出错的,出错的就跳过 rs= pd.DataFrame(rs) rs.columns=['eps','min_samples','score','raito','n_clusters'] sns.relplot(x="eps",y="min_samples", size='score',data=rs) sns.relplot(x="eps",y="min_samples", size='raito',data=rs)
这个就是说,你的rs并没有这5个列
那要怎么改呢?
Dataframe里面要写成字典形式
比如你要一个eps列,应该写成{'eps':rs[0]}以此类推,
完整的是rs=pd.DataFrame({'eps':rs[0],'min_simples':rs[1],'score':rs[2],'raito':rs[3],'n_clusters':rs[4]})