8.数据降维--LDA线性判别

一、线性判别的原理

import warnings
warnings.filterwarnings('ignore')
import numpy as np

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

from sklearn import datasets
X,y = datasets.load_iris(True)
X[:5]
array([[5.1, 3.5, 1.4, 0.2],
       [4.9, 3. , 1.4, 0.2],
       [4.7, 3.2, 1.3, 0.2],
       [4.6, 3.1, 1.5, 0.2],
       [5. , 3.6, 1.4, 0.2]])
# 矩阵运算,投影,原来的值,不同了呀
'''n_components : int, optional (default=None)
    Number of components (<= min(n_classes - 1, n_features)) for
    dimensionality reduction. If None, will be set to
    min(n_classes - 1, n_features).'''
# n_features = 4
# n_classes = 3
# <= min(3 - 1, 4) = 2)
lda = LinearDiscriminantAnalysis(solver= 'eigen',n_components=2)
lda.fit(X,y)
X_lda = lda.transform(X)
X_lda[:5]
array([[6.01716893, 7.03257409],
       [5.0745834 , 5.9344564 ],
       [5.43939015, 6.46102462],
       [4.75589325, 6.05166375],
       [6.08839432, 7.24878907]])

自己手动计算

第一步计算总的散度矩阵,协方差 St :scatter total


St = np.cov(X,rowvar=False,bias = True)
St
array([[ 0.68112222, -0.04215111,  1.26582   ,  0.51282889],
       [-0.04215111,  0.18871289, -0.32745867, -0.12082844],
       [ 1.26582   , -0.32745867,  3.09550267,  1.286972  ],
       [ 0.51282889, -0.12082844,  1.286972  ,  0.57713289]])

第二步 计算类内的散度矩阵Sw :scatter within


Sw = np.zeros(shape = (4,4))
for i in range(3):
    index = y == i
    Sw += np.cov(X[index],rowvar=False,bias = True)/3 # 一类数据
Sw
array([[0.259708  , 0.09086667, 0.164164  , 0.03763333],
       [0.09086667, 0.11308   , 0.05413867, 0.032056  ],
       [0.164164  , 0.05413867, 0.181484  , 0.041812  ],
       [0.03763333, 0.032056  , 0.041812  , 0.041044  ]])

第三步,计算类间的散度矩阵,Sb ,scatter between


Sb = St - Sw
Sb
array([[ 0.42141422, -0.13301778,  1.101656  ,  0.47519556],
       [-0.13301778,  0.07563289, -0.38159733, -0.15288444],
       [ 1.101656  , -0.38159733,  2.91401867,  1.24516   ],
       [ 0.47519556, -0.15288444,  1.24516   ,  0.53608889]])
# scipy 是高级的科学计算工具包,相对numpy来说,更多的,高级方法
from scipy import linalg

第四步,计算特征值和特征向量,考虑类间散度矩阵,类内的散度矩阵,排序

values,vectors = linalg.eigh(Sb,Sw)
vect =vectors[:,values.argsort()[::-1]]

第五步,筛选特征向量,进行矩阵运算

result = X.dot(vect[:,[0,1]])
result[:5]
array([[6.01716893, 7.03257409],
       [5.0745834 , 5.9344564 ],
       [5.43939015, 6.46102462],
       [4.75589325, 6.05166375],
       [6.08839432, 7.24878907]])
X_lda[:5]
array([[6.01716893, 7.03257409],
       [5.0745834 , 5.9344564 ],
       [5.43939015, 6.46102462],
       [4.75589325, 6.05166375],
       [6.08839432, 7.24878907]])

二、代码实例:

import warnings
warnings.filterwarnings('ignore')
import numpy as np
# LDA 线性判别
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.decomposition import PCA

from sklearn import datasets

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
# 上课示例代码,工作数据会复杂一些
# 官网提供,经典案例,学以致用!
X,y = datasets.load_iris(True)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2,random_state = 512)

相通的

老师两种一种是:知识传播者

另一种老师:授人以渔

奇异值(非满秩矩阵),特征值(满秩矩阵),线性代数中概念

A = X - X.mean(axis = 0)
B = np.cov(A,rowvar=False)# B是一个方阵,四行四列
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]])
# B 是一个方阵,4*4
# 矩阵有秩 = 4,满秩的
# B矩阵的秩 < 4 ,非满秩矩阵,奇异矩阵
np.linalg.matrix_rank(B)
4
# 矩阵C,奇异矩阵
C = np.array([[1,2,3,4],[2,4,6,8],[2,6,1,3],[-1,2,0,6]])
display(C)
np.linalg.matrix_rank(C) # 奇异矩阵
array([[ 1,  2,  3,  4],
       [ 2,  4,  6,  8],
       [ 2,  6,  1,  3],
       [-1,  2,  0,  6]])





