기계 학습 차원 감소를위한 PCA (파이썬 코드 + 데이터)

기계 학습의 PCA

먼저 다음과 같이 네 부분으로 나뉩니다.

  • 애플리케이션 배경 생성
  • 디자인 아이디어
  • 사례 연습
  • 요약하자면
  • 부록

1. 애플리케이션 배경 생성

줄여서 PCA 인 주성분 분석은 데이터 전처리에 사용되는 데이터 차원 감소 기술입니다. 일반적으로 획득 한 원본 데이터의 차원은 1000 개의 특성과 같이 매우 높습니다. 이러한 1000 개의 특성에는 쓸모없는 정보 나 노이즈가 많이 포함될 수 있습니다. 실제로 유용한 특성은 100 개뿐입니다. 그런 다음 PCA 알고리즘을 사용하여 1000 개의 특성을 변환 할 수 있습니다. 100 가지 기능까지. 이것은 쓸모없는 노이즈를 제거 할뿐만 아니라 많은 계산을 줄일 수 있습니다.
PCA에서 데이터는 원래 좌표계에서 새 좌표계로 변환됩니다. 물론 여기에서 새로운 좌표계는 임의로 설정하는 것이 아니라 데이터 자체의 특성에 따라 설계해야합니다. 일반적으로 첫 번째 새 좌표 축은 원본 데이터의 분산이 가장 큰 방향을 선택하고 두 번째 좌표 축은 첫 번째 좌표 축에 직교하고 가장 큰 분산을 갖는 방향입니다. 이 문장의 의미는 두 번째로 선택된 방향이 첫 번째 방향과 약한 상관 관계를 가져야한다는 것입니다.
요약하자면

  • 차원 축소는 차원 재난 문제를 완화 할 수 있습니다.
  • 차원 축소는 데이터를 압축하는 동안 정보 손실을 최소화 할 수 있습니다.
  • 수백 차원의 데이터 구조를 이해하기 어렵고 시각화를 통해 2 차원 또는 3 차원의 데이터를 이해하기 더 쉽습니다.

2. 디자인 아이디어

PCA 주성분 분석 알고리즘은 고차원 좌표계를 저 차원 좌표계에 매핑하는 선형 차원 감소입니다.
저 차원 좌표계를 선택하는 방법은 무엇입니까? 공분산 행렬의 고유 값과 고유 벡터와 공분산 행렬의 고유 값과 고유 벡터를 찾는 것입니다. 고유 벡터는 좌표계를 나타내고 고유 값은 새 좌표에 매핑 된 길이를 나타내고
데이터 변환을 수행합니다.
그러나 이것이 놀랍다 고 생각하십니까? 공분산을 찾기위한 더 큰 고유 벡터가 가장 이상적인 k 차원 벡터 인 이유는 무엇입니까?
실험 프로젝트를 살펴 보겠습니다! ! !

3. 사례 연습

지식 보유

  • 분산 : 변동 설명
    여기에 사진 설명 삽입

  • 공분산 : x, y의 상관 관계

여기에 사진 설명 삽입
-. 공분산 행렬 : 이것은 3 차원이며, 다음 프로젝트에서 사용한 2 차원입니다. z 값이 없습니다.
여기에 사진 설명 삽입

1. 원시 데이터 처리 : 여기서는 1 차원 디스플레이로 2 차원 축소를 선택합니다. 여기서 x와 y는 2 차원입니다.
여기에 사진 설명 삽입
행은 샘플을 나타내고 열은 기능 (TF-IDF)을 나타냅니다. 각각 x와 y의 평균을 찾은 다음 모두에 대해 샘플의 경우 해당 평균을 뺍니다. 여기서 x의 평균값은 1.81이고 y의 평균값은 1.91입니다. 그런 다음 예제에서 평균값을 뺀 값은 (0.69, 0.49)입니다. 생각을
여기에 사진 설명 삽입
남겨주세요 1 : 왜 평균값을 빼고 효과는 무엇입니까?

2. 공분산 행렬 찾기

위의 공분산 행렬은 2 차원이므로 2 개의 행과 2 개의 열이 있습니다
여기에 사진 설명 삽입
. 3. 공분산의 고유 값과 고유 벡터를 구합니다.

