以下内容笔记出自‘跟着迪哥学python数据分析与机器学习实战’,外加个人整理添加,仅供个人复习使用。


1. 导入数据

import numpy as np
import pandas as pd
df=pd.read_csv(r'iris.data')
print(df.shape)#查看类别
print(set(df['Iris-setosa']))
df.columns=['sepal length','sepal width','petal length','petal width','class label']
df.head(6)


由于标签是分类型数据,需要转换一下。
现在需要将四维数据特征降维。

from sklearn.preprocessing import LabelEncoderX=df[['sepal length','sepal width','petal length','petal width']].values
y=df['class label'].values#映射标签(使用sklearn包快速完成标签转换)
enc=LabelEncoder()
y=enc.fit_transform(y)+1print(set(y))

{1, 2, 3}

2. 不使用sklearn调包

2.1 求解类内散布矩阵

import numpy as np
np.set_printoptions(precision=4)#保存均值
mean_vectors=[]
#计算类别
for cl in range(1,4):mean_vectors.append(np.mean(X[y==cl],axis=0))print('均值类别%s:%s\n' % (cl,mean_vectors[cl-1]))

均值类别1:[5.0041 3.4163 1.4653 0.2449]

均值类别2:[5.936 2.77 4.26 1.326]

均值类别3:[6.588 2.974 5.552 2.026]

注意这里是四个特征,上面的输出是3个类别,每个类别分别的特征均值,4维向量。

2.2 计算类内散布矩阵

s_w=np.zeros((4,4))  #4个特征
for cl,mv in zip(range(1,4),mean_vectors):class_sc_mat=np.zeros((4,4))for row in X[y==cl]:#对每个特征进行计算row,mv=row.reshape(4,1),mv.reshape(4,1)#上面的计算公式class_sc_mat+=(row-mv).dot((row-mv).T)s_w+=class_sc_mat
print('类内散布矩阵:\n',s_w)

类内散布矩阵:
[[38.9472 13.6751 24.6201 5.6598]
[13.6751 17.0281 8.1254 4.9169]
[24.6201 8.1254 27.2158 6.2507]
[ 5.6598 4.9169 6.2507 6.1736]]

2.3 计算类间散布矩阵

#全局均值
overall_mean=np.mean(X,axis=0)
overall_mean

array([5.8483, 3.051 , 3.7745, 1.2054])

#类间散布矩阵
s_b=np.zeros((4,4))#对各类别分别计算
for i,mean_vec in enumerate(mean_vectors):#当前类别样本数n=X[y==i+1,:].shape[0]mean_vec=mean_vec.reshape(4,1)overall_mean=overall_mean.reshape(4,1)#上述公式s_b+=n*(mean_vec-overall_mean).dot((mean_vec-overall_mean).T)
print('类间散布矩阵:\n',s_b)

类间散布矩阵:
[[ 62.6649 -19.1924 163.3935 70.6115]
[-19.1924 10.7842 -55.0015 -22.0477]
[163.3935 -55.0015 431.0473 184.5397]
[ 70.6115 -22.0477 184.5397 79.6021]]

2.4 组合类内与类间矩阵

#求解特征值、特征向量
eig_vals,eig_vecs=np.linalg.eig(np.linalg.inv(s_w).dot(s_b)) #s_w求解逆矩阵for i in range(len(eig_vals)):eigvec_sc=eig_vecs[:,i].reshape(4,1)print('\n特征向量{}:\n{}'.format(i+1,eigvec_sc.real))print('特征值{:}: {:.2e}'.format(i+1,eig_vals[i].real))


结果得到4个特征向量和其对应的特征值。特征向量直接观察较麻烦,因为投影在高维上较难理解,特征值较直观。这里可以认为特征值代表的是其所对应特征向量的重要程度,特征值越大,所对应的特征向量越重要,所以接下来可进行排序。