3
#  x + y = 3
#  2x + y = 4
# x = 1 y = 2
X1 = np.array([[1,1],[2,1]])
np.linalg.matrix_rank(X1)#满秩矩阵,方程有解!!!唯一解!
2
# x+ y = 3
# 2x + 2y = 6
# x,y ?
X2 = np.array([[1,1],[2,2]])
np.linalg.matrix_rank(X2)#非满秩,方程无解(无穷多个解,无解)!!!奇异矩阵
1

对矩阵B(鸢尾花,属性协方差),特征值和特征向量以及SVD奇异值分解

B是满秩矩阵

# linalg ---->linear(线性) algebra(代数)
# 特征值
l,v = np.linalg.eig(B)
display(l,v)
array([4.22824171, 0.24267075, 0.0782095 , 0.02383509])



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

验证特征值特征和特征向量

Av = \lambda v

B.dot(v)
array([[ 1.52802986, -0.15933489, -0.04552026,  0.00751967],
       [-0.35738162, -0.17718882,  0.04676231, -0.00762063],
       [ 3.62221038,  0.04207247,  0.00596239, -0.01143701],
       [ 1.51493333,  0.01831704,  0.0426892 ,  0.01796349]])
l[0]*(v[:,0])
array([ 1.52802986, -0.35738162,  3.62221038,  1.51493333])
l[1]*v[:,1]
array([-0.15933489, -0.17718882,  0.04207247,  0.01831704])
l[2]*v[:,2]
array([-0.04552026,  0.04676231,  0.00596239,  0.0426892 ])
l[3]*v[:,3]
array([ 0.00751967, -0.00762063, -0.01143701,  0.01796349])

验证奇异值分解

# X3不是方阵
X3  = np.random.randint(0,10,size = (3,5)) # X3.shape = m*n m = 3,n = 5
X3
array([[5, 6, 1, 3, 3],
       [8, 9, 4, 1, 8],
       [8, 8, 8, 6, 0]])
# 奇异值分解
U,sigma,V = np.linalg.svd(X3)
display(U,sigma,V)
array([[-0.394634  ,  0.14426999,  0.90744156],
       [-0.65332272,  0.65038133, -0.38752233],
       [-0.64609088, -0.74578167, -0.16240772]])



array([21.76187304,  7.3624042 ,  2.49316791])



array([[-0.56835544, -0.61651107, -0.37573291, -0.26255874, -0.29457408],
       [-0.00568467,  0.102249  , -0.43741935, -0.46065099,  0.76549187],
       [ 0.05525797,  0.26379556, -0.7788924 ,  0.54563353, -0.15155575],
       [ 0.13517964, -0.65062123,  0.09163103,  0.56508074,  0.48031863],
       [-0.80969921,  0.34141348,  0.228953  ,  0.31911029,  0.27124375]])

A = U\sum V

sigma2 = np.eye(N = 3,M = 5)
for i in range(3):
    sigma2[i,i] = sigma[i]
sigma2
array([[21.76187304,  0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  7.3624042 ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  2.49316791,  0.        ,  0.        ]])
X3
array([[5, 6, 1, 3, 3],
       [8, 9, 4, 1, 8],
       [8, 8, 8, 6, 0]])
U.dot(sigma2).dot(V)
array([[ 5.00000000e+00,  6.00000000e+00,  1.00000000e+00,
         3.00000000e+00,  3.00000000e+00],
       [ 8.00000000e+00,  9.00000000e+00,  4.00000000e+00,
         1.00000000e+00,  8.00000000e+00],
       [ 8.00000000e+00,  8.00000000e+00,  8.00000000e+00,
         6.00000000e+00, -1.45763702e-15]])

使用LDA线性判别,进行数据的降维

lda = LinearDiscriminantAnalysis(solver='eigen', n_components = 2)
lda.fit(X_train,y_train)#有监督
X_train_lda = lda.transform(X_train)#训练数据
X_test_lda = lda.transform(X_test)
X_lda.shape
(150, 2)
knn = KNeighborsClassifier()
knn.fit(X_train_lda,y_train)
knn.score(X_test_lda,y_test)
0.9666666666666667
pca = PCA(n_components=2)
pca.fit(X_train)# 无监督学习,没有目标值y
X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test)
X_train_pca.shape
(120, 2)
knn = KNeighborsClassifier()
knn.fit(X_train_pca,y_train)
knn.score(X_test_pca,y_test)
0.9
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容