dis*_*ing 5 python artificial-intelligence cluster-analysis keras tensorflow
给定一个旨在用于后续无监督聚类分析的二元数据集(源自是/否问卷响应),具有显着的多重共线性,并且由约 50,000 个观察值(受试者)总共 31 个特征,降低输入数据的维度似乎是明智的在进行聚类分析之前。我尝试为此使用自动编码器,但令人惊讶的是,簇(通过 k-medoids 导出,由于基础数据的名义性质而选择,并且与 k-means 相比,与离群值/噪声相关的稳定性更高)实际上是使用 MCA 时更加清晰可辨,在 k = 5 时具有明显的最大 Silhouette 系数。
鉴于在我尝试自动编码器方法之前使用了具有前 5 个 PC 的 MCA(仅解释约 75% 的方差,通过碎石图选择),令我惊讶的是自动编码器在提取有意义的特征方面做得更差瓶颈维度。当前自动编码器的问题似乎是用于聚类的瓶颈层中的数据被扭曲......
下面是我用来构造自动编码器的代码。会不会是超参数关闭了,或者是整体架构的一些细节问题?对层数、学习率、批量大小、层尺寸等具体数字的随机搜索没有产生任何实质性结果。训练数据集和验证数据集之间的损失相似,并且在大约 40 个 epoch 后稳定在 0.15 左右。
我还尝试找出使用此类数据的研究,但没有发现任何有用的东西。
import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Adam
import matplotlib.pyplot as plt
input_dim = 31
layer_1_dim = 18
layer_2_dim = 10
bottleneck_dim = 5
learning_rate = 0.001
epochs = 100
batch_size = 300
# split data into training and validation
training_n = int(data.shape[0] * 0.8)
train_data = data[:training_n, :]
val_data = data[training_n:, :]
# define autoencoder initializer
initializer = tf.keras.initializers.GlorotUniform()
# autoencoder layers
input_layer = Input(shape=(input_dim,))
layer = Dense(layer_1_dim, activation='relu')(input_layer)
layer = Dense(layer_2_dim, activation='relu', kernel_initializer=initializer)(layer)
layer = Dense(bottleneck_dim, activation='relu', kernel_initializer=initializer, name="bottleneck-output")(layer)
layer = Dense(layer_2_dim, activation='relu', kernel_initializer=initializer)(layer)
layer = Dense(layer_1_dim, activation='relu', kernel_initializer=initializer)(layer)
output_layer = Dense(input_dim, activation='sigmoid', kernel_initializer=initializer)(layer)
# define and compile autoencoder model
autoencoder = Model(inputs=input_layer, outputs=output_layer)
optimizer = Adam(learning_rate=learning_rate)
autoencoder.compile(optimizer=optimizer, loss='binary_crossentropy')
# train the autoencoder model
history = autoencoder.fit(train_data, train_data, epochs=epochs, batch_size=batch_size, validation_data=(val_data, val_data))
# get bottleneck output
bottleneck_autoencoder = Model(inputs=autoencoder.input, outputs=autoencoder.get_layer('bottleneck-output').output)
bottleneck_output = bottleneck_autoencoder.predict(data)
# plot loss in traning and validation set
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Autoencoder loss (binary cross-entropy)')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='upper right')
plt.savefig('output/embedding.png')
Run Code Online (Sandbox Code Playgroud)