为什么 DBSCAN 在 Movie lens 数据集上聚类 returns 单个聚类?
Why DBSCAN clustering returns single cluster on Movie lens data set?
场景:
我正在对 Movie Lens 数据集执行聚类,我有 2 种格式的数据集:
旧格式:
uid iid rat
941 1 5
941 7 4
941 15 4
941 117 5
941 124 5
941 147 4
941 181 5
941 222 2
941 257 4
941 258 4
941 273 3
941 294 4
新格式:
uid 1 2 3 4
1 5 3 4 3
2 4 3.6185548023 3.646073985 3.9238342172
3 2.8978348799 2.6692556753 2.7693015618 2.8973463681
4 4.3320762062 4.3407749532 4.3111995162 4.3411425423
940 3.7996234581 3.4979386925 3.5707888503 2
941 5 NaN NaN NaN
942 4.5762594612 4.2752554573 4.2522440019 4.3761477591
943 3.8252406362 5 3.3748860659 3.8487417604
我需要使用 KMeans、DBSCAN 和 HDBSCAN 在其上执行聚类。
使用 KMeans,我可以设置和获取集群。
问题
只有 DBSCAN 和 HDBSCAN 问题仍然存在,我无法获得足够数量的集群(我知道我们无法手动设置集群)
尝试过的技术:
- 尝试使用 IRIS data-set, where I found Species wasn't included. Clearly that is in String and besides is to be predicted, and everything just works fine 和那个数据集(代码段 1)
- 尝试使用旧格式的 Movie Lens 100K dataset(有和没有 UID),因为我尝试了一个类比,UID == SPECIES,因此没有它。 (片段 2)
- 尝试使用 NEW FORMAT(有和没有 UID),但结果以相同的风格结束。
片段 1:
print "\n\n FOR IRIS DATA-SET:"
from sklearn.datasets import load_iris
iris = load_iris()
dbscan = DBSCAN()
d = pd.DataFrame(iris.data)
dbscan.fit(d)
print "Clusters", set(dbscan.labels_)
片段 1(输出):
FOR IRIS DATA-SET:
Clusters set([0, 1, -1])
Out[30]:
array([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1,
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1,
1, 1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1,
1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
代码段 2:
import pandas as pd
from sklearn.cluster import DBSCAN
data_set = pd.DataFrame
ch = int(input("Extended Cluster Methods for:\n1. Main Matrix IBCF \n2. Main Matrix UBCF\nCh:"))
if ch is 1:
data_set = pd.read_csv("MainMatrix_IBCF.csv")
data_set = data_set.iloc[:, 1:]
data_set = data_set.dropna()
elif ch is 2:
data_set = pd.read_csv("MainMatrix_UBCF.csv")
data_set = data_set.iloc[:, 1:]
data_set = data_set.dropna()
else:
print "Enter Proper choice!"
print "Starting with DBSCAN for Clustering on\n", data_set.info()
db_cluster = DBSCAN()
db_cluster.fit(data_set)
print "Clusters assigned are:", set(db_cluster.labels_)
片段 2(输出):
Extended Cluster Methods for:
1. Main Matrix IBCF
2. Main Matrix UBCF
Ch:>? 1
Starting with DBSCAN for Clustering on
<class 'pandas.core.frame.DataFrame'>
Int64Index: 942 entries, 0 to 942
Columns: 1682 entries, 1 to 1682
dtypes: float64(1682)
memory usage: 12.1 MB
None
Clusters assigned are: set([-1])
正如所见,它 returns 只有 1 个集群。我想听听我做错了什么。
您需要选择合适的参数。如果 epsilon 太小,一切都会变成噪音。 sklearn 不应该这个参数有默认值,需要为每个数据集选择不同的值。
您还需要预处理数据。
用无意义的 kmeans 得到 "clusters" 是微不足道的...
不要随便调用随机函数。你需要理解你在做什么,否则你只是在浪费时间。
首先,您需要预处理数据,删除任何无用的属性,例如 ID 和不完整的实例(以防您选择的距离度量无法处理)。
很高兴理解这些算法来自两种不同的范例,基于质心的 (KMeans) 和基于密度的 (DBSCAN & HDBSCAN*)。基于质心的算法通常将簇数作为输入参数,而基于密度的算法需要邻居的数量 (minPts) 和邻域的半径 (eps)。
通常在文献中将邻居的数量(minPts)设置为4,并通过分析不同的值来找到半径(eps)。您可能会发现 HDBSCAN* 更易于使用,因为您只需要通知邻居的数量 (minPts)。
如果在尝试不同的配置后,您仍然得到无用的聚类,可能您的数据根本没有聚类,KMeans 输出没有意义。
正如@faraway 和@Anony-Mousse 所指出的,解决方案在数据集上比编程更数学化。
终于可以找出集群了。方法如下:
db_cluster = DBSCAN(eps=9.7, min_samples=2, algorithm='ball_tree', metric='minkowski', leaf_size=90, p=2)
arr = db_cluster.fit_predict(data_set)
print "Clusters assigned are:", set(db_cluster.labels_)
uni, counts = np.unique(arr, return_counts=True)
d = dict(zip(uni, counts))
print d
Epsilon 和 Out-lier 概念比 SO: How can I choose eps and minPts (two parameters for DBSCAN algorithm) for efficient results? 更亮。
您是否尝试过使用 PCA(例如)查看集群在 2D space 中的外观。如果整个数据密集并且实际上可能形成单个组,那么您可能会得到单个集群。
更改其他参数,例如 min_samples=5、算法、指标。您可以从 sklearn.neighbors.VALID_METRICS.
检查算法和指标的可能值
场景:
我正在对 Movie Lens 数据集执行聚类,我有 2 种格式的数据集:
旧格式:
uid iid rat
941 1 5
941 7 4
941 15 4
941 117 5
941 124 5
941 147 4
941 181 5
941 222 2
941 257 4
941 258 4
941 273 3
941 294 4
新格式:
uid 1 2 3 4
1 5 3 4 3
2 4 3.6185548023 3.646073985 3.9238342172
3 2.8978348799 2.6692556753 2.7693015618 2.8973463681
4 4.3320762062 4.3407749532 4.3111995162 4.3411425423
940 3.7996234581 3.4979386925 3.5707888503 2
941 5 NaN NaN NaN
942 4.5762594612 4.2752554573 4.2522440019 4.3761477591
943 3.8252406362 5 3.3748860659 3.8487417604
我需要使用 KMeans、DBSCAN 和 HDBSCAN 在其上执行聚类。 使用 KMeans,我可以设置和获取集群。
问题
只有 DBSCAN 和 HDBSCAN 问题仍然存在,我无法获得足够数量的集群(我知道我们无法手动设置集群)
尝试过的技术:
- 尝试使用 IRIS data-set, where I found Species wasn't included. Clearly that is in String and besides is to be predicted, and everything just works fine 和那个数据集(代码段 1)
- 尝试使用旧格式的 Movie Lens 100K dataset(有和没有 UID),因为我尝试了一个类比,UID == SPECIES,因此没有它。 (片段 2)
- 尝试使用 NEW FORMAT(有和没有 UID),但结果以相同的风格结束。
片段 1:
print "\n\n FOR IRIS DATA-SET:"
from sklearn.datasets import load_iris
iris = load_iris()
dbscan = DBSCAN()
d = pd.DataFrame(iris.data)
dbscan.fit(d)
print "Clusters", set(dbscan.labels_)
片段 1(输出):
FOR IRIS DATA-SET:
Clusters set([0, 1, -1])
Out[30]:
array([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1,
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1,
1, 1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1,
1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
代码段 2:
import pandas as pd
from sklearn.cluster import DBSCAN
data_set = pd.DataFrame
ch = int(input("Extended Cluster Methods for:\n1. Main Matrix IBCF \n2. Main Matrix UBCF\nCh:"))
if ch is 1:
data_set = pd.read_csv("MainMatrix_IBCF.csv")
data_set = data_set.iloc[:, 1:]
data_set = data_set.dropna()
elif ch is 2:
data_set = pd.read_csv("MainMatrix_UBCF.csv")
data_set = data_set.iloc[:, 1:]
data_set = data_set.dropna()
else:
print "Enter Proper choice!"
print "Starting with DBSCAN for Clustering on\n", data_set.info()
db_cluster = DBSCAN()
db_cluster.fit(data_set)
print "Clusters assigned are:", set(db_cluster.labels_)
片段 2(输出):
Extended Cluster Methods for:
1. Main Matrix IBCF
2. Main Matrix UBCF
Ch:>? 1
Starting with DBSCAN for Clustering on
<class 'pandas.core.frame.DataFrame'>
Int64Index: 942 entries, 0 to 942
Columns: 1682 entries, 1 to 1682
dtypes: float64(1682)
memory usage: 12.1 MB
None
Clusters assigned are: set([-1])
正如所见,它 returns 只有 1 个集群。我想听听我做错了什么。
您需要选择合适的参数。如果 epsilon 太小,一切都会变成噪音。 sklearn 不应该这个参数有默认值,需要为每个数据集选择不同的值。
您还需要预处理数据。
用无意义的 kmeans 得到 "clusters" 是微不足道的...
不要随便调用随机函数。你需要理解你在做什么,否则你只是在浪费时间。
首先,您需要预处理数据,删除任何无用的属性,例如 ID 和不完整的实例(以防您选择的距离度量无法处理)。
很高兴理解这些算法来自两种不同的范例,基于质心的 (KMeans) 和基于密度的 (DBSCAN & HDBSCAN*)。基于质心的算法通常将簇数作为输入参数,而基于密度的算法需要邻居的数量 (minPts) 和邻域的半径 (eps)。
通常在文献中将邻居的数量(minPts)设置为4,并通过分析不同的值来找到半径(eps)。您可能会发现 HDBSCAN* 更易于使用,因为您只需要通知邻居的数量 (minPts)。
如果在尝试不同的配置后,您仍然得到无用的聚类,可能您的数据根本没有聚类,KMeans 输出没有意义。
正如@faraway 和@Anony-Mousse 所指出的,解决方案在数据集上比编程更数学化。
终于可以找出集群了。方法如下:
db_cluster = DBSCAN(eps=9.7, min_samples=2, algorithm='ball_tree', metric='minkowski', leaf_size=90, p=2)
arr = db_cluster.fit_predict(data_set)
print "Clusters assigned are:", set(db_cluster.labels_)
uni, counts = np.unique(arr, return_counts=True)
d = dict(zip(uni, counts))
print d
Epsilon 和 Out-lier 概念比 SO: How can I choose eps and minPts (two parameters for DBSCAN algorithm) for efficient results? 更亮。
您是否尝试过使用 PCA(例如)查看集群在 2D space 中的外观。如果整个数据密集并且实际上可能形成单个组,那么您可能会得到单个集群。
更改其他参数,例如 min_samples=5、算法、指标。您可以从 sklearn.neighbors.VALID_METRICS.
检查算法和指标的可能值