【机器学习算法-python实现】PCA 主成分分析、降维

1.背景

        PCA(Principal Component Analysis),PAC的作用主要是降低数据集的维度,然后挑选出主要的特征。
        PCA的主要思想是移动坐标轴,找到方差最大的方向上的特征值,什么叫方差最大的方向的特征值呢。就像下图中的曲线B,一样,它的覆盖范围最广。


基本步骤:(1)首先计算数据集的协方差矩阵
                   (2)计算协方差矩阵的特征值和特征向量
                   (3)保留最重要的n个特征


what is 协方差矩阵:
定义是变量向量减去均值向量,然后乘以变量向量减去均值向量的转置再求均值。例如x是变量,μ是均值,协方差矩阵等于E[(x-μ)(x-μ)^t],物理意义是这样的,例如x=(x1,x2,...,xi)那么协方差矩阵的第m行n列的数为xm与xn的协方差,若m=n,则是xn的方差。如果x的元素之间是独立的,那么协方差矩阵只有对角线是有值,因为x独立的话对于m≠n的情况xm与xn的协方差为0。另外协方差矩阵是对称的。
可以参考wiki:(http://zh.wikipedia.org/wiki/%E5%8D%8F%E6%96%B9%E5%B7%AE%E7%9F%A9%E9%98%B5)



2.代码实现

伪代码如下(摘自机器学习实战):

'''
@author: Garvin
'''
from numpy import *
import matplotlib.pyplot as plt

def loadDataSet(fileName, delim='\t'):
    fr = open(fileName)
    stringArr = [line.strip().split(delim) for line in fr.readlines()]
    datArr = [map(float,line) for line in stringArr]
    return mat(datArr)

def pca(dataMat, topNfeat=9999999):
    meanVals = mean(dataMat, axis=0)
    meanRemoved = dataMat - meanVals #remove mean
    covMat = cov(meanRemoved, rowvar=0)
    eigVals,eigVects = linalg.eig(mat(covMat))
    eigValInd = argsort(eigVals)            #sort, sort goes smallest to largest
    eigValInd = eigValInd[:-(topNfeat+1):-1]  #cut off unwanted dimensions
    redEigVects = eigVects[:,eigValInd]       #reorganize eig vects largest to smallest
    lowDDataMat = meanRemoved * redEigVects#transform data into new dimensions
    reconMat = (lowDDataMat * redEigVects.T) + meanVals
    return lowDDataMat, reconMat

def plotBestFit(dataSet1,dataSet2):      
    dataArr1 = array(dataSet1)
    dataArr2 = array(dataSet2)
    n = shape(dataArr1)[0] 
    n1=shape(dataArr2)[0]
    xcord1 = []; ycord1 = []
    xcord2 = []; ycord2 = []
    xcord3=[];ycord3=[]
    j=0
    for i in range(n):
        
            xcord1.append(dataArr1[i,0]); ycord1.append(dataArr1[i,1])
            xcord2.append(dataArr2[i,0]); ycord2.append(dataArr2[i,1])                  
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
    ax.scatter(xcord2, ycord2, s=30, c='green')
    
    plt.xlabel('X1'); plt.ylabel('X2');
    plt.show()    




if __name__=='__main__':
     mata=loadDataSet('/Users/hakuri/Desktop/testSet.txt')  
     a,b= pca(mata, 2)

loadDataSet函数是导入数据集。
PCA输入参数:参数一是输入的数据集,参数二是提取的维度。比如参数二设为1,那么就是返回了降到一维的矩阵。
PCA返回参数:参数一指的是返回的低维矩阵,对应于输入参数二。参数二对应的是移动坐标轴后的矩阵。


上一张图,绿色为原始数据,红色是提取的2维特征。



3.代码下载

    下载地址: 请点击我




/********************************

* 本文来自博客  “李博Garvin“

* 转载请标明出处:http://blog.csdn.net/buptgshengod

******************************************/


  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
1. 利用Python编写PCA算法,实现城市排名数据的降维 PCA(Principal Component Analysis,主成分分析)是一种常用的数据降维方法,可以将高维数据转换为低维数据,以便于数据分析和可视化。下面是利用Python编写PCA算法的示例代码: ```python import numpy as np def PCA(X, k): """ X: 数据矩阵,每一行表示一个样本 k: 降维后的维数 返回值: 降维后的数据矩阵 """ # 1. 对数据进行中心化处理 X_mean = np.mean(X, axis=0) X_center = X - X_mean # 2. 计算协方差矩阵 cov = np.cov(X_center.T) # 3. 计算特征值和特征向量 eig_vals, eig_vecs = np.linalg.eig(cov) # 4. 对特征值进行排序,选择前k个作为新的特征向量 idx = np.argsort(eig_vals)[::-1][:k] eig_vecs = eig_vecs[:, idx] # 5. 将数据映射到新的空间中 X_new = np.dot(X_center, eig_vecs) return X_new ``` 使用上述代码,可以对城市排名数据进行降维: ```python import pandas as pd # 读取城市排名数据 data = pd.read_csv('city_rank.csv') # 删除城市名称列 X = data.drop(['城市'], axis=1).values # 调用PCA函数进行降维 X_new = PCA(X, 2) # 可视化降维后的数据 import matplotlib.pyplot as plt plt.scatter(X_new[:, 0], X_new[:, 1]) plt.show() ``` 2. 通过调用Sklearn包中的PCA算法,实现城市排名数据的降维 Sklearn是Python中常用的机器学习库之一,提供了许多常用的机器学习算法,包括PCA算法。下面是利用Sklearn包中的PCA算法进行降维的示例代码: ```python import pandas as pd from sklearn.decomposition import PCA # 读取城市排名数据 data = pd.read_csv('city_rank.csv') # 删除城市名称列 X = data.drop(['城市'], axis=1).values # 调用Sklearn的PCA函数进行降维 pca = PCA(n_components=2) X_new = pca.fit_transform(X) # 可视化降维后的数据 import matplotlib.pyplot as plt plt.scatter(X_new[:, 0], X_new[:, 1]) plt.show() ``` 可以看到,Sklearn中的PCA算法使用起来非常方便,只需要指定降维后的维数即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值