diff --git a/docs/13.利用PCA来简化数据.md b/docs/13.利用PCA来简化数据.md index 956d96a7..d0b77f1e 100644 --- a/docs/13.利用PCA来简化数据.md +++ b/docs/13.利用PCA来简化数据.md @@ -83,7 +83,7 @@ ``` 降维技术使得数据变的更易使用,并且它们往往能够去除数据中的噪音,使得其他机器学习任务更加精确。 -降维往往作为与处理步骤,在数据应用到其他算法之前清洗数据。 +降维往往作为预处理步骤,在数据应用到其他算法之前清洗数据。 比较流行的降维技术: 独立主成分分析、因子分析 和 主成分分析, 其中又以主成分分析应用最广泛。 本章中的PCA将所有的数据集都调入了内存,如果无法做到,就需要其他的方法来寻找其特征值。 diff --git a/src/python/13.PCA/pca.py b/src/python/13.PCA/pca.py index 0b682240..6be185a0 100644 --- a/src/python/13.PCA/pca.py +++ b/src/python/13.PCA/pca.py @@ -117,31 +117,31 @@ if __name__ == "__main__": # 利用PCA对半导体制造数据降维 dataMat = replaceNanWithMean() - # print shape(dataMat) - # lowDmat, reconMat = pca(dataMat, 40) - # print shape(lowDmat) - # show_picture(dataMat, reconMat) + print shape(dataMat) + lowDmat, reconMat = pca(dataMat, 20) + print shape(lowDmat) + show_picture(dataMat, reconMat) - meanVals = mean(dataMat, axis=0) - meanRemoved = dataMat-meanVals - covMat = cov(meanRemoved, rowvar=0) - eigvals, eigVects = linalg.eig(mat(covMat)) - eigValInd = argsort(eigvals) + # meanVals = mean(dataMat, axis=0) + # meanRemoved = dataMat-meanVals + # covMat = cov(meanRemoved, rowvar=0) + # eigvals, eigVects = linalg.eig(mat(covMat)) + # eigValInd = argsort(eigvals) - topNfeat = 20 - eigValInd = eigValInd[:-(topNfeat+1):-1] - cov_all_score = sum(eigvals) - sum_cov_score = 0 - for i in range(0, len(eigValInd)): - line_cov_score = eigvals[eigValInd[i]] - sum_cov_score += line_cov_score - ''' - 我们发现其中有超过20%的特征值都是0。 - 这就意味着这些特征都是其他特征的副本,也就是说,它们可以通过其他特征来表示,而本身并没有提供额外的信息。 + # topNfeat = 20 + # eigValInd = eigValInd[:-(topNfeat+1):-1] + # cov_all_score = sum(eigvals) + # sum_cov_score = 0 + # for i in range(0, len(eigValInd)): + # line_cov_score = eigvals[eigValInd[i]] + # sum_cov_score += line_cov_score + # ''' + # 我们发现其中有超过20%的特征值都是0。 + # 这就意味着这些特征都是其他特征的副本,也就是说,它们可以通过其他特征来表示,而本身并没有提供额外的信息。 - 最前面15个值的数量级大于10^5,实际上那以后的值都变得非常小。 - 这就相当于告诉我们只有部分重要特征,重要特征的数目也很快就会下降。 + # 最前面15个值的数量级大于10^5,实际上那以后的值都变得非常小。 + # 这就相当于告诉我们只有部分重要特征,重要特征的数目也很快就会下降。 - 最后,我们可能会注意到有一些小的负值,他们主要源自数值误差应该四舍五入成0. - ''' - print '主成分:%s, 方差占比:%s%%, 累积方差占比:%s%%' % (format(i+1, '2.0f'), format(line_cov_score/cov_all_score*100, '4.1f'), format(sum_cov_score/cov_all_score*100, '4.1f')) + # 最后,我们可能会注意到有一些小的负值,他们主要源自数值误差应该四舍五入成0. + # ''' + # print '主成分:%s, 方差占比:%s%%, 累积方差占比:%s%%' % (format(i+1, '2.0f'), format(line_cov_score/cov_all_score*100, '4.1f'), format(sum_cov_score/cov_all_score*100, '4.1f'))