机器学习中常用的降维方法是主成分分析
n = len
a = np.zeros
count =
curSum = 0
k = 0
while curSum <= count * p:
uk = u[:, k].reshape
vk = v[k].reshape
a += sigma[k] * np.dot
curSum += sigma[k]
k += 1
print 'k:',k
a[a < 0] = 0
a[a > 255] = 255
#按照*近距离取整数,并设置参数类型为uint8
return np.rint
if __name__ == '__main__':
img = Image.open
a = np.array
for p in np.arange
R = rebuild_img
u, sigma, v = np.linalg.svd
G = rebuild_img
u, sigma, v = np.linalg.svd
B = rebuild_img
I = np.stack
#保存图片在img文件夹下
Image.fromarray
效果
一共10张图,从上到下奇异值和占比为[0.1, 0.2, …, 0.9, 1.0],奇异值和占比[0.7, 0.8, 0.9]的恢复图像还是比较清楚,然而对应的奇异值个数却非常少,如下表所示:
奇异值和占比 奇异值个数 奇异值个数占比
0.7 45 0.10
0.8 73 0.16
0.9 149 0.33
1.0 450 1.00
小结
奇异值分解能够有效的降低数据的维数,以本文的图片为例,从450维降到149维后,还保留了90%的信息
虽然奇异值分解很有效,但是不能滥用,一般情况下要求降维后信息的损失度不能超过5%,甚至是1%
Ng的视频中提到常见的错误使用降维的情况,在这里也贴出来:
使用降维解决过拟合问题
不论什么情况,先用降维处理一下数据,即把降维当做模型训练的必须步骤