我正在使用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?
如果类别具有逻辑顺序(即颜色Red
与类别Yellow
更类似于类别Green
,则可以将加权值应用于类别)。但这是典型的“假”类别特征(因为它可以按照您所显示的方式分解为数字特征向量)。
如果问题与真实分类特征有关,则每个分类之间的距离相同。您可以根据该类别的逻辑重要性(权重)对任何类别特征设置固定距离,以进行聚类。
如果您的所有功能都是分类功能或混合功能,请查看k-mode or k-prototype算法。
出于各种原因,标准k均值算法不适用于分类数据。分类数据的样本空间是离散的,并且没有自然起源。在这样的空间上,欧几里得距离或曼哈顿距离函数并没有真正意义。红色,黄色,橙色,蓝色和绿色之间的“距离”是多少?您可能需要考虑使用一种称为“余弦相似度”的技术。余弦相似度是一种度量标准,用于测量文本的多个字符串甚至整个文档的相似程度,无论其大小如何。在数学上,它测量投影在多维空间中的两个向量之间的角度的余弦。余弦相似度是有利的,因为即使两个相似的文档相距欧几里德距离(由于文档的大小),它们仍然有可能彼此靠得更近。角度越小,余弦相似度越高。
这里有几个链接可能会对您有所帮助。
https://www.machinelearningplus.com/nlp/cosine-similarity/
https://sites.temple.edu/tudsc/2017/03/30/measuring-similarity-between-texts-in-python/
我将在这里添加另一个答案。我认为我的第一个答案非常正确。但是,我确实想出了一种使用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