# -*- coding: utf-8 -*-
'''
Created on 2018年1月18日
@author: Jason.F
@summary: 特征抽取-LDA方法,监督,发现最优化分类的特征子空间,基于特征呈正态分布和特征间相互独立
'''
import pandas as pd
import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
#第一步:导入数据,对原始d维数据集做标准化处理
df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data',header=None)
df_wine.columns=['Class label','Alcohol','Malic acid','Ash','Alcalinity of ash','Magnesium','Total phenols','Flavanoids','Nonflavanoid phenols','Proanthocyanins','Color intensity','Hue','OD280/OD315 of diluted wines','Proline']
print ('class labels:',np.unique(df_wine['Class label']))
#分割训练集合测试集
X,y=df_wine.iloc[:,1:].values,df_wine.iloc[:,0].values
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=0)
#特征值缩放-标准化
stdsc=StandardScaler()
X_train_std=stdsc.fit_transform(X_train)
X_test_std=stdsc.fit_transform(X_test)
#第二步:对于每一类别计算d维的均值向量
np.set_printoptions(precision=4)
mean_vecs=[]
for label in range(1,4):mean_vecs.append(np.mean(X_train_std[y_train==label],axis=0))print ('MV %s: %s \n' %(label,mean_vecs[label-1]))
#第三步:构造类间的散布矩阵和类内的散布矩阵
d=13 #特征数量
#计算类内散布矩阵
#观察训练集的类别样本是否均匀,计算散布矩阵的前提是训练集的类标是均匀分布的
print ('class label distribution:%s' %np.bincount(y_train)[1:])
S_W=np.zeros((d,d))#初始化类内散布矩阵
for label,mv in zip(range(1,4),mean_vecs):#class_scatter=np.zeros((d,d))#for row in X[y==label]:#    row,mv =row.reshape(d,1),mv.reshape(d,1)#    class_scatter+= (row-mv).dot((row-mv).T)#类标分布不均匀,对特征值做标准化,用标准化后的特征值计算散布矩阵class_scatter=np.cov(X_train_std[y_train==label].T)#协方差矩阵是归一化的散布矩阵S_W += class_scatter
print ('Within-class scatter matrix: %sx%s' %(S_W.shape[0],S_W.shape[1]))
#计算类间散布矩阵
mean_overall = np.mean(X_train_std,axis=0)
S_B=np.zeros((d,d))#初始化类间散布矩阵
for i ,mean_vec in enumerate(mean_vecs):n=X_train_std[y_train==i+1,:].shape[0]mean_vec=mean_vec.reshape(d,1)mean_overall=mean_overall.reshape(d,1)S_B+=n*(mean_vec-mean_overall).dot((mean_vec-mean_overall).T)
print ('Between-class scatter matrix: %sx%s' %(S_B.shape[0],S_B.shape[1]))
#第四部:计算类间类内乘积的矩阵的特征值和特征向量
eigen_vals,eigen_vecs=np.linalg.eig(np.linalg.inv(S_W).dot(S_B))
eigen_pairs=[(np.abs(eigen_vals[i]), eigen_vecs[:, i]) for i in range(len(eigen_vals))]
eigen_pairs=sorted(eigen_pairs,key=lambda k:k[0],reverse=True)
print ('Eigenvalues in decreasing order:\n')
for eigen_val in eigen_pairs:print (eigen_val[0])
#可视化特征判定类别区分能力的图,按照特征值排序绘制出特征对线性判别信息保持程度
tot=sum(eigen_vals.real)
discr=[(i/tot) for i in sorted(eigen_vals.real,reverse=True)]
cum_discr=np.cumsum(discr)
plt.bar(range(1,14),discr,alpha=0.5,align='center',label='individual discriminability')
plt.step(range(1,14),cum_discr,where='mid',label='cumulative discriminability')
plt.ylabel('discriminability ratio')
plt.xlabel('Linear Discriminants')
plt.ylim([-0.1,1.1])
plt.legend(loc='best')
plt.show()
#第五步:选取前k个特征值所对应的特征向量,构造一个dXk维的转换矩阵W,其中特征向量以列的形式排列
w=np.hstack((eigen_pairs[0][1][:,np.newaxis].real,eigen_pairs[1][1][:,np.newaxis].real))#选取前2个特征,构建13X2维的映射矩阵W
print ('Matrix W:\n',w)
#第六步:使用转换矩阵W将样本映射到新的特征子空间
X_train_lda=X_train_std.dot(w)
X_test_lda=X_test_std.dot(w)
colors=['r','b','g']
markers=['s','x','o']
for l,c,m in zip(np.unique(y_train),colors,markers):plt.scatter(X_train_lda[y_train == l, 0],X_train_lda[y_train == l, 1],c=c, label=l, marker=m)
plt.xlabel('LD 1')
plt.ylabel('LD 2')
plt.legend(loc='upper right')
plt.show()
#第五步:转换后的数据集进行线性训练
lr=LogisticRegression()
lr.fit(X_train_lda,y_train)
print ('Training accuracy:',lr.score(X_train_lda, y_train))
print ('Test accuracy:',lr.score(X_test_lda, y_test))

