再探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:
详解多维标度法(MDS,Multidimensional scaling)
《实用数据分析》:文中数据及mlpy文档需要可自取:https://github.com/Luove/Data