DBSCAN Silhouette系数:这种for循环有效吗?

时间:2018-10-31 04:09:08

标签: python for-loop machine-learning cluster-analysis dbscan

我正在尝试比较我的同学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()

Classmates figure

我的循环:

(我将解决方案分成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))

My Figure

我观察到的差异:

  1. 同学在for循环中未包含“ alt”。
  2. 同学尝试了某种嵌套循环?
  3. 同学的范围是45,不确定是否正确。
  4. 同学的#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)) 的书写方式不正确?
  5. 同学的最大剪影分数比我的高。
  6. (未显示) 同学使用了10,000个随机样本,我使用了30,000个随机样本。

1 个答案:

答案 0 :(得分:0)

该问题要求未成年人和epsilon都不同-它要求一个嵌套循环。您的同学使用了一个循环,没有考虑组合。您通过复制和粘贴完成了外循环。

您的同学使用一种非常误导性的方式来管理范围,因为他以后每增加1个就分别增加0.05!

您不能只混合纬度,经度和海拔高度。他们有不同的单位。实际上,由于失真,您甚至不应该混合使用经纬度-而是使用Haversine距离!

剪影假定为凸簇,但DBSCAN不会生成凸簇。

sklearn实现可能像对待群集一样对待噪声,通常会产生更差的结果。但是Silhouette并不是真的要与噪音标签一起使用...