结果:

('class labels:', array([1, 2, 3], dtype=int64))
MV 1: [ 0.9259 -0.3091  0.2592 -0.7989  0.3039  0.9608  1.0515 -0.6306  0.53540.2209  0.4855  0.798   1.2017] MV 2: [-0.8727 -0.3854 -0.4437  0.2481 -0.2409 -0.1059  0.0187 -0.0164  0.1095-0.8796  0.4392  0.2776 -0.7016] MV 3: [ 0.1637  0.8929  0.3249  0.5658 -0.01   -0.9499 -1.228   0.7436 -0.76520.979  -1.1698 -1.3007 -0.3912] class label distribution:[40 49 35]
Within-class scatter matrix: 13x13
Between-class scatter matrix: 13x13
Eigenvalues in decreasing order:452.721581245
156.43636122
1.07585370555e-13
4.43873563999e-14
2.87266009341e-14
2.84217094304e-14
2.40168676571e-14
1.59453089024e-14
1.59453089024e-14
9.93723443031e-15
9.93723443031e-15
2.82769841287e-15
2.82769841287e-15
('Matrix W:\n', array([[-0.0662, -0.3797],[ 0.0386, -0.2206],[-0.0217, -0.3816],[ 0.184 ,  0.3018],[-0.0034,  0.0141],[ 0.2326,  0.0234],[-0.7747,  0.1869],[-0.0811,  0.0696],[ 0.0875,  0.1796],[ 0.185 , -0.284 ],[-0.066 ,  0.2349],[-0.3805,  0.073 ],[-0.3285, -0.5971]]))
('Training accuracy:', 0.99193548387096775)
('Test accuracy:', 1.0)

