1.数据的降维--PCA

一、PCA的原理

import numpy as np

from sklearn import datasets

from sklearn.decomposition import PCA

import matplotlib.pyplot as plt
X,y = datasets.load_iris(True)
pca = PCA(n_components=0.95,whiten=True) # whiten 白化理,
#n_components=0.95--保留特征的数量
标准化(方差是1,平均值是0)正太分布
X_pca = pca.fit_transform(X)
X_pca.shape
display(X_pca.std(axis = 0))
display(X_pca.mean(axis = 0))
array([0.99666109, 0.99666109])



array([-1.42108547e-15, -1.81188398e-15])

自己写代码,实现,PCA

矩阵的特征值,和特征向量

线性代数中的概念A

第一步,去中心化

# 特征,将每个特征的平均值求解,
# 数据有四个特征,返回四个数
A = X - X.mean(axis = 0)

第二步,求解协方差

# 协方差,方差
# 方差是协方差的一种特殊形式
# 圆是椭圆的一种特例
# 方差表示属性内在的关系
# 协方差,两个属性,进行对比
# 学校里,吴同学,受女同学的欢迎程度(属性)和吴同学的猥琐程度(另一个属性) ---->协方差
# rowvar row 行 = True默认计算行和行的协方差
B = np.cov(A,rowvar=False)#计算列,二维数组中:行表示样本,列表示的属性(excel,pandas、mysql)
# 4 * 4 = 16
B
array([[ 0.68569351, -0.042434  ,  1.27431544,  0.51627069],
       [-0.042434  ,  0.18997942, -0.32965638, -0.12163937],
       [ 1.27431544, -0.32965638,  3.11627785,  1.2956094 ],
       [ 0.51627069, -0.12163937,  1.2956094 ,  0.58100626]])
# 方差计算公式
np.var(X[:,0])/149*150
0.6856935123042507
((X[:,0] - X[:,0].mean())**2).sum()/149
0.6856935123042507

第三步,进行特征值和特征向量的计算

value,vector = np.linalg.eigh(B)
display(value,vector)
array([0.02383509, 0.0782095 , 0.24267075, 4.22824171])



array([[ 0.31548719,  0.58202985,  0.65658877, -0.36138659],
       [-0.3197231 , -0.59791083,  0.73016143,  0.08452251],
       [-0.47983899, -0.07623608, -0.17337266, -0.85667061],
       [ 0.75365743, -0.54583143, -0.07548102, -0.3582892 ]])

第四步,根据特征值的权重,筛选特征向量

C = vector[:,2:]
v = value[::-1]
v
array([4.22824171, 0.24267075, 0.0782095 , 0.02383509])
# 累加和
v.cumsum()/v.sum()
array([0.92461872, 0.97768521, 0.99478782, 1.        ])
pca = PCA(n_components=0.93)#下限,只要大于,就可以
pca.fit_transform(X).shape
(150, 2)

第五步,进行矩阵运算

D = A.dot(C)
r,c = D.shape
coef = [-1 if (i+1)%2 == 0 else 1 for i in range(c)]#偶数列,乘了负一
E = (D*coef)[:,[1,0]]
E[:5]
array([[-2.68412563,  0.31939725],
       [-2.71414169, -0.17700123],
       [-2.88899057, -0.14494943],
       [-2.74534286, -0.31829898],
       [-2.72871654,  0.32675451]])
X_pca[:5]
array([[-1.30533786,  0.64836932],
       [-1.31993521, -0.35930856],
       [-1.40496732, -0.29424412],
       [-1.33510889, -0.64613986],
       [-1.32702321,  0.6633044 ]])

第六步,进行标准化

F = (E - E.mean(axis = 0))/E.std(axis = 0)
F[:5]
array([[-1.30971087,  0.65054141],
       [-1.32435711, -0.36051227],
       [-1.40967409, -0.29522986],
       [-1.33958163, -0.64830449],
       [-1.33146886,  0.66552653]])
X_pca[:5]
array([[-1.30533786,  0.64836932],
       [-1.31993521, -0.35930856],
       [-1.40496732, -0.29424412],
       [-1.33510889, -0.64613986],
       [-1.32702321,  0.6633044 ]])

二、代码实例

import numpy as np

from sklearn import datasets

from sklearn.neighbors import KNeighborsClassifier

# 降解:由多变少,化繁为简
# principle component analysis 主要成分
from sklearn.decomposition import PCA

import matplotlib.pyplot as plt

from sklearn.model_selection import train_test_split
X,y = datasets.load_iris(True)
# 搬家,丢掉很多,没有的东西!
X.shape#150样本,4个属性,4个属性,必然是,有的重要,有的不重要,希望去掉的不重要。
(150, 4)
# n_components保留几个最重要特征
# whiten 白色,标准化
# n_components=0.9 90%重要性的特征保留下来(一个特征50%,另一个41%)
pca = PCA(n_components=0.98,whiten = False)
'''y : None
    Ignored variable.'''
# 为了以后,可以兼容,后面版本,改进,加入y
# sklearn 写代码,深思熟虑,保留了y位置,现在,没用!
pca.fit(X)
X_pca = pca.transform(X)#变换
# 降维,样本数量150会变化吗?
X_pca.shape# 经过PCA降维,发现数据由原来的150*4 ------> 150*2
(150, 3)

没有降维的数据,进行训练预测

knn = KNeighborsClassifier(n_neighbors=5)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2,random_state = 1024)
knn.fit(X_train,y_train)
knn.score(X_test,y_test)
0.9666666666666667

降维的数据,效果

knn = KNeighborsClassifier(n_neighbors=5)
X_train,X_test,y_train,y_test = train_test_split(X_pca,y,test_size = 0.2,random_state = 1024)
knn.fit(X_train,y_train)
knn.score(X_test,y_test)
0.9666666666666667
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容