这里写目录标题
Kmean分类digits
首先先写了一个,准确率大概在0.2-0.3左右。我考虑了两一下可能的原因:一个是因为维度太高导致结果不佳,因此我用PCA降维;另外一个是因为我不应该单纯以标签正确率作为衡量指标。因为scikitlearn上说:“其实不应该将分类标签作为聚类结果的评价指标,除非你有相关的先验知识或某种假设,知道这种分类类内差距更小”。但是它还是给出了几种评价标准,所以我用了Adjusted Rand index,其中contingency_matrix参考wiki中的contingency table,就是把预期和真实一样的同时表示在一个表里,预测这一类有多少样本。
运行Kmeans.py结果:
import numpy as np
from sklearn import datasets
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.metrics.cluster import contingency_matrix
def purity_score(y_true,y_pred):
cm = contingency_matrix(y_true,y_pred)
return (np.sum(np.amax(cm,axis=0))/y_pred.shape[0])
if __name__ == '__main__':
digits = datasets.load_digits()
x = digits.get('data')
pca = PCA(n_components=2)
x = pca.fit_transform(x)
y = digits.get('target')
# 产生训练集和测试集
num = x.shape[0]
ratio = 7 / 3 # 训练集数目:测试集数目
num_test = int(num / (1 + ratio))
num_train = num - num_test
index = np.arange(num)
np.random.shuffle(index) # 随机打乱
# 取出洗牌后前 num_test 作为测试集,剩余的为训练集
x_test = x[index[:num_test], :]
y_test = y[index[:num_test]]
x_train = x[index[num_test:], :]
y_train = y[index[num_test:]]
kmeans = KMeans(n_clusters=10) # 分十个类(0-9);这个参数调节影响准确率
kmeans.fit(x_train)
centers = kmeans.cluster_centers_
for i in range(3)