eay*_*tan 3 python cluster-analysis scikit-learn
我正在使用 sklearn 和凝聚聚类功能。我有一个混合数据,其中包括数字和名义数据列。我的名义列具有诸如“早上”、“下午”、“晚上”、“晚上”之类的值。如果我通过分配整数值(如 0、1、2、3)将我的名义数据转换为数字;欧几里得距离将计算为“夜晚”和“早晨”之间的 3,但是,1 应该作为距离的返回值。
X = pd.read_csv("mydata.csv", sep=",", header=0, encoding="utf-8")
X = StandardScaler().fit_transform(X)
print("n_samples: %d, n_features: %d" % X.shape)
km = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='average')
km.fit(X)
print("k = %d, Silhouette Coefficient: %0.3f" % (x,
metrics.silhouette_score(X, km.labels_, sample_size=None)))
Run Code Online (Sandbox Code Playgroud)
这是我的代码。
如何在 sklearn 中自定义距离函数或将我的名义数据转换为数字?
小智 5
我认为您有 3 个选项如何将分类特征转换为数值:
代码:
def two_hot(x):
return np.concatenate([
(x == "morning") | (x == "afternoon"),
(x == "afternoon") | (x == "evening"),
(x == "evening") | (x == "night"),
(x == "night") | (x == "morning"),
], axis=1).astype(int)
x = np.array([["morning", "afternoon", "evening", "night"]]).T
print(x)
x = two_hot(x)
print(x)
Run Code Online (Sandbox Code Playgroud)
输出:
[['morning']
['afternoon']
['evening']
['night']]
[[1 0 0 1]
[1 1 0 0]
[0 1 1 0]
[0 0 1 1]]
Run Code Online (Sandbox Code Playgroud)
然后我们可以测量距离:
from sklearn.metrics.pairwise import euclidean_distances
euclidean_distances(x)
Run Code Online (Sandbox Code Playgroud)
输出:
array([[0. , 1.41421356, 2. , 1.41421356],
[1.41421356, 0. , 1.41421356, 2. ],
[2. , 1.41421356, 0. , 1.41421356],
[1.41421356, 2. , 1.41421356, 0. ]])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13341 次 |
| 最近记录: |