python pca降维sklearn pca 怎么得到系数

python实验报告(经过pca算法)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
python实验报告(经过pca算法)
&&python实现机器学习相关代码,欢迎下载
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢这篇文章总结的不错
PCA主成分分析是将原始数据以线性形式映射到维度互不相关的子空间。主要就是寻找方差最大的不相关维度。数据的最大方差给出了数据的最重要信息。
优:将高维数据映射到低维,降低数据的复杂性,识别最重要的多个特征
不足:不一定需要,且可能损失有用信息
适用数值型数据
1.原始数据X,对于每列属性,去平均值(也可以对数值进行标准分化)
2.计算样本点的协方差矩阵(列间两两计算相关性)
3.求出协方差矩阵的特征值和对应的特征向量
4.从大到小排序特征值,取得最前的k个特征向量P
5.将数据转换到k个特征向量构建的新空间中,Y=P^tX
四.python代码
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
4 import numpy as np
5 from sklearn.decomposition import PCA
6 from matplotlib import pyplot as plt
8 class PCA_DimensionalityReduction:
<span style="color: #
def __init__(self):
<span style="color: #
# 随机产生数据沿y=2x分布,
<span style="color: #
self.x = np.arange(1, 101, 1).astype(float)
<span style="color: #
self.y = 2 * np.arange(1, 101, 1).astype(float)
<span style="color: #
<span style="color: #
def dataProduction(self):
<span style="color: #
#添加服从正太分布的噪音数据normal(均值,标准差,个数)
<span style="color: #
noise=np.random.normal(0,10,100)
<span style="color: #
self.y+=noise
<span style="color: #
<span style="color: #
self.fig=plt.figure(figsize=(10,10))
<span style="color: #
#红色的小圆点在坐标平面上画一个点
<span style="color: #
plt.plot(self.x,self.y,'ro')
<span style="color: #
#坐标范围axis[xmin,xmax,ymin,ymax]
<span style="color: #
plt.axis([0,102,-20,220])
<span style="color: #
<span style="color: #
plt.quiver(60, 100, 10 - 0, 20 - 0, scale_units='xy', scale=1)
<span style="color: #
plt.arrow(60, 100, 10 - 0, 20 - 0, head_width=2.5, head_length=2.5, fc='k', ec='k')
<span style="color: #
#图中的任意位置添加文字
<span style="color: #
plt.text(70,110,r'$v^1$',fontsize=20)
<span style="color: #
<span style="color: #
<span style="color: #
# 添加子图,返回Axes实例,参数:子图总行数,子图总列数,子图位置
<span style="color: #
ax=self.fig.add_subplot(111)
<span style="color: #
ax.axis([0,102,-20,220])
<span style="color: #
ax.set_xlabel('x',fontsize=40)
<span style="color: #
ax.set_ylabel('y',fontsize=40)
<span style="color: #
self.fig.suptitle('<span style="color: # dimensional',fontsize=40)
<span style="color: #
self.fig.savefig('pca_data.png')
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
总结一下PCA的算法步骤:
<span style="color: #
设有m条n维数据。
<span style="color: #
1)将原始数据按列组成n行m列矩阵X
<span style="color: #
2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
<span style="color: #
3)求出协方差矩阵C=(1/m)X(X)^T
<span style="color: #
4)求出协方差矩阵的特征值及对应的特征向量
<span style="color: #
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
<span style="color: #
<span style="color: #
即为降维到k维后的数据
<span style="color: #
<span style="color: #
#使用np.linalg.eig计算特征值和特征向量
<span style="color: #
def dr_pca(self):
<span style="color: #
#每列属性的均值
<span style="color: #
mean_x=np.mean(self.x)
<span style="color: #
mean_y=np.mean(self.y)
<span style="color: #
#这里对数据标准分化
<span style="color: #
mean_vector=np.array([[mean_x],[mean_y]])
<span style="color: #
self.u_x=(self.x-mean_x)/np.std(self.x)#除标准差
<span style="color: #
self.u_y=(self.y-mean_y)/np.std(self.y)
<span style="color: #
#协方差矩阵
<span style="color: #
sigma=np.cov([self.u_x,self.u_y])
<span style="color: #
#从协方差矩阵中求出特征值和特征向量,选择特征值最大的对应的特征向量
<span style="color: #
eig_vals,eig_vecs=np.linalg.eig(sigma)
<span style="color: #
eig_pairs=[(np.abs(eig_vals[i]),eig_vecs[:,i]) for i in range(len(eig_vals))]
<span style="color: #
eig_pairs.sort()
<span style="color: #
eig_pairs.reverse()
<span style="color: #
v1=eig_pairs[0][1]#取出一个最大特征值对应的特征向量
<span style="color: #
print('v1,shape:',(v1,v1.shape))
<span style="color: #
#映射到由k个特征向量组成的子空间特征向量(主成分)
<span style="color: #
X=np.array([self.u_x,self.u_y])
<span style="color: #
<span style="color: #
print('X shape:',X.shape)
<span style="color: #
main_vector=v1.T.dot(X)
<span style="color: #
print('main_vector:',main_vector.T)
<span style="color: #
<span style="color: #
#w=np.array(v1.reshape(2,1))
<span style="color: #
#main_vector=w.T.dot(X)
<span style="color: #
#print('w:',w.shape)
<span style="color: #
#print("main_vector2:",main_vector)
<span style="color: #
<span style="color: #
#使用sklearn中的pca
<span style="color: #
def sklearn_pca(self):
<span style="color: #
X=np.array([self.u_x,self.u_y])
<span style="color: #
<span style="color: #
pca=PCA(n_components=1) #指定主成分数量
<span style="color: #
<span style="color: #
#pca.fig(X)#训练pca模型
<span style="color: #
#v1 = ponents_[0]
# 得到特征向量
<span style="color: #
#print('v1:', v1)
<span style="color: #
<span style="color: #
main_vector=pca.fit_transform(X)#用X来训练PCA模型,同时返回降维后的结果数据。
<span style="color: #
print('sklearn:',main_vector)
<span style="color: #
<span style="color: # if __name__=='__main__':
<span style="color: #
pca=PCA_DimensionalityReduction()
<span style="color: #
pca.dataProduction()
<span style="color: #
pca.dr_pca()
<span style="color: #
pca.sklearn_pca()
参考:1.CRC.Machine.Learning.An.Algorithmic.Perspective.2nd.Edition.
   2.machine learning for the web
   3.machine learning in action
