PCA算法---实验代码完整版(实验代码+数据集下载)

注:实验代码与数据集 下载链接

简介:

PCA(Principal Component Analysis)主成分分析算法,在进行图像识别以及高维度数据降维处理中有很强的应用性,算法主要通过计算选择特征值较大的特征向量来对原始数据进行线性变换。一般获取的原始数据维度都很高,比如1000个特征,在这1000个特征中可能包含了很多无用的信息或者噪声,真正有用的特征才100个,那么我们可以运用PCA算法将1000个特征降到100个特征。这样不仅可以去除无用的噪声,还能减少计算量。

算法流程图:

实验部分:

实验数据集采用att_afaces数据集。

PCA 算法程序定义部分:

#定义PCA 方法
def pca(data,p):                                   # 输入量为data:数据,k:
    data = np.float32(np.mat(data))                 #将输入数据转换为浮点型(相当于将图片转换成数字型)
    rows, cols = data.shape                         # 取数据大小(也就是图片的大小)(输入为200行,10304列)
    data_mean = np.mean(data, 0)                    # 求均值,axis = 0:压缩行,对各列求均值,返回 1* n 矩阵,也就是说,对
    Z = data - np.tile(data_mean, (rows, 1))        #row =200,      np.tile(b, (2, 1))#沿X轴复制1倍(相当于没有复制),再沿Y轴复制2倍,也就是说Z 是减去均值后的值
    D, V = np.linalg.eig(Z * Z.T)                   # 特征值与特征向量
    eigValIndice = np.argsort(D)                    #对特征值进行排序
    n = percentage2n(D, p)
    n_eigValIndice=eigValIndice[-1:-(n+1):-1]       #最大的n个特征值的下标
    V1= V [:,n_eigValIndice]                        #最大的n个特征值对应的特征向量
    V1 = Z.T * V1
    for i in xrange(n):                             # 特征向量归一化
        V1[:, i] /= np.linalg.norm(V1[:, i])
    return np.array(Z * V1), data_mean, V1          #返回值

方差百分比对于的n值方法定义部分:

 
 
def percentage2n(eigVals,percentage1):
    sortArray=np.sort(eigVals)   #升序
    sortArray=sortArray[-1::-1]  #逆转,即降序
    arraySum=sum(sortArray)
    tmpSum=0
    num=0
    for i in sortArray:
        tmpSum+=i
        num+=1
        if tmpSum>=arraySum*percentage1:
            return num
    print num

数据读取部分:

#数据读取
def loadImageSet(folder=u'att_faces', sampleCount=5):  # 加载图像集,随机选择sampleCount张图片用于训练,注意根据自己文件的文件进行修改
    trainData = []                                       #将4个数据改变设定列表的形式进行存储
    testData = []
    yTrain = []
    yTest = []
    for k in range(40):                                             #y一共有40个文件夹
        folder2 = os.path.join(folder, 's%d' % (k + 1))             #从第一个文件夹开始遍历查找,能够得到40个文件夹的名称
        data = [cv2.imread(d.encode('gbk'), 0) for d in glob.glob(os.path.join(folder2, '*.pgm'))]   #将获取的每一个图片都转换为列表的形式。每一幅图均为(112行,92列)
        sample = random.sample(range(10), sampleCount)
        trainData.extend([data[i].ravel() for i in range(10) if i in sample])    #训练集,随机抽取5个作为训练集
        testData.extend([data[i].ravel() for i in range(10) if i not in sample]) # 10个数据当中,另外几个作为测试集
        yTest.extend([k] * (10 - sampleCount))                                  # yTest增加 5位数值从0到10
        yTrain.extend([k] * sampleCount)                                         # yTrain增加 5位数值
    print yTest,yTrain
    return np.array(trainData), np.array(yTrain), np.array(testData), np.array(yTest)       #将获取并转变得到的数据转换np.array的格式

PCA 算法实验,数据集、代码包下载链接



猜你喜欢

转载自blog.csdn.net/u010801439/article/details/80525032