[关闭]
@anboqing 2015-06-18T14:10:29.000000Z 字数 3238 阅读 9414

用pandas中的parallel_coordinates可视化高维数据

可视化 pandas


1.引言

在处理数据时常常需要对数据进行可视化以便观察,但是,在笛卡尔坐标系下,超过3维的数据我们就无法可视化了,所以,我们就需要一种有效的方法来可视化高维数据.

常用的方法有Parallel Coordinates,关于这个方法的介绍可以看wikipedia页面,这里就不再重复了.

2.python解决方案

用python实现高维数据可视化需要用到几个库函数 :
1. Pandas : parallel_coordinates
2. Pandas : DataFrame
3. scikit-learn : datasets.load_iris()
4. Numpy

这里有一个简单的教程来熟悉pands语法:
10分钟熟悉pandas

如果对pandas的数据结构不了解,还要熟悉一下它的数据结构
Pandas 数据结构简介

DataFrame 的API文档

材料准备齐全,就可以开始进行可视化操作了.


3. 实现过程

3.1 准备数据

首先找一个经典的4维数据集: 鸢尾花 iris数据集 wiki ,uci下载地址

数据集简要描述:

只有四个属性:

  1. sepal length in cm
  2. sepal width in cm
  3. petal length in cm
  4. petal width in cm

共三类:


3.1.1 导入数据

由于scikit-learn已经内建了这个数据集,可以直接导入使用

  1. from sklearn import datasets
  2. data_origin = datasets.load_iris()

data_origin是一个 python 字典, 包含了


3.1.2 处理数据

由于我们要调用 pandas 的 parallel_coordinates 函数,它需要一个 Pandas.DataFrame 对象格式的数据,所以我们要把上面的数据包装到一个 DataFrame对象里.

DataFrame对象其实就和Sql数据库中的表一样,它和矩阵的不同之处在于它包含了每一列的名称和每一行的名称.

由于Pandas可以由多种数据类型构造:

这里,我选用第一种方式,用python中的字典对象构造.把iris数据包装成一个DataFrame对象,前四列是每个特征对应的值,最后一列是该行数据的数据类型(用target_name构造).每一行是一个数据.

  1. # 先把数据提取出来
  2. data = data_origin['data']
  3. # 处理类标签数据
  4. target= data_origin['target']
  5. target_names = data_origin['target_names']
  6. target_labels=[]
  7. for class_num in target:
  8. target_labels.append(target_names[class_num])
  9. feature_names = data_origin['feature_names']
  10. # 合成字典
  11. data_dict = {}
  12. column = 0
  13. for feature_name in feature_names:
  14. data_dict[feature_name] = data[:,column]
  15. column+=1
  16. data_dict['target_labels'] = target_labels

有了字典后就可以合成pandas DataFrame了

  1. # 包装成 DataFrame
  2. import pandas as pd
  3. pd_data = pd.DataFrame(data_dict)

3.1.3 画图

有了数据后,画图就十分方便,只需要调用 pandas 的内置函数 parallel_coordinates() 就好了:

  1. from pandas.tool.plotting import parallel_coordinates
  2. import matplotlib.pyplot as plt
  3. plt.figure()
  4. parallel_coordinates(pd_data,'target-labels')
  5. plt.show()

这样,图就画好了 :
plot

画一个 500维的数据集 madelon

  1. #coding=utf-8
  2. __author__ = 'anboqing'
  3. from pandas.tools.plotting import parallel_coordinates
  4. import pandas as pd
  5. import numpy as np
  6. import LoadLibSvm as ld
  7. import matplotlib.pyplot as plt
  8. origin_data,origin_label = ld.load_libsvm_data('madelon')
  9. #print type(origin_data)
  10. # 读取到原始数据和数据的标签后,要包装成一个DataFrame对象
  11. #print np.shape(origin_label)
  12. mat_data = np.mat(origin_data)
  13. mat_data = mat_data.transpose()
  14. """
  15. #print type(mat_data)
  16. arr_data = np.array(origin_data)
  17. #print arr_data.shape
  18. print type(arr_data)
  19. print type(mat_data[1,:])
  20. arr = np.array(mat_data[1,:])
  21. lst = list(arr)
  22. print type(lst)
  23. print np.shape(lst)
  24. print lst[0]
  25. lst = list(lst[0])
  26. print lst[0]
  27. print type(lst[0])
  28. """
  29. # 先包装成一个dict
  30. data_dict = {}
  31. for idx in range(mat_data.shape[0]):
  32. arr = np.array(mat_data[idx,:])
  33. lst = list(arr)
  34. lst = list(lst[0])
  35. data_dict[str(idx)] = lst
  36. data_dict['label']=origin_label
  37. pd_df = pd.DataFrame(data_dict)
  38. """
  39. 选了4列来画,能画出来,说明方法是对的,然而画所有列全都是黑的,说明图片尺寸太小了
  40. small_data = pd.DataFrame(pd_df,columns=['1','2','3','label'])
  41. plt.figure()
  42. parallel_coordinates(small_data,'label')
  43. plt.show()
  44. """
  45. plt.figure(figsize=(100,50),dpi=20)
  46. parallel_coordinates(pd_df,'label')
  47. plt.show()

画出来效果是这样:
小图
下面是大图,可以在新页面打开放大看细节:
4M大图

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注