Почему мои собственные векторы не ортогональны моим восстановленным данным? - PullRequest
0 голосов
/ 05 октября 2019

Я визуализирую 2-мерные данные в 1-мерном пространстве, используя принципиальный компонентный анализ, однако собственные векторы, которые приводят к тому, что, как представляется, дают правильные значения для восстановленных данных при построении, не точно перпендикулярны и параллельны данным.

Я не уверен, в чем проблема. Я использовал ковариационную матрицу и функцию ninaly linalg.svd для получения собственных векторов и значений после нормализации z-счета.

def FeatureNormalisation(X):
    normalised_X = X.copy()
    mu = []
    sigma = []
    for i in range(X.shape[1]):
        mean = np.mean(X[:,i])
        std = np.std(X[:,i])
        normalised_X[:,i] = np.divide(X[:,i] - mean, std)
        mu.append(mean)
        sigma.append(std)
    return normalised_X, np.asarray(mu), np.asarray(sigma)

def PCA(X):
    m, n = X.shape
    sigma = np.divide(np.matmul(X.T,X),m)
    U, S, V = np.linalg.svd(sigma)
    return U, S # Eigen vectors and Eigen values

def ProjectData(X, U, K):
    return np.dot(U[:,:K].T, X.T)

def RecoverData(Z, U, K):
    return (U[:,:K] * Z).T

X_norm, mu, sigma = FeatureNormalisation(X)
U, S = PCA(X_norm)

plt.figure()
plt.title("Original")
plt.scatter(X[:,0], X[:,1], edgecolors='blue', facecolors='none')
plt.quiver(*mu, U[:,0], U[:,1], color=['g', 'r'], scale=4)

plt.figure()
plt.title("Normalised")
origin = np.divide(np.sum(X_norm, axis=0),X_norm.shape[0])
plt.quiver(*origin, U[:,0], U[:,1], color=['g', 'r'], scale=4)
plt.scatter(X_norm[:,0], X_norm[:,1], edgecolors='red', facecolors='none')

K = 1
Z = ProjectData(X_norm, U, K)
X_recovered = RecoverData(Z, U, K)

plt.figure()
plt.title("Recovered data")
centre = np.divide(np.sum(X_recovered, axis=0),X_recovered.shape[0])
plt.quiver(*centre, U[:,0], U[:,1], color=['g', 'r'], scale=4)
plt.scatter(X_recovered[:,0], X_recovered[:,1], edgecolors='green', facecolors='none')

plt.show()

Результирующие собственные векторы, нанесенные с помощью plt.quiver(), находятся под углом, слегка смещенным от того, что я на самом деле ожидал .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...