资源简介
PCA基本步骤:
对数据进行归一化处理(代码中并非这么做的,而是直接减去均值)
计算归一化后的数据集的协方差矩阵
计算协方差矩阵的特征值和特征向量
保留最重要的k个特征(通常k要小于n),也可以自己制定,也可以选择一个阈值,然后通过前k个特征值之和减去后面n-k个特征值之和大于这个阈值,则选择这个k
找出k个特征值对应的特征向量
将m * n的数据集乘以k个n维的特征向量的特征向量(n * k),得到最后降维的数据。
代码片段和文件信息
# -*- coding: utf-8 -*-
“““
Created -0on Sun Feb 28 10:04:26 2016
PCA source code
@author: MM
PCA基本步骤:
对数据进行归一化处理(代码中并非这么做的,而是直接减去均值)
计算归一化后的数据集的协方差矩阵
计算协方差矩阵的特征值和特征向量
保留最重要的k个特征(通常k要小于n),也可以自己制定,也可以选择一个阈值,然后通过前k个特征值之和减去后面n-k个特征值之和大于这个阈值,则选择这个k
找出k个特征值对应的特征向量
将m * n的数据集乘以k个n维的特征向量的特征向量(n * k)得到最后降维的数据。
“““
import numpy as np
import gdal
import os
from osgeo import gdal_array as ga
import matplotlib.pyplot as plt
# 计算均值要求输入数据为numpy的矩阵格式,行表示样本数,列表示特征
def meanX(dataX):
return np.mean(dataX axis=0) # axis=0表示按照列来求均值,如果输入list则axis=1
# 计算方差传入的是一个numpy的矩阵格式,行表示样本数,列表示特征
def variance(X):
m n = np.shape(X)
mu = meanX(X)
muAll = np.tile(mu (m 1))
X1 = X - muAll
variance = 1. / m * np.diag(X1.T * X1)
return variance
# 标准化传入的是一个numpy的矩阵格式,行表示样本数,列表示特征
def normalize(X):
m n = np.shape(X)
mu = meanX(X)
muAll = np.tile(mu (m 1))
X1 = X - muAll
X2 = np.tile(np.diag(X.T * X) (m 1))
XNorm = X1 / X2
return XNorm
“““
参数:
- XMat:传入的是一个numpy的矩阵格式,行表示样本数,列表示特征
- k:表示取前k个特征值对应的特征向量
返回值:
- finalData:参数一指的是返回的低维矩阵,对应于输入参数二
- reconData:参数二对应的是移动坐标轴后的矩阵
“““
def pca(XMat k):
average = meanX(XMat) ##计算均值为进行归一化做准备
m n = np.shape(XMat) #行,列(7)
print (mn)
data_adjust = []
avgs = np.tile(average (m 1)) #重复某个数组。比如tile(An),功能是将数组A重复n次,构成一个新的数组
data_adjust = XMat - avgs # 对数据进行归一化处理(代码中并非这么做的,而是直接减去均值)
covX = np.cov(data_adjust.T) # 计算协方差矩阵
featValue featVec = np.linalg.eig(covX) # 求解协方差矩阵的特征值和特征向量
print (np.shape(featVec))
index = np.argsort(-featValue) # 按照featValue进行从大到小排序
#确定k的主成分的个数
sum=0
max=0
for i in range(len(index)):
sum=sum+featValue[index[i]]
if max/sum<0.99:
max=max+featValue[index[i]]
k=k+1
finalData = []
print (“k = “k)
if k > n:
print (“k must lower than feature number“)
return
else:
# 注意特征向量是列向量,而numpy的二维矩阵(数组)a[m][n]中,a[1]表示第1行值
selectVec = np.matrix(featVec[index[:k]]) # 找出k个特征值对应的特征向量
print (“特征向量维数“)
print (np.shape(selectVec))
#finalData = data_adjust * selectVec.T
reconData = (data_adjust * selectVec.T) + average[:6] #将m * n的数据集乘以k个n维的特征向量的特征向量(m * k)得到最后降维的数据。
print( np.shape(reconData))
array = []
array = np.array(array) # 列表转数组
for j in range(k):
array = np.append(array reconData[:j]) #将reconData从二维(3列)数组转化从一维数组(1维)
print (np.shape(array))
array1 = array.reshape(k im_height im_width) #将 一维数组 转成 3维矩阵(k高(行),宽(列))
out = ga.SaveArray(array1 os.path.join(path “after.img“) format=“GTiff“ prototype=img)
#array2=array.reshape(im_heightim_widthk)
#print (np.shape(array2))
#out1=ga.SaveArray(array2os.path.join(path“after22.img“)format=“GTiff“prototyp
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 5746 2018-09-09 11:31 PCA.py
----------- --------- ---------- ----- ----
5746 1
相关资源
- [python]天气预报附带gui界面
- Openmv主控物料分拣小车拣乒乓球小车
- Openmv主控物料分拣小车拣乒乓球小车
- SVM人脸识别的Python代码
- Python代码王者荣耀全皮肤图片
- Anaconda Python3.6 安装包32bit +64bit
- python3实现word转txt
- 图像转视频python脚本
- Python wordcloud3.7whl
- python实现画一个立体的心,送给女朋
- python单纯形法解线性规划问题
- python读取las数据.zip
- python基础题库新手必学
- 基于Python的SVM模块源代码
- Python制造动态二维码
- python解析SA雷达数据
- Python 贪吃蛇
- 一个线性回归的
- python36实现打外星人小游戏图形界面游
- BP算法Python代码
- python管道小鸟游戏
- python图像处理三维重建所有代码
- treePlotter
- 天猫评论爬虫
- 股票爬取python
- python量化金融项目视频教程
- 基于朴素贝叶斯实现的文本分类
- 单纯形法python
- Python实现简单遗传,粒子群,蚁群,
- 在 VisualStudio 2017环境下使用Python之爬
评论
共有 条评论