#特征值和特征向量配对
eig_pairs=[(np.abs(eig_vals[i]),eig_vecs[:,i]) for i in range(len(eig_vals))]#排序
eig_pairs=sorted(eig_pairs,key=lambda k:k[0],reverse=True)
print('特征排序结果:\n')
for i in eig_pairs:print(i[0])

特征排序结果:
31.874579396957305
0.27693748627003545
3.6168880269018654e-15
3.6168880269018654e-15

print('特征值占总体百分比:\n')
eigv_sum=sum(eig_vals)
for i,j in enumerate(eig_pairs):print('特征值[0:]: {1:.2%}'.format(i+1,(j[0]/eigv_sum).real))

特征值占总体百分比:
特征值[0:]: 99.14%
特征值[0:]: 0.86%
特征值[0:]: 0.00%
特征值[0:]: 0.00%

可以看出,第一个特征值占总体99.14%,第二个只占0.86%,第三个和第四个微不足道,这表示降维时,可以降到二维或一维,没有必要降到三维。

2.5 最终选择降到2维

W=np.hstack((eig_pairs[0][1].reshape(4,1),eig_pairs[1][1].reshape(4,1)))
print('矩阵W:\n',W.real)

矩阵W:
[[-0.2051 -0.0084]
[-0.3869 -0.5891]
[ 0.5463 0.2545]
[ 0.714 -0.7669]]

#执行降维
X_lda=X.dot(W)
print(X_lda.shape)
pd.DataFrame(X_lda).head(6)

2.6 作图比较

原始数据中挑两个特征作图:

import matplotlib.pyplot as pltdef plot_lda():ax=plt.subplot(111)for label,marker,color in zip(range(1,4),('^','s','o'),('blue','red','green')):plt.scatter(x=X[:,0].real[y==label],y=X[:,1].real[y==label],marker=marker,color=color,alpha=0.5,label=y[label])plt.xlabel('X[0]')plt.ylabel('X[1]')#plt.legend()plot_lda()


降维后数据作图:

def plot_lda():ax=plt.subplot(111)for label,marker,color in zip(range(1,4),('^','s','o'),('blue','red','green')):plt.scatter(x=X_lda[:,0].real[y==label],y=X_lda[:,1].real[y==label],marker=marker,color=color,alpha=0.5,label=y[label])plt.xlabel('X[0]')plt.ylabel('X[1]')#plt.legend()plot_lda()


可以看到,如果对原始数据集随机取两维数据,数据集并不能按类别划分开,但降维后的数据点,区分的较为明显。

(当拿到一份规模较大的数据集时,如何选定维数呢?一方面可以通过观察特征值排序结果实现,另一方面还可以通过实验来进行交叉验证)

3. sklearn调包

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDAsklearn_LDA=LDA(n_components=2)
X_lda_sklearn=sklearn_LDA.fit_transform(X,y)pd.DataFrame(X_lda_sklearn).head(6)

def plot_lda():ax=plt.subplot(111)for label,marker,color in zip(range(1,4),('^','s','o'),('blue','red','green')):plt.scatter(x=X_lda_sklearn[:,0].real[y==label],y=X_lda_sklearn[:,1].real[y==label],marker=marker,color=color,alpha=0.5,label=y[label])plt.xlabel('X[0]')plt.ylabel('X[1]')#plt.legend()plot_lda()


结果是一致的

