# -*- coding: utf-8 -*-
'''
Created on 2018年1月18日
@author: Jason.F
@summary: 特征抽取-PCA方法,无监督、线性
'''
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']))
#print (df_wine.head(5))
#分割训练集合测试集
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)
#第二步:构造样本的协方差矩阵
cov_mat=np.cov(X_train_std.T)#d=13维,构造13X13维的协方差矩阵
eigen_vals,eigen_vecs=np.linalg.eig(cov_mat)#计算线性矩阵的特征值和特征向量
print ('\nEigenvalues \n %s'%eigen_vals) #13个特征值
print (eigen_vecs.shape)#13X13的特征向量矩阵
#计算特征值占比,观察期方差贡献率,目标是寻找最大方差的成分
tot=sum(eigen_vals)
var_exp=[(i/tot) for i in sorted(eigen_vals,reverse=True)]
cum_var_exp=np.cumsum(var_exp)
plt.bar(range(1,14),var_exp,alpha=0.5,align='center',label='individual explained variance')
plt.step(range(1,14),cum_var_exp,where='mid',label='cumulative explained variance')
plt.ylabel('Explained variance ratio')
plt.xlabel('Principal components')
plt.legend(loc='best')
plt.show()
#第三部:选择前k个最大特征值对应的特征向量,构造k个特征项的映射矩阵W
eigen_pairs=[(np.abs(eigen_vals[i]), eigen_vecs[:, i]) for i in range(len(eigen_vals))]
eigen_pairs.sort(reverse=True)
w=np.hstack((eigen_pairs[0][1][:,np.newaxis],eigen_pairs[1][1][:,np.newaxis]))#选取前2个特征,构建13X2维的映射矩阵W
print ('Matrix W:\n',w)
#第四步:通过映射矩阵W将d=13维的输入数据集X转换到新的k=2维特征子空间
print (X_train_std[0].dot(w)) #转换一行,一个样本
X_train_pca=X_train_std.dot(w)#转换整个样本集,从13维到2维
X_test_pca=X_test_std.dot(w)
print (X_train_pca.shape)
#用二维散点图可视化降维后的样本
colors=['r','b','g']
markers=['s','x','o']
for l,c,m in zip(np.unique(y_train),colors,markers):plt.scatter(X_train_pca[y_train == l, 0],X_train_pca[y_train == l, 1],c=c, label=l, marker=m)
plt.xlabel('PC 1')
plt.ylabel('PC 2')
plt.legend(loc='lower left')
plt.show()
#第五步:转换后的数据集进行线性训练
lr=LogisticRegression()
lr.fit(X_train_pca,y_train)
print ('Training accuracy:',lr.score(X_train_pca, y_train))
print ('Test accuracy:',lr.score(X_test_pca, y_test))

结果:

('class labels:', array([1, 2, 3], dtype=int64))Eigenvalues [ 4.8923083   2.46635032  1.42809973  1.01233462  0.84906459  0.601815140.52251546  0.08414846  0.33051429  0.29595018  0.16831254  0.214322120.2399553 ]
(13L, 13L)
('Matrix W:\n', array([[ 0.14669811,  0.50417079],[-0.24224554,  0.24216889],[-0.02993442,  0.28698484],[-0.25519002, -0.06468718],[ 0.12079772,  0.22995385],[ 0.38934455,  0.09363991],[ 0.42326486,  0.01088622],[-0.30634956,  0.01870216],[ 0.30572219,  0.03040352],[-0.09869191,  0.54527081],[ 0.30032535, -0.27924322],[ 0.36821154, -0.174365  ],[ 0.29259713,  0.36315461]]))
[ 2.59891628  0.00484089]
(124L, 2L)
('Training accuracy:', 0.967741935483871)
('Test accuracy:', 0.98148148148148151)