선형 대수에 대한 지식이 여기에 사용되며,이를 수행하는 방법을 모르는 학생들
스스로 학습 할 수 있습니다 . 아래 그림의 첫 번째는 고유 값이고 두 번째는 고유 벡터입니다 (다음 숫자는 모두 0이 생략 됨)
여기에 사진 설명 삽입
. 고유 값 0.0490833989는 고유 벡터에 해당합니다. 특징 벡터가 모두 단위 벡터로 정규화되는 벡터.

4. 가장 큰 k 개의 고유 값에 해당하는 고유 벡터 선택 (여기서 k는 총 차원 수보다 작은 값) :
고유 값을 가장 큰 것에서 가장 작은 것 순으로 정렬하고 그중 가장 큰 k를 선택한 다음 해당 k를 선택합니다. 고유 벡터는 고유 벡터 행렬을 형성하기 위해 열 벡터로 사용됩니다. 여기에는 두 개의 고유 값만 있으며 가장 큰 값을 선택하고 여기서는 1.28402771이고 해당 고유 벡터는 (-0.677873399, -0.735178656) T입니다. 우리는 2 차원에서 1 차원으로 축소하고 있으므로 k는 1을 취하고 가장 큽니다.
두 가지 질문을 남겨주세요.

  • 생각 2 : 왜 가장 큰 k를 선택합니까? 근거는 무엇입니까?
  • 세 번째 생각 : 실제 적용에서 선택하는 것이 얼마나 적절합니까?

5. 새 행렬을 얻습니다
. 샘플 포인트를 선택한 특징 벡터에 투영합니다. 샘플 개수가 m 개이고 특성 개수가 n 개라고 가정하면 평균을 뺀 샘플 행렬은 DataAdjust (mn),
공분산 행렬은 nn,
선택한 k 개의 고유 벡터는 EigenVectors (nk)로 구성됩니다.
그러면 투영 된 데이터 FinalData는 FinalData (101)
= DataAdjust (10 * 2 matrix) x feature vector (-0.677873399, -0.735178656) T
입니다. 얻어진 결과는 다음 그림
여기에 사진 설명 삽입
의 차원 축소 완료되고 동시에 충실도가 달성 된 것입니다. 검증을위한 Python 코드에서 PCA를 사용하지 않으면 어떻게 되나요?


우리는 생각 하나에 답합니다 : 왜 데이터를 평균에서 빼야 하는가

간단히 말해, 데이터를 중앙 집중화하여 과적 합 가능성을 줄이십시오. 이유를 알아보고 싶은 학생이 있으면 부록 1을 참조하십시오.


우리는 두 가지 생각에 대답합니다. k의 고유 값이 클수록 더 좋은 이유는 무엇입니까?

최대 분산 이론 : 전임자 결론 : 최고의 k 차원 특징은 n 차원 샘플 포인트가 k 차원으로 변환 된 후 각 차원의 표본 분산이 매우 크다는 것입니다.
왜?
투영 된 샘플 포인트 간의 분산이 가장 크기 때문에 (투영의 절대 값의 합이 가장
크다고도 할 수 있음)2 차원은 1 차원으로 축소됩니다. 분산이 크지 않으면 주축의 투영 포인트가 겹치고 정보 손실이 큽니다. , 그리고 누락 된 벡터는 매우 중요합니다. 아래 그림 4와 5를보세요! (그림 4와 5는 원점을 통과하고 데이터 센터에 있습니다.) 그림 4의 왼쪽 절반은
u> x, u가 주 벡터 일 때최적입니다. u에 대한 점의 투영이 u와 u의 직교 벡터와 관련이 있음을 알 수 있습니다. 분명히 그림 4의 왼쪽에있는 투영면은 오른쪽보다 크고 투영 점 간의 편차가 더 큽니다. 그림 5는 그림 4의 단일 지점에 대한 상세보기입니다.
여기에 사진 설명 삽입
여기에 사진 설명 삽입
요약하자 :

