当我们有混合数据时,Kmeans聚类方法如何处理分类数据?

2024-09-29 21:27:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用k-means方法根据能耗、面积(平方米)和所在地的气候带对一些建筑进行聚类。气候带是一个分类变量。值可以是A、B、C或D。它应该转换为数字值,因此有两个选项。首先是LabelEncoder,然后是假人。当我使用每一种方法时,结果完全不同。我想问一下,使用哪种方法更正确

我想因为“get_dummies”为每个分类变量创建了更多维度,所以应该给分类变量更多的决策权,这通常是不有利的。另一方面,使用LabelEncoder似乎也不完全正确。因为我们可以说“A=1,B=2,C=3,D=4”或“A=3,B=2,C=4,D=1”或许多其他选项。这可能会改变结果,即使结果无关紧要。所以我不确定哪一个更好用

欢迎提供任何统计或数学解释

多谢各位

**我所说的“得到傻瓜”是什么意思


Tags: 方法get选项分类数字聚类means面积
3条回答

由于各种原因,标准的k-means算法并不直接适用于分类数据。分类数据的样本空间是离散的,没有自然起源。在这样的空间上,欧几里德距离函数,或者说曼哈顿距离函数,并没有真正的意义。红色、黄色、橙色、蓝色和绿色之间的“距离”是多少?你可能想考虑使用一种叫做“余弦相似性”的技术。余弦相似性是一种度量标准,用于度量多个文本字符串,甚至整个文档的相似程度,而不考虑其大小。从数学上讲,它测量在多维空间中投影的两个向量之间的夹角的余弦。余弦相似性是有利的,因为即使两个相似的文档之间的距离远达欧几里德距离(由于文档的大小),它们仍然可能朝向更近的方向。角度越小,余弦相似性越高

这里有几个链接可以帮助你

https://www.machinelearningplus.com/nlp/cosine-similarity/

https://sites.temple.edu/tudsc/2017/03/30/measuring-similarity-between-texts-in-python/

我将在这里补充另一个答案。我想我的第一个答案非常正确。然而,我确实找到了一种使用K-means对文本进行聚类的方法,因此我将在这里分享,因为我正在寻找有关该技术“正确性”的反馈

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from sklearn.metrics import adjusted_rand_score

documents = ["This little kitty came to play when I was eating at a restaurant.",
             "Merley has the best squooshy kitten belly.",
             "Google Translate app is incredible.",
             "If you open 100 tab in google you get a smiley face.",
             "Best cat photo I've ever taken.",
             "Climbing ninja cat.",
             "Impressed with google map feedback.",
             "Key promoter extension for Google Chrome."]

vectorizer = TfidfVectorizer(stop_words='english')
X = vectorizer.fit_transform(documents)

true_k = 8
model = KMeans(n_clusters=true_k, init='k-means++', max_iter=1000, n_init=1)
model.fit(X)

print("Top terms per cluster:")
order_centroids = model.cluster_centers_.argsort()[:, ::-1]
terms = vectorizer.get_feature_names()
for i in range(true_k):
    print("Cluster %d:" % i),
    for ind in order_centroids[i, :10]:
        print(' %s' % terms[ind]),
    print

print("\n")
print("Prediction")

Y = vectorizer.transform(["chrome browser to open."])
prediction = model.predict(Y)
print(prediction)

Y = vectorizer.transform(["My cat is hungry."])
prediction = model.predict(Y)
print(prediction)

结果:

Top terms per cluster:
Cluster 0:
 eating
 kitty
 little
 came
 restaurant
 play
 ve
 feedback
 face
 extension
Cluster 1:
 translate
 app
 incredible
 google
 eating
 impressed
 feedback
 face
 extension
 ve
Cluster 2:
 climbing
 ninja
 cat
 eating
 impressed
 google
 feedback
 face
 extension
 ve
Cluster 3:
 kitten
 belly
 squooshy
 merley
 best
 eating
 google
 feedback
 face
 extension
Cluster 4:
 100
 open
 tab
 smiley
 face
 google
 feedback
 extension
 eating
 climbing
Cluster 5:
 chrome
 extension
 promoter
 key
 google
 eating
 impressed
 feedback
 face
 ve
Cluster 6:
 impressed
 map
 feedback
 google
 ve
 eating
 face
 extension
 climbing
 key
Cluster 7:
 ve
 taken
 photo
 best
 cat
 eating
 google
 feedback
 face
 extension

如果存在类别的逻辑顺序(即颜色Red与类别Yellow比与类别Green更相似),则可以对类别应用加权值。但这是一个典型的“假”类别特征(因为它可以分解为数字特征向量,如您所示)

如果问题与真实的分类特征有关,则每个类别之间的距离都相同。您可以根据该类别的逻辑重要性(权重)为任何类别特征设置固定距离以进行聚类

如果您的所有功能都是分类的或混合的,请查看k-mode or k-prototype算法

相关问题 更多 >

    热门问题