【Python-ML】抽取最优化分类的特征子空间的LDA方法相关推荐

  1. ML之二分类预测:以岩石水雷数据集(RockMine)为例从0到1深入理解科学预测之分类问题的思路框架(特征工程详细步骤(特征分析与特征处理)+分类模型设计)

    ML之二分类预测:以岩石水雷数据集(RockMine)为例从0到1深入理解科学预测之分类问题的思路框架(特征工程详细步骤+分类模型设计) 目录 一.总体思路框架 二.特征工程详细步骤(特征分析与特征处 ...

  2. 基于朴素贝叶斯+Python实现垃圾邮件分类和结果分析

    基于朴素贝叶斯+Python实现垃圾邮件分类 朴素贝叶斯原理 请参考: 贝叶斯推断及其互联网应用(二):过滤垃圾邮件 Python实现 源代码主干来自: python实现贝叶斯推断--垃圾邮件分类 我 ...

  3. ML之多分类预测之PLiR:使用PLiR实现对六类label数据集进行多分类

    ML之多分类预测之PLiR:使用PLiR实现对六类label数据集进行多分类 目录 输出结果 设计思路 核心代码 输出结果 [[1.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, ...

  4. ML之多分类预测:以某个数据集为例从0到1深入理解科学预测之多分类问题的思路框架

    ML之多分类预测:以某个数据集为例从0到1深入理解科学预测之多分类问题的思路框架 目录 一.总体思路框架 二.各个步骤详细说明 一.总体思路框架 二.各个步骤详细说明

  5. Python KNN K近邻分类

    Python KNN K近邻分类 1 声明 本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理. 2 KNN简介 相关概念见下: 对于给定的观测来 ...

  6. Python实现鸢尾花数据集分类问题——基于skearn的SVM(有详细注释的)

    Python实现鸢尾花数据集分类问题--基于skearn的SVM 代码如下: 1 # !/usr/bin/env python2 # encoding: utf-83 __author__ = 'Xi ...

  7. python实现logistic_使用python实现logistic二分类

    这段时间做了一个二分类的任务,训练数据是8000个包含1000个特征和一个label的数据.下面记录一下使用python实现logistic二分类的代码. import os import time ...

  8. knn算法python代码_K-最近邻分类算法(KNN)及python实现

    一.引入 问题:确定绿色圆是属于红色三角形.还是蓝色正方形? KNN的思想: 从上图中我们可以看到,图中的数据集是良好的数据,即都打好了label,一类是蓝色的正方形,一类是红色的三角形,那个绿色的圆 ...

  9. Python实现鸢尾花数据集分类问题——基于skearn的LogisticRegression

    Python实现鸢尾花数据集分类问题--基于skearn的LogisticRegression 一. 逻辑回归 逻辑回归(Logistic Regression)是用于处理因变量为分类变量的回归问题, ...

最新文章

  1. 如何将Unix时间戳转换为DateTime,反之亦然?
  2. Hibernate中自动生成数据库表的两种方式
  3. KDT#91 DW/BI系统的营销(二)
  4. 0.0 目录-深度学习第五课《序列模型》-Stanford吴恩达教授
  5. 实例讲解ThinkPHP的UploadFile文件上传类的详细用法
  6. 在vm中安装linux虚拟机,如何在vm虚拟机中安装linux
  7. go ssh 执行多个命令_Gox语言中通过SSH远程执行命令及上传下载文件-GX10
  8. php_mongo模块,PHP安装mongo模块详细步骤
  9. 计算机应用基础课改期望,《计算机应用基础》课改总结.doc
  10. 现在很多公司都在辞退年龄超过35岁以上的员工,原因到底为什么?
  11. 网课查课插件 支持 60类型+ 彩虹查课插件 网络查课查询
  12. Java检验yyyymm合法,JAVA日期格式校验正则表达式方法,yyyy年MM月,yyyy-MM-dd格式等...
  13. 利用Resource Hacker简单去除WinRar广告
  14. ROVIO mobile webcam 路威机器人
  15. Vue3.0中Watch的几个问题
  16. 大雄宝殿的“大雄”是什么意思
  17. 堪称神级的Java技术栈手册火了!
  18. Apple ProRes编码
  19. 五、angularjs在进入界面前加载数据
  20. OpenWrt之quilt打补丁

热门文章

  1. linux编程基础_第1篇 Linux系统编程 -多线程基础
  2. 中间画一条短竖线_许愿孔明灯怎么画,简约好看的孔明灯简笔画教程
  3. Zabbix的snmp监控
  4. python数字加密解密_Python对整形数字进行加密和解密
  5. 综述论文要写英文摘要吗_速成本科毕业论文初稿!!!
  6. ubuntu之路——day8.4 Adam自适应矩估计算法
  7. python学习之散学
  8. 深入理解乐观锁与悲观锁
  9. 三相不平衡的原因、危害以及解决措施
  10. 理解Flight框架核心