再探mlpy,降维、分类、可视化

一个非常常见的问题就是遇到的数据是多维度数据,维度过高会导致模型极度的复杂,折衷的法案就是降维,然后再Q聚类、分类、回归。降维强调在不损失准确性的前提下来降低维度(选出最优特征

PCA是最常见降维算法,它寻找线性不相关的特征子集(主要因子),另外还有LDA(Linear Discriminant Analysis,线性判别分析)、MDS(Multidimensional Scaling,多维标度分析),文末的引文非常推荐,大牛总结的比较透๑乛◡乛๑

以下采用mlpy模块中的PCA方法和LibSvm来进行降维和分类。注:当执行mlpy.LibSvm.learn(z,y)时会报错,暂时还不晓得怎么处理,这里仅做记录分享,有知道的小伙伴务必告知吖

 

 1 # -*- coding: utf-8 -*-
 2 """
 3 Created on Fri Oct 19 09:54:54 2018
 4 
 5 @author: Luove
 6 """
 7 
 8 import numpy as np
 9 import matplotlib.pyplot as plt
10 import mlpy
11 from matplotlib import cm
12 
13 
14 filepath='D:\Analyze\Python Matlab\Python\DataLib Py\wine.data'
15 def getdata():
16     list1 = [line.strip().split(',') for line in open(filepath,'r').readlines()]
17     return [list(list2[1:14]) for list2 in list1],[list2[0] for list2 in list1]
18 matrix, labels = getdata()
19 
20 x1=[];y1=[]
21 x2=[];y2=[]
22 x3=[];y3=[]
23 x=0;y=1  # 分别表示酒精和苹果酸属性,表示列索引号
24 for n,elem in enumerate(matrix):  # 会生成枚举字典(自动生成键值从0开始对应各个values为list) 
25     if int(labels[n]) == 1:   # str transform to int
26         x1.append(matrix[n][x])  # 提取该类别下酒精属性列值,下同
27         y1.append(matrix[n][y])
28     elif int(labels[n]) == 2:
29         x2.append(matrix[n][x])
30         y2.append(matrix[n][y])
31     elif int(labels[n]) == 3:
32         x3.append(matrix[n][x])
33         y3.append(matrix[n][y])
34 
35 plt.scatter(x1,y1,s=50,c='green',label='class 1')   # s控制点大小
36 plt.scatter(x2,y2,s=100,c='red',label='class 2')
37 plt.scatter(x3,y3,s=200,c='darkred',label='class 3')       
38 plt.title('Wine features',fontsize=14)
39 plt.xlabel('x axis')
40 plt.ylabel('y axis')
41 plt.legend()
42 plt.grid(True,linestyle='--',color='0.0')  # color='0.5',灰阶表示,取值[0,1],值越大越接近灰度越低越白,值越小越黑
43 plt.show()
44 # 降维 ,PCA(principal component analysis,principal Component Analysis)主成分分析;MDS(multidimensional scaling)多维标度分析
45 wine = np.loadtxt(filepath,delimiter=',')  # 第一列为label列其余为属性列
46 x,y=wine[:,1:6],wine[:,0].astype(np.int)
47 x.shape
48 y.shape
49 
50 pca=mlpy.PCA()  # 构建,实例化
51 pca.learn(x)  # 输入数据
52 z = pca.transform(x,k=2)  # 降为2维
53 z.shape
54 print(cm.cmap_d.keys())
55 plt.scatter(z[:,0],z[:,1],c=y,s=50,cmap=cm.Reds)
56 plt.xlabel('first component')
57 plt.ylabel('second component')
58 plt.show()
59 
60 svm=mlpy.LibSvm(kernel_type='linear',gamma=10)
61 svm.learn(x,y)
62 xmin,xmax = z[:,0].min()-0.1,z[:,0].max()+0.1
63 ymin,ymax = z[:,1].min()-0.1,z[:,1].max()+0.1
64 xx,yy = np.meshgrid(np.arange(xmin,xmax,0.01),np.arange(ymin,ymax,0.01))
65 grid = np.c_(xx.ravel(),yy.ravel())
66 result = svm.pred(grid)
67 plt.pcolormesh(xx,yy,result.reshape(xx.shape),cmap=cm.Greys_r)
68 plt.scatter(z[:,0],z[:,1],c=y,s=50,cmap=cm.Reds)
69 plt.xlabel('first component')
70 plt.ylabel('second component')
71 plt.xlim(xmin,xmax)
72 plt.ylim(ymin,ymax)

 

p.s. :实例运行中执行到61行是报错的,希望知道怎么解决的小伙伴告知,谢啦~

 

 

Ref:

人工智障学习笔记——机器学习(12)LDA降维

详解多维标度法(MDS,Multidimensional scaling)

【机器学习】支持向量机SVM原理及推导

《实用数据分析》:文中数据及mlpy文档需要可自取:https://github.com/Luove/Data

 

posted @ 2018-10-19 15:27  Luove  阅读(623)  评论(0编辑  收藏  举报