阅读(...) 评论()博客访问: 120751
博文数量: 14
注册时间:
ITPUB论坛APP
ITPUB论坛APP
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 大数据
最近在学习机器学习力的kmeans,这里记录一下一个简单的样本,想了解这个算法怎么计算的话,可以查看一下sklearn的源码,python写的很好读懂
# -*- coding: utf-8 -*-
from sklearn.cluster import KMeans
from sklearn.externals import joblib
import numpy
final = open('c:/test/final.dat' , 'r')
data = [line.strip().split('\t') for line in final]
feature = [[float(x) for x in row[3:]] for row in data]
#调用kmeans类
clf = KMeans(n_clusters=9)
s = clf.fit(feature)
print clf.cluster_centers_
#每个样本所属的簇
print clf.labels_
#用来评估簇的个数是否合适,距离越小说明簇分的越好,选取临界点的簇个数
print clf.inertia_
print clf.predict(feature)
joblib.dump(clf , 'c:/km.pkl')
#载入保存的模型
clf = joblib.load('c:/km.pkl')
#用来评估簇的个数是否合适,距离越小说明簇分的越好,选取临界点的簇个数
for i in range(5,30,1):
& & clf = KMeans(n_clusters=i)
& & s = clf.fit(feature)
& & print i , clf.inertia_
阅读(30906) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。一、标准化(Z-Score),或者去除均值和方差缩放公式为:(X-mean)/std &计算时对每个属性/每列分别进行。将数据按期属性(按列进行)减去其均值,并处以其方差。得到的结果是,对于每个属性/每列来说所有数据都聚集在0附近,方差为1。实现时,有两种不同的方式:使用sklearn.preprocessing.scale()函数,可以直接将给定数据进行标准化。123456789101112131415161718&&& from sklearn import preprocessing&&& import numpy as np&&& X = np.array([[ 1., -1.,& 2.],...&&&&&&&&&&&&&& [ 2.,& 0.,& 0.],...&&&&&&&&&&&&&& [ 0.,& 1., -1.]])&&& X_scaled = preprocessing.scale(X)&&&& X_scaled&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& array([[ 0.& ..., -1.22...,& 1.33...],&&&&&&&[ 1.22...,& 0.& ..., -0.26...],&&&&&&&[-1.22...,& 1.22..., -1.06...]])&&&&#处理后数据的均值和方差&&& X_scaled.mean(axis=0)array([ 0.,& 0.,& 0.])&&&& X_scaled.std(axis=0)array([ 1.,& 1.,& 1.])使用sklearn.preprocessing.StandardScaler类,使用该类的好处在于可以保存训练集中的参数(均值、方差)直接使用其对象转换测试集数据。12345678910111213141516171819&&& scaler = preprocessing.StandardScaler().fit(X)&&& scalerStandardScaler(copy=True, with_mean=True, with_std=True)&&&& scaler.mean_&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& array([ 1. ...,& 0. ...,& 0.33...])&&&& scaler.std_&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& array([ 0.81...,& 0.81...,& 1.24...])&&&& scaler.transform(X)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& array([[ 0.& ..., -1.22...,& 1.33...],&&&&&&&[ 1.22...,& 0.& ..., -0.26...],&&&&&&&[-1.22...,& 1.22..., -1.06...]])&&&&&&&& scaler.transform([[-1.,& 1., 0.]])&&&&&&&&&&&&&&& array([[-2.44...,& 1.22..., -0.26...]])二、将属性缩放到一个指定范围除了上述介绍的方法之外,另一种常用的方法是将属性缩放到一个指定的最大和最小值(通常是1-0)之间,这可以通过preprocessing.MinMaxScaler类实现。使用这种方法的目的包括:1、对于方差非常小的属性可以增强其稳定性。2、维持稀疏矩阵中为0的条目。123456789101112131415161718192021222324&&& X_train = np.array([[ 1., -1.,& 2.],...&&&&&&&&&&&&&&&&&&&& [ 2.,& 0.,& 0.],...&&&&&&&&&&&&&&&&&&&& [ 0.,& 1., -1.]])...&&& min_max_scaler = preprocessing.MinMaxScaler()&&& X_train_minmax = min_max_scaler.fit_transform(X_train)&&& X_train_minmaxarray([[ 0.5&&&&&& ,& 0.&&&&&&& ,& 1.&&&&&&& ],&&&&&&&[ 1.&&&&&&& ,& 0.5&&&&&& ,& 0.],&&&&&&&[ 0.&&&&&&& ,& 1.&&&&&&& ,& 0.&&&&&&& ]])&&&& &&& X_test = np.array([[ -3., -1.,& 4.]])&&& X_test_minmax = min_max_scaler.transform(X_test)&&& X_test_minmaxarray([[-1.5&&&&&& ,& 0.&&&&&&& ,& 1.]])&&&&& &&& min_max_scaler.scale_&&&&&&&&&&&&&&&&&&&&&&&&&&&& array([ 0.5&&&&&& ,& 0.5&&&&&& ,& 0.33...])&&&& min_max_scaler.min_&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& array([ 0.&&&&&&& ,& 0.5&&&&&& ,& 0.33...])当然,在构造类对象的时候也可以直接指定最大最小值的范围:feature_range=(min,&max),此时应用的公式变为:X_std=(X-X.min(axis=0))/(X.max(axis=0)-X.min(axis=0))X_scaled=X_std/(max-min)+min三、正则化(Normalization)正则化的过程是将每个样本缩放到单位范数(每个样本的范数为1),如果后面要使用如二次型(点积)或者其它核方法计算两个样本之间的相似性这个方法会很有用。Normalization主要思想是对每个样本计算其p-范数,然后对该样本中每个元素除以该范数,这样处理的结果是使得每个处理后样本的p-范数(l1-norm,l2-norm)等于1。&&&&&&&&&&&&&p-范数的计算公式:||X||p=(|x1|^p+|x2|^p+...+|xn|^p)^1/p该方法主要应用于文本分类和聚类中。例如,对于两个TF-IDF向量的l2-norm进行点积,就可以得到这两个向量的余弦相似性。1、可以使用preprocessing.normalize()函数对指定数据进行转换:123456789&&& X = [[ 1., -1.,& 2.],...&&&&& [ 2.,& 0.,& 0.],...&&&&& [ 0.,& 1., -1.]]&&& X_normalized = preprocessing.normalize(X, norm='l2')&&&& X_normalized&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& array([[ 0.40..., -0.40...,& 0.81...],&&&&&&&[ 1.& ...,& 0.& ...,& 0.& ...],&&&&&&&[ 0.& ...,& 0.70..., -0.70...]])2、可以使用processing.Normalizer()类实现对训练集和测试集的拟合和转换:123456789101112&&& normalizer = preprocessing.Normalizer().fit(X)& &&& normalizerNormalizer(copy=True, norm='l2')&&&&&&& normalizer.transform(X)&&&&&&&&&&&&&&&&&&&&&&&&&&& array([[ 0.40..., -0.40...,& 0.81...],&&&&&&&[ 1.& ...,& 0.& ...,& 0.& ...],&&&&&&&[ 0.& ...,& 0.70..., -0.70...]])&&&& normalizer.transform([[-1.,& 1., 0.]])&&&&&&&&&&&& array([[-0.70...,& 0.70...,& 0.& ...]])补充:
阅读(...) 评论()}

我要回帖

更多关于 python 图像pca分解 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信