| 107 | |
| 108 | |
| 109 | def analyse_data(dataMat): |
| 110 | meanVals = mean(dataMat, axis=0) |
| 111 | meanRemoved = dataMat-meanVals |
| 112 | covMat = cov(meanRemoved, rowvar=0) |
| 113 | eigvals, eigVects = linalg.eig(mat(covMat)) |
| 114 | eigValInd = argsort(eigvals) |
| 115 | |
| 116 | topNfeat = 20 |
| 117 | eigValInd = eigValInd[:-(topNfeat+1):-1] |
| 118 | cov_all_score = float(sum(eigvals)) |
| 119 | sum_cov_score = 0 |
| 120 | for i in range(0, len(eigValInd)): |
| 121 | line_cov_score = float(eigvals[eigValInd[i]]) |
| 122 | sum_cov_score += line_cov_score |
| 123 | ''' |
| 124 | 我们发现其中有超过20%的特征值都是0。 |
| 125 | 这就意味着这些特征都是其他特征的副本,也就是说,它们可以通过其他特征来表示,而本身并没有提供额外的信息。 |
| 126 | |
| 127 | 最前面15个值的数量级大于10^5,实际上那以后的值都变得非常小。 |
| 128 | 这就相当于告诉我们只有部分重要特征,重要特征的数目也很快就会下降。 |
| 129 | |
| 130 | 最后,我们可能会注意到有一些小的负值,他们主要源自数值误差应该四舍五入成0. |
| 131 | ''' |
| 132 | print '主成分:%s, 方差占比:%s%%, 累积方差占比:%s%%' % (format(i+1, '2.0f'), format(line_cov_score/cov_all_score*100, '4.2f'), format(sum_cov_score/cov_all_score*100, '4.1f')) |
| 133 | |
| 134 | |
| 135 | if __name__ == "__main__": |