【Python-ML】无监督线性降维PCA方法相关推荐

  1. 【阅读论文】基于统计特征的无监督时间序列异常检测方法

    文章目录 摘要 1.介绍 2.相关工作 3.问题描述 4.方法 4.1 统计特征 4.2提取特征总结 4.3 学习阶段算法 4.4测试阶段算法 5.结果 5.1 YOB评价:单变量 5.3对合成数据集 ...

  2. 从易到难,针对复杂问题的无监督式问题分解方法

    论文标题: Unsupervised Question Decomposition for Question Answering 论文作者: Ethan Perez (FAIR,NYU), Patri ...

  3. 一种新的无监督前景目标检测方法 A New Unsupervised Foreground Object Detection Method

    14.一种新的无监督前景目标检测方法 A New Unsupervised Foreground Object Detection Method 摘要:针对基于无监督特征提取的目标检测方法效率不高的问 ...

  4. 对抗样本无法被重建!CMU提出通用的无监督对抗攻击检测方法

    作者 | Ben Dickson 编译 | 琰琰 机器学习在应用程序中的广泛使用,引起了人们对潜在安全威胁的关注.对抗性攻击( adversarial attacks)是一种常见且难以察觉的威胁手段, ...

  5. 最强无监督行人重识别方法 Cluster Contrast ReID

    https://github.com/xiaomingzhid/sskd GitHub - JDAI-CV/fast-reid: SOTA Re-identification Methods and ...

  6. 最强无监督行人重识别方法 Cluster Contrast ReID,rank-1 94.6%

    代码连接: https://github.com/alibaba/cluster-contrast-reid 看了一下,主要是resnet50,resnet101训练的. 在行人重识别领域,如何获取海 ...

  7. ACL 2020 | 多跳问答的基于对齐的无监督迭代解释检索方法

    ©PaperWeekly 原创 · 作者|舒意恒 学校|南京大学硕士生 研究方向|知识图谱 论文标题:Unsupervised Alignment-based Iterative Evidence R ...

  8. A Two-stage Unsupervised Approach for Low light Image Enhancement(一种两阶段无监督的微光图像增强方法)

    主要参考文献及其收获 Unpaired image-to-image translation using cycle-consistent adversarial networks Deep reti ...

  9. java 实现协方差_无监督数据降维技术-主成分分析(PCA)的Python实现

    网上已经有非常多的大佬讲解了PCA的原理,我这里不再赘述原理问题,主要说一说如何用代码实现我们PAC与Python自己的库 如果有小伙伴想了解PCA的具体数学原理,我推荐大家看看这两篇文章,讲的都非常 ...

最新文章

  1. [leetcode-JavaScript]---23、合并K个排序链表
  2. Oracle 数据库查看具有sysdba系统权限用户,设置、重置sys用户密码
  3. PHP SHA1withRSA加密生成签名及验签
  4. Message Queue中的推与拉(转)
  5. 李备:期待移动端非线性自适应滤波器
  6. PHP判断客户端的浏览器类型
  7. 我在外包公司做增删改查有前途么?
  8. typora用Pandoc导出html,Typora安装 Pandoc实现导出功能
  9. python 生成对称矩阵_对称矩阵| 使用Python的线性代数
  10. pdo mysql_num_rows_PHP-mysql_num_rows()期望参数1为资源,给定布尔...
  11. 计算机课flash课件,flash动画制作获奖课件
  12. KindEditor的简单应用
  13. 用java输出一个心型图案_开发工程师的浪漫--java打印心形图案
  14. JS如何判断包括IE11在内的IE浏览器
  15. Keil MDK又来了一个小升级
  16. html中submit和button的区别(总结)
  17. virt-viewer的简单使用
  18. Androidnbsp;学习论坛博客及网站推荐(…
  19. ps改变叶子中的图片
  20. 在linux系统里面进行rar文件的解锁

热门文章

  1. ad20如何导入库_一文看懂如何使用(Py)Stan进行贝叶斯推理
  2. Kafka:分布式消息队列的抽象模型
  3. 修改hosts文件使apache绑定域名指向本机
  4. hdu 3652 B-number(数位DP)
  5. 【Python 13】分形树绘制1.0--五角星(turtle库)
  6. *1408素数回文数的个数
  7. HDU 2037 今年暑假不AC
  8. 2017年 1月 15日 指针 学习整理
  9. 利用.net4.0的dynamic特性制造的超级简单的微信SDK
  10. java反射机制(三)---java的反射和代理实现IOC模式 模拟spring