python--LDA线性判别分析模型相关推荐

  1. LDA 线性判别分析模型

    线性判别分析(Linear Discriminant Analysis,LDA)是一种可作为特征抽取的技术,可以提高数据分析过程中的计算效率,同时对于不适用于正则化的模型,它可以降低模型灾难带来的过拟 ...

  2. 经典分类:线性判别分析模型!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:小雨姑娘,康涅狄格大学,Datawhale成员 这几天看了看SVM ...

  3. Python——两类二维数据线性判别fisher

    题目: 说明:下述问题在 Python 中编程求解. 1.已知两类二维数据, (1)第一类共 4 个样本:[6,6],[4,5],[5,5],[5,4],第二类共 4 个样本: [0,1],[1,2] ...

  4. Python 分类问题研究-Fisher线性判别

    [实验目的] 1.掌握常见机器学习分类模型思想.算法,包括Fisher线性判别.KNN.朴素贝叶斯.Logistic回归.决策树等: 2.掌握Python编程实现分类问题,模型评价指标.计时功能.保存 ...

  5. 机器学习算法(九): 基于线性判别LDA模型的分类(基于LDA手写数字分类实践)

    机器学习算法(九): 基于线性判别模型的分类 1.前言:LDA算法简介和应用 1.1.算法简介 线性判别模型(LDA)在模式识别领域(比如人脸识别等图形图像识别领域)中有非常广泛的应用.LDA是一种监 ...

  6. python实战故障诊断之CWRU数据集(五):线性判别模型及二次判别模型的应用

    文章目录 1. 概述 2. 相关原理 2.1 Fish_score 2.2 线性判别模型和二次判别模型 3. 代码实现过程 4. Tips 1. 概述   本章节通过分析轴承振动数据得到了系列信号特征 ...

  7. 线性判别结合源码分析LDA原理

    1. LDA的思想 LDA线性判别分析也是一种经典的降维方法,LDA是一种监督学习的降维技术,也就是说它的数据集的每个样本是有类别输出的.这点和PCA不同.PCA是不考虑样本类别输出的无监督降维技术. ...

  8. 线性判别准则与线性分类编程实践

    一.线性判别分析 (一)简介 线性判别分析(linear discriminant analysis,LDA)是对费舍尔的线性鉴别方法的归纳,这种方法使用统计学,模式识别和机器学习方法,试图找到两类物 ...

  9. 朴素贝叶斯分类器与Fisher线性判别实践——水果识别为例

    开篇:本次博客主要分享二分类水果实现案例,样本构造显然不具备泛化.大数量特性以及背景均为纯白色是为了方便目标提取.大家若需要更好的水果样本,Github上有许多的优秀案例.本次代码计算效率较低,代码有 ...

最新文章

  1. 在Linux平台上部署open***
  2. 不一样的STAR法则
  3. React Ways1——函数即组件
  4. 6大Facebook广告文案绝招提升你Shopify独立站的转化率
  5. 【BIEE】12_查看BIEE的物理SQL
  6. python语言的主网址-Python爬取网址中多个页面的信息
  7. bzoj1853幸运数字——容斥原理
  8. Intel Quick Sync Video Encoder 2
  9. 2019年1月《语音信号处理》期末考试
  10. Java之常用类File、IO流的中的字节流、字符流以及缓冲流的学习
  11. poj 1945 Power Hungry Cows 启发式搜索
  12. 以后咱家客厅就得装修成这样!
  13. (转) 那些无用的人----《人类简史》读后感
  14. 安装会声会影2018时出现Error1935错误的解决方法
  15. 办公软件excel表格_如何学习word和excel办公软件
  16. app 与服务器交互 token
  17. CS架构--网络通信--osi 协议---套接字socket--粘包
  18. 如何在谷歌浏览器上,查看手机客户端页面
  19. oracle11数据文件导入到9i,oracle 9i 与10g 数据导入导出
  20. have been in 和have been to

热门文章

  1. Chapter 05:扭曲透视图和鸟瞰图
  2. Mac删除文件快捷键
  3. 6. PHP接入支付宝有密退款接口
  4. python 爬虫抓取斗鱼直播间弹幕
  5. 大气等离子表面处理机 金铂利莱
  6. AD基础之绘制原理图元件符号
  7. git pr/mr 提交规范
  8. Mongodb数据库命令端常用操作
  9. 商业化广告--概念理解--DSP SSP RTB 是一个怎样的过程
  10. DS||简单扑克牌游戏(一)