我正在尝试比较我的同学Silhouette Silhouette分数的计算结果,并且在绕for循环时遇到麻烦。我不是在寻找免费赠品,我们已经提交了以下内容进行评分,只是想了解此处发生的情况以供将来参考。
问题:
使用DBSCAN对min_samples(1至10)和epsilon(.05至.5,以0.01为步长)的不同值进行迭代(for-loop),以在本课程中使用的道路数据中找到簇并进行计算min_samples和epsilon的Silohouette Coeff。
道路数据:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:background="@color/colorWhite"
android:weightSum="10"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/action_bar2"
layout="@layout/action_bar2">
</include>
<GridLayout android:id="@+id/mainGrid"
android:columnCount="2"
android:rowCount="3"
android:alignmentMode="alignMargins"
android:columnOrderPreserved="false"
android:layout_weight="8"
android:layout_width="match_parent"
android:layout_height="0dp"
android:padding="14dp">
<!--Row 1-->
<!--Column 1-->
<android.support.v7.widget.CardView
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_columnWeight="1"
android:layout_rowWeight="1"
android:layout_marginBottom="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
app:cardElevation="9dp"
app:cardCornerRadius="9dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|center_vertical"
android:layout_margin="0dp"
android:orientation="vertical">
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:scaleType="centerCrop"
android:src="@drawable/art" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="#Art"
android:textAlignment="center"
android:textColor="@color/colorWhite"
android:textSize="20sp"
android:textStyle="bold" />
</FrameLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
<!--Column 2-->
<android.support.v7.widget.CardView
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_columnWeight="1"
android:layout_rowWeight="1"
android:layout_marginBottom="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
app:cardElevation="9dp"
app:cardCornerRadius="9dp">
<LinearLayout
android:layout_gravity="center_horizontal|center_vertical"
android:layout_margin="0dp"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:layout_width="203dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:scaleType="centerCrop"
android:src="@drawable/education" />
<TextView
android:text="#Education"
android:textAlignment="center"
android:textColor="@color/colorWhite"
android:textSize="20sp"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
<!--Row 2-->
<!--Column 1-->
<android.support.v7.widget.CardView
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_columnWeight="1"
android:layout_rowWeight="1"
android:layout_marginBottom="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
app:cardElevation="9dp"
app:cardCornerRadius="9dp">
<LinearLayout
android:layout_gravity="center_horizontal|center_vertical"
android:layout_margin="0dp"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:scaleType="centerCrop"
android:src="@drawable/entertain" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="#Entertainment"
android:textColor="@color/colorWhite"
android:textSize="19sp"
android:textStyle="bold"
android:textAlignment="center"/>
</FrameLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
<!--Column 2-->
<android.support.v7.widget.CardView
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_columnWeight="1"
android:layout_rowWeight="1"
android:layout_marginBottom="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
app:cardElevation="9dp"
app:cardCornerRadius="9dp">
<LinearLayout
android:layout_gravity="center_horizontal|center_vertical"
android:layout_margin="0dp"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:scaleType="centerCrop"
android:src="@drawable/fashion"/>
<TextView
android:text="#Fashion"
android:textAlignment="center"
android:textColor="@color/colorWhite"
android:textSize="20sp"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
<!--Row 3-->
<!--Column 1-->
<android.support.v7.widget.CardView
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_columnWeight="1"
android:layout_rowWeight="1"
android:layout_marginBottom="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
app:cardElevation="9dp"
app:cardCornerRadius="9dp">
<LinearLayout
android:layout_gravity="center_horizontal|center_vertical"
android:layout_margin="0dp"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:scaleType="centerCrop"
android:src="@drawable/date" />
<TextView
android:text="#Dating"
android:textAlignment="center"
android:textColor="@color/colorWhite"
android:textSize="20sp"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
<!--Column 2-->
<android.support.v7.widget.CardView
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_columnWeight="1"
android:layout_rowWeight="1"
android:layout_marginBottom="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
app:cardElevation="9dp"
app:cardCornerRadius="9dp"
>
<LinearLayout
android:layout_gravity="center_horizontal|center_vertical"
android:layout_margin="0dp"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:scaleType="centerCrop"
android:src="@drawable/music" />
<TextView
android:text="#Music"
android:textAlignment="center"
android:textColor="@color/colorWhite"
android:textSize="20sp"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
</GridLayout>
</LinearLayout>
</LinearLayout>
(更新的编辑)标准化:
osm lat lon alt
0 144552912 9.349849 56.740876 17.052772
1 144552912 9.350188 56.740679 17.614840
2 144552912 9.350549 56.740544 18.083536
...
434873 93323209 9.943451 57.496270 24.635285
434874 rows × 4 columns
同学循环:
#Normalize sample from dataset
XX = X.copy()
XX['alt'] = (X.alt - X.alt.mean())/X.alt.std()
XX['lat'] = (X.lat - X.lat.mean())/X.lat.std()
XX['lon'] = (X.lon - X.lon.mean())/X.lon.std()
我的循环:
(我将解决方案分成10个循环,每个min_sample(1-10)个循环。下面的示例。)
start = 0.0
stop = 0.45
step = 0.01
my_list = np.arange(start, stop+step, step)
startb = 1
stopb = 10
stepb = .2 # To scale proportionately with epsilon increments
my_listb = np.arange(startb, stopb+stepb, stepb)
my_range = range(45)
one = []
for i in tqdm(my_range):
dbscan = DBSCAN(eps = .05 + my_list[i] , min_samples = 1 + my_listb[i])
XX.cluster = dbscan.fit_predict(XX[['lat','lon']])
one.append(metrics.silhouette_score(XX[['lat', 'lon']], XX.cluster))
-
#eps loop 0.05 to 0.5 (steps 0.01) min_samples=1
eps_range = [x / 100.0 for x in range(5,51,1)]
eps_scores_1 = []
for e in tqdm(eps_range):
dbscan = DBSCAN(eps=e, min_samples=1)
labels = dbscan.fit_predict(XX[['lon', 'lat', 'alt']])
eps_scores_1.append(metrics.silhouette_score(XX[['lon', 'lat', 'alt']],labels))
我观察到的差异:
#eps loop 0.05 to 0.5 (steps 0.01) min_samples=2
eps_range = [x / 100.0 for x in range(5,51,1)]
eps_scores_2 = []
for e in tqdm(eps_range):
dbscan = DBSCAN(eps=e, min_samples=2)
labels = dbscan.fit_predict(XX[['lon', 'lat', 'alt']])
eps_scores_2.append(metrics.silhouette_score(XX[['lon', 'lat', 'alt']],labels))
的书写方式不正确?答案 0 :(得分:0)
该问题要求未成年人和epsilon都不同-它要求一个嵌套循环。您的同学使用了一个循环,没有考虑组合。您通过复制和粘贴完成了外循环。
您的同学使用一种非常误导性的方式来管理范围,因为他以后每增加1个就分别增加0.05!
您不能只混合纬度,经度和海拔高度。他们有不同的单位。实际上,由于失真,您甚至不应该混合使用经纬度-而是使用Haversine距离!
剪影假定为凸簇,但DBSCAN不会生成凸簇。
sklearn实现可能像对待群集一样对待噪声,通常会产生更差的结果。但是Silhouette并不是真的要与噪音标签一起使用...