선형 대수학에서 고유 값을 수없이 찾았습니다 .n * n 대칭 행렬을 분해하면 고유 값과 고유 벡터를 찾을 수 있으며 n 차원 직교 염기가 각각 생성됩니다. 직교 기저는 고유 값에 해당합니다. 그런 다음 행렬은이 N 개의 염기에 투영됩니다. 이때 고유 값의 계수는 염기에 대한 행렬의 투영 길이를 나타냅니다.
고유 값이 클수록 해당 고유 벡터에 대한 행렬의 분산이 커지고 샘플 포인트가 더 이산되고 구별하기 쉽고 더 많은 정보를 얻을 수 있습니다. 따라서 고유 값이 가장 큰 해당 고유 벡터는 방향에 더 많은 정보를 포함합니다. 고유 값이 적 으면 해당 방향에 대한 정보가 거의 없음을 의미하며 해당하는 작은 고유 값을 삭제할 수 있습니다. 방향 데이터의 경우 큰 특징 값의 방향에 해당하는 데이터 만 유지되며,이를 통해 데이터 양은 줄어들지 만 유용한 정보량은 유지됩니다. PCA가이 원칙입니다.


우리는 세 가지 생각에 대답합니다. n 차원 중에서 가장 적합한 k는 몇 개입니까?
물론, k (특징 벡터)가 많을수록 더 좋을수록 k가 많을수록 엔트로피가 커지고 샘플의 불확실성이 커지고 실제 데이터에 가까워집니다. k가 더 크면 우리가 말한 차원 감소 효과를 얻을 수 없습니다. 그래서 이것은
실증적 인 이야기입니다. 일부 연구 결과에 따르면 선택된 주축의 전체 길이가 모든 주축 길이의 합계의 약 85 %를 차지한다고합니다. 실제로 이것은 일반적인 진술 일 뿐이며 구체적인 선택은 실제 상황에 따라 다릅니다. . 다음과 같은 공식. 참고 : n은 샘플 수, k는 선택한 차원입니다.
여기에 사진 설명 삽입

4. 요약

단계 검토

  1. 평균 제거
  2. 공분산 행렬 계산
  3. 공분산 행렬의 고유 값 및 고유 벡터 계산
  4. 고유 값을 큰 것에서 작은 것으로 정렬
  5. 상위 k 개의 특징 벡터 유지
  6. 데이터를 k 벡터 구성 요소의 새로운 공간으로 변환
  7. n 차원 행렬 * k 차원 고유 벡터 = k 차원 행렬

치수 축소 완료! ! !

부록 1 :
데이터의 주요 구성 요소를 설명하기 위해 데이터 차원 축소부터 시작하겠습니다. 데이터 차원 감소 란 무엇입니까? 3 차원 공간에 일련의 점이 있고 이러한 점이 원점을 통과하는 경사면에 분포되어 있다고 가정합니다. 자연 좌표계 x, y, z의 세 축을 사용하여이 데이터 집합을 나타내는 경우 3 차원을 사용해야하지만 실제로는 ,이 점들의 분포는 2 차원 평면에만 있습니다. 문제는 무엇입니까? 데이터가있는 평면이 x, y 평면과 일치하도록 x, y, z 좌표계를 회전합니다. 회전 된 좌표계가 x ', y', z '로 표시된 경우이 데이터 그룹은 x'및 y '는 2 차원으로 표현할 수 있습니다! 물론 원래 표현을 복원하려면이 두 좌표 사이에 변환 행렬을 저장해야합니다. 이런 식으로 데이터 차원을 줄일 수 있습니다! 이 구절을 이해하려면 아래 그림
여기에 사진 설명 삽입
을보아야합니다 . 그러나이 과정의 본질을 봐야합니다.이 데이터를 행 또는 열로 행렬로 배열하면 행렬의 순위는 2입니다! 이러한 데이터 사이에는 상관 관계가 있습니다 (0이 아닌 솔루션 사용).이 데이터로 형성된 원점을 교차하는 가장 큰 선형 독립 벡터 그룹에는 평면이 원점을 교차해야하는 2 개의 벡터가 포함됩니다! 이것이 데이터 중앙화의 이유입니다! 좌표 원점을 데이터 센터로 이동하여 원래 관련성이없는 데이터가이 새로운 좌표계와 관련되도록하십시오! 기저 벡터의 직교성을 높입니다. 흥미롭게도 세 점은 동일 평면에 있어야합니다. 즉, 3 차원 공간의 모든 세 점은 중앙에 배치 된 후 선형 적으로 관련됩니다. 일반적으로 n 차원 공간의 n 개 점은 n-1 차원 부분 공간에 있어야합니다. 분석 중! n 차원 유클리드 공간에서 공 차원이 1과 같은 선형 부분 공간은 (n-1) 차원이어야합니다. 이것은 평면의 직선과 공간의 평면의 확장입니다.

부록 2 : Python 코드 및 데이터

참고 : 파이썬 코드는 2 차원 공간에서 PCA 차원 감소와 비 차원 감소를 사용하여 4 차원 데이터를 비교하는 것입니다.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt  #2D绘图库

#计算均值,要求输入数据为numpy的矩阵格式,行表示样本数,列表示特征
def meanX(dataX):
    return np.mean(dataX,axis=0)#axis=0表示按照列来求均值,如果输入list,则axis=1
def pca(XMat, k):
    average = meanX(XMat)
    m, n = np.shape(XMat)
    data_adjust = []
    avgs = np.tile(average, (m, 1))
    data_adjust = XMat - avgs
    covX = np.cov(data_adjust.T)   #计算协方差矩阵
    featValue, featVec=  np.linalg.eig(covX)  #求解协方差矩阵的特征值和特征向量
    index = np.argsort(-featValue) #按照featValue进行从大到小排序
    finalData = []
    if k > n:
        print ("k must lower than feature number")
        return
    else:
        #注意特征向量时列向量,而numpy的二维矩阵(数组)a[m][n]中,a[1]表示第1行值
        selectVec = np.matrix(featVec.T[index[:k]]) #所以这里需要进行转置
        finalData = data_adjust * selectVec.T
        reconData = (finalData * selectVec) + average
    return finalData, reconData
#输入文件的每行数据都以\t隔开
def loaddata(datafile):
    return np.array(pd.read_csv(datafile,sep=" ",header=-1)).astype(np.float)
def plotBestFit(data1, data2):
    dataArr1 = np.array(data1)
    dataArr2 = np.array(data2)

    m = np.shape(dataArr1)[0]
    axis_x1 = []
    axis_y1 = []
    axis_x2 = []
    axis_y2 = []
    for i in range(m):
        axis_x1.append(dataArr1[i,0])
        axis_y1.append(dataArr1[i,1])
        axis_x2.append(dataArr2[i,0])
        axis_y2.append(dataArr2[i,1])
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(axis_x1, axis_y1, s=50, c='red', marker='s')
    ax.scatter(axis_x2, axis_y2, s=50, c='blue')
    plt.xlabel('x1'); plt.ylabel('x2');
    plt.savefig("outfile.png")
    plt.show()
#根据数据集data.txt
def main():
    datafile = "data.txt"
    XMat = loaddata(datafile)
    k = 2
    return pca(XMat, k)
if __name__ == "__main__":
    finalData, reconMat = main()
    plotBestFit(finalData, reconMat)

데이터 : data.txt 파일, 참고 : 상대 경로를 사용하고 데이터를 .py 코드의 동일한 수준 디렉토리에 배치, 병렬 관계

5.1 3.5 1.4 0.2
4.9 3.0 1.4 0.2
4.7 3.2 1.3 0.2
4.6 3.1 1.5 0.2
5.0 3.6 1.4 0.2
5.4 3.9 1.7 0.4
4.6 3.4 1.4 0.3
5.0 3.4 1.5 0.2
4.4 2.9 1.4 0.2
4.9 3.1 1.5 0.1
5.4 3.7 1.5 0.2
4.8 3.4 1.6 0.2
4.8 3.0 1.4 0.1
4.3 3.0 1.1 0.1
5.8 4.0 1.2 0.2
5.7 4.4 1.5 0.4
5.4 3.9 1.3 0.4
5.1 3.5 1.4 0.3
5.7 3.8 1.7 0.3
5.1 3.8 1.5 0.3
5.4 3.4 1.7 0.2
5.1 3.7 1.5 0.4
4.6 3.6 1.0 0.2
5.1 3.3 1.7 0.5
4.8 3.4 1.9 0.2
5.0 3.0 1.6 0.2
5.0 3.4 1.6 0.4
5.2 3.5 1.5 0.2
5.2 3.4 1.4 0.2
4.7 3.2 1.6 0.2
4.8 3.1 1.6 0.2

종료! ! !
참조 블로그 1 : https://www.jianshu.com/p/f9c6b36395f6
참조 블로그 코드 : https://blog.csdn.net/Dream_angel_Z/article/details/50760130

추천

출처blog.csdn.net/qq_44112474/article/details/93908037