当我们混合数据时如何用K-means聚类方法处理分类数据?

问题描述 投票:-1回答:3

我正在使用k均值方法根据建筑物的能耗,面积(以平方米为单位)和所在位置的气候带对它们进行聚类。气候区是一个类别变量。值可以是A,B,C或D。应将其转换为数字1,因此有两个选择。首先是LabelEncoder,其次是get_dummies。当我使用它们时,结果是完全不同的。我想问哪种方法更正确使用?

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

赞赏任何统计或数学解释。

谢谢

**我的意思是get_dummies?

python scikit-learn cluster-analysis k-means categorical-data
3个回答
0
投票

如果类别具有逻辑顺序(即颜色Red与类别Yellow更类似于类别Green,则可以将加权值应用于类别)。但这是典型的“假”类别特征(因为它可以按照您所显示的方式分解为数字特征向量)。

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

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


0
投票

出于各种原因,标准k均值算法不适用于分类数据。分类数据的样本空间是离散的,并且没有自然起源。在这样的空间上,欧几里得距离或曼哈顿距离函数并没有真正意义。红色,黄色,橙色,蓝色和绿色之间的“距离”是多少?您可能需要考虑使用一种称为“余弦相似度”的技术。余弦相似度是一种度量标准,用于测量文本的多个字符串甚至整个文档的相似程度,无论其大小如何。在数学上,它测量投影在多维空间中的两个向量之间的角度的余弦。余弦相似度是有利的,因为即使两个相似的文档相距欧几里德距离(由于文档的大小),它们仍然有可能彼此靠得更近。角度越小,余弦相似度越高。

这里有几个链接可能会对您有所帮助。

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

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


0
投票

我将在这里添加另一个答案。我认为我的第一个答案非常正确。但是,我确实想出了一种使用K均值对文本进行聚类的方法,因此在这里我将分享它,因为我正在寻找有关此技术“正确性”的反馈。

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
© www.soinside.com 2019 - 2024. All rights reserved.