文章目录
PAC(主成分分析法)
-
将高维数据特征降低为低维数据特征,减少维度冗余,将数据沿方差最大方向投影,数据更易于区分,在同一维度的相关性降低
-
能够去除部分噪声,因为最小特征值所对应的特征向量往往与噪声有关
-
提高运算速度
-
属于非监督学习算法
-
PCA处理过程
- 方法1原则
- 最大可分性:样本点到这个超平面上的投影尽可能分得开,通过投影点的方差来度量
- 方法2原则
- 最近重构性:样本点到这个超平面的距离足够近
- 方法1原则
分析步骤
-
第一步:均值归零
-
第二步:目标函数
-
定义方差:Xproject表示映射后的值
-
又因为经过均值去除,所以方差定义为:
-
-
所以就变成找w向量,使得方差最大
- 这里的w是一维向量,若是多维,则按矩阵乘法,将多维展开
- 目标函数:
-
与线性回归对比
- 第三步:带入公式求解
-
方法1:梯度上升
-
-
方法2:求解协方差矩阵XTX,进行特征值分解,取前m个特征值对应的特征向量构成的w
-
维度的选择
- 可以自由选择,根据准确率和训练时间来调整
- 根据sklearn中封装的PCA( rate )函数,来得到在准确率rate下的最小维度
代码实践
绘制数据点
import numpy as np
import matplotlib.pyplot as plt
x = np.empty((100, 2))
# 绘制两个特征的图像
x[:, 0] = np.random.uniform(0., 100., size=100)
x[:, 1] = 0.75 * x[:,0] + 3. + np.random.normal(0, 10., size=100)
plt.scatter(x[:,0], x[:,1])
plt.show()
# 均值归零
def demean(x):
#axis表示队列求均值,axis=1表示对行求均值
return x - np.mean(x, axis=0)
# 坐标轴发生变化,(0,0)大概在中心
X_demean = demean(x)
plt.scatter(X_demean[:,0], X_demean[:,1])
print("x维度:",np.mean(X_demean[:,0]))
print("y维度:",np.mean(X_demean[:,1]))
plt.show()
梯度公式
# 目标函数公式
def f(X, w):
return np.sum((X.dot(w)**2)) / len(X)
----------------------------------
# 梯度上升公式
def df_math(X, w):
return X.T.dot(X.dot(w)) * 2. / len(X)
# 测试梯度上升
def df_debug(X, w, epsilon=0.0001):
res = np.empty(len(w))
for i in range(len(w)):
w_1 = w.copy()
w_1[i] += epsilon
w_2 = w.copy()
w_2[i] -= epsilon
res[i] = (f(w_1,X) - f(w_2,X)) / (2 * epsilon)
return res
# df_math和df_debug效果一致
----------------------------------
#求单位向量
def direction(w):
# 除以自身模 : linalg.norm(w)