一般在有監督訓練中,我們很自然地會用如下模式去預測測試集的分類:(以svm為例)
svm.fit(x_train, y_train)
y_pred=svm.predict(x_test)
那么無監督訓練中是否也可以在一個數據集上訓練,然后用訓練好的模型直接調用predict()函數在另一個數據集上進行預測呢?答案是:可以的!下面我們以KMeans為例說明。
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets.samples_generator import make_blobs
# Generate some data
X_train, y_train = make_blobs(n_samples=400, centers=4, cluster_std=0.60, random_state=0)
X_test, y_test = make_blobs(n_samples=100, centers=4, cluster_std=0.80, random_state=0)
kmeans = KMeans(4, random_state=0)
kmeans.fit(X_train)
# 方法一:手動計算測試集的分類
centroids = kmeans.cluster_centers_
labels_list = []
for i in range(X_test.shape[0]):
distance = np.square(centroids - X_test[i])
distance = np.sum(distance, axis=1)
label = np.argmin(distance)
labels_list.append(label)
# 方法二:調用predict()
labels_test = kmeans.predict(X_test)
# 判斷兩個方法的預測結果是否一樣
print(labels_list == list(labels_test)) # 輸出結果:True
kmeans的predict()結果和我們手動計算的結果完全相同,說明無監督訓練中也可以在一個數據集上訓練,然后用訓練好的模型直接調用predict()函數在另一個數據集上進行預測。
