import pandas as pd import matplotlib.pyplot as plt from sklearn.cluster import DBSCAN from sklearn import metrics # 读取CSV文件 df = pd.read_csv('D:/TJU/交通数据/obike_1.csv', encoding='gb18030') # 绘制样本点分布图 plt.scatter(df['olgt'], df['olat'], s=5) plt.xlabel('Longitude') plt.ylabel('Latitude') plt.show() # 进行聚类 eps_values = [0.01, 0.02, 0.03, 0.04, 0.05] # eps值列表 min_samples_values = [5, 10, 15, 20, 25] # min_samples值列表 silhouette_scores = [] # 轮廓系数列表 for eps in eps_values: for min_samples in min_samples_values: dbscan = DBSCAN(eps=eps, min_samples=min_samples) labels = dbscan.fit_predict(df[['olgt', 'olat']]) n_clusters = len(set(labels)) - (1 if -1 in labels else 0) # 计算聚类的簇数 if n_clusters > 1: silhouette_scores.append(metrics.silhouette_score(df[['olgt', 'olat']], labels)) else: silhouette_scores.append(-1) # 将轮廓系数置为-1 # 绘制关于eps的折线图 plt.plot(eps_values, silhouette_scores) plt.xlabel('Eps') plt.ylabel('Silhouette Score') plt.show() 报错ValueError: x and y must have same first dimension, but have shapes (5,) and (25,) 给出修改后的代码解决问题
时间: 2024-02-12 21:02:56 浏览: 39
修改后的代码如下:
```python
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn import metrics
# 读取CSV文件
df = pd.read_csv('D:/TJU/交通数据/obike_1.csv', encoding='gb18030')
# 绘制样本点分布图
plt.scatter(df['olgt'], df['olat'], s=5)
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.show()
# 进行聚类
eps_values = [0.01, 0.02, 0.03, 0.04, 0.05] # eps值列表
min_samples_values = [5, 10, 15, 20, 25] # min_samples值列表
silhouette_scores = [] # 轮廓系数列表
for eps in eps_values:
tmp_scores = []
for min_samples in min_samples_values:
dbscan = DBSCAN(eps=eps, min_samples=min_samples)
labels = dbscan.fit_predict(df[['olgt', 'olat']])
n_clusters = len(set(labels)) - (1 if -1 in labels else 0) # 计算聚类的簇数
if n_clusters > 1:
tmp_scores.append(metrics.silhouette_score(df[['olgt', 'olat']], labels))
else:
tmp_scores.append(-1) # 将轮廓系数置为-1
silhouette_scores.append(tmp_scores)
# 绘制关于eps的折线图
for i, min_samples in enumerate(min_samples_values):
plt.plot(eps_values, [score[i] for score in silhouette_scores], label='min_samples={}'.format(min_samples))
plt.xlabel('Eps')
plt.ylabel('Silhouette Score')
plt.legend()
plt.show()
```
修改后的代码中,将原本的轮廓系数列表 `silhouette_scores` 改为了一个二维列表,其中每一个元素都是一个列表,存储了对应 `eps` 值下,不同 `min_samples` 值的轮廓系数。同时,修改了绘图部分的代码,通过 `enumerate` 函数获取到当前循环的 `min_samples` 值的下标 `i`,然后绘制对应的线条,添加了图例,以便区分不同的 `min_samples` 值。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)