首页 > 解决方案 > 当我们有数值和分类数据时,使用哪种算法来解决聚类问题?

问题描述

我对集群几乎是新手,对使用的方法有点困惑。我有一组建筑物,我想根据它们的能耗、大小、类型和邻域对它们进行聚类。我使用 k-means 方法并使用“get_dummies”方法来处理我的分类数据。

我想问一下这是否是处理分类数据的正确方法?(我还尝试将它们简单地映射到 1、2、3 等数字并在聚类之前对其进行规范化,但没有收到合适的结果)如果您建议另一种算法(随机森林、svm 或其他任何算法),我很感激如果你给我一个链接或网站来学习它。

另一个问题是,如果我希望我的一个特征对这个聚类有更大的影响,那么在标准化之后将它乘以 2 然后运行聚类部分是否可以?

谢谢。

** 我所说的“get_dummies”是什么意思?

在此处输入图像描述

标签: pythonscikit-learncluster-analysisk-meansrandom-forest

解决方案


我觉得差不多了!使用标签编码器或 one-hot-encoding 将非数字转换为数字。

import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder# creating initial dataframe
bridge_types = ('Arch','Beam','Truss','Cantilever','Tied Arch','Suspension','Cable')
bridge_df = pd.DataFrame(bridge_types, columns=['Bridge_Types'])# creating instance of labelencoder
labelencoder = LabelEncoder()# Assigning numerical values and storing in another column
bridge_df['Bridge_Types_Cat'] = labelencoder.fit_transform(bridge_df['Bridge_Types'])
bridge_df

结果:

  Bridge_Types  Bridge_Types_Cat
0         Arch                 0
1         Beam                 1
2        Truss                 6
3   Cantilever                 3
4    Tied Arch                 5
5   Suspension                 4
6        Cable                 2

或者...

import pandas as pd
import numpy as np# creating initial dataframe
bridge_types = ('Arch','Beam','Truss','Cantilever','Tied Arch','Suspension','Cable')
bridge_df = pd.DataFrame(bridge_types, columns=['Bridge_Types'])# generate binary values using get_dummies
dum_df = pd.get_dummies(bridge_df, columns=["Bridge_Types"], prefix=["Type_is"] )# merge with main df bridge_df on key values
bridge_df = bridge_df.join(dum_df)
bridge_df

请记住,如果您有很多标签,那么在您将所有内容都设为数字后,您的数据将会非常稀疏。另外,是的,您可以“游戏”将功能加倍。这是基本示例。

import numpy as np
data = np.asarray([np.asarray(DF['Feature1']),np.asarray(DF['Feature1']),np.asarray(DF['Feature2'])])

这似乎有点奇怪,我在实践中从未这样做过,但它应该会给你想要的结果。你知道什么......测试它,看看你如何相处。最后,当您有空闲时间时,请阅读下面链接上的内容。您将从该链接中学到很多东西。

https://scikit-learn.org/stable/modules/clustering.html


推荐阅读