Python数据挖掘笔记 七 .PCA降维操作及subplot子图绘制

Python数据挖掘笔记 七 .PCA降维操作及subplot子图绘制 
这篇文章主要介绍四个知识点,也是我那节课讲课的内容。
        1.PCA降维操作;
        2.Python中Sklearn的PCA扩展包;
        3.Matplotlib的subplot函数绘制子图;
        4.通过Kmeans对糖尿病数据集进行聚类,并绘制子图。
一. PCA降维
为了减少存储量和计算时间,我们需要考虑降低问题的维度,丢弃不相关的特征。
特征降维一般有两类方法:特征选择(Feature Selection)和特征提取(Feature Extraction)。
 1.特征选择是从高纬度的特征中选择其中的一个子集来作为新的特征。最佳子集是以最少的维贡献最大的正确率,丢弃不重要的维,使用合适的误差函数进行,方法包括在向前选择(Forword Selection)和在向后选择(Backward Selection)。
        2.特征提取是指将高纬度的特征经过某个函数映射至低纬度作为新的特征。常用的特征抽取方法就是PCA(主成分分析)和LDA(线性判别分析) 。
主成分分析(Principal Component Analysis,PCA)
是一种常用的线性降维数据分析方法,其实质是在能尽可能好的代表原特征的情况下,将原特征进行线性变换、映射至低纬度空间中。


二. Python中Sklearn的PCA扩展包
案例一:
import numpy as np
from sklearn.decomposition import PCA
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca = PCA(n_components=2)
print (pca)
pca.fit(X)
print(pca.explained_variance_ratio_) 
案例二
如载入boston数据集,总共13个特征,降维成两个特征:
#载入数据集
from sklearn.datasets import load_boston
d = load_boston()
x = d.data
y = d.target
print (x[:10])
print (u'形状:', x.shape)

#降维
import numpy as np
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
newData = pca.fit_transform(x)
print (u'降维后数据:')
print (newData[:4])
print (u'形状:', newData.shape)

三. Kmeans聚类糖尿病及降维subplot绘制子图
 Matplotlib 里的常用类的包含关系为 Figure -> Axes -> (Line2D, Text, etc.)。一个Figure对象可以包含多个子图(Axes),在matplotlib中用Axes对象表示一个绘图区域,可以理解为子图。可以使用subplot()快速绘制包含多个子图的图表,它的调用形式如下:
当前的图表和子图可以使用gcf()和gca()获得,它们分别是“Get Current Figure”和“Get Current Axis”的开头字母缩写。
下面我们在Python中运行程序,然后调用gcf()和gca()查看当前的Figure和Axes对象。
import numpy as np
import matplotlib.pyplot as plt
  
plt.figure(1) # 创建图表1

plt.figure(2) # 创建图表2
ax1 = plt.subplot(211) # 在图表2中创建子图1
ax2 = plt.subplot(212) # 在图表2中创建子图2
  
x = np.linspace(0, 3, 100)
for i in range(5):
    plt.figure(1)    # 选择图表1 
    plt.plot(x, np.exp(i*x/3))
    
    plt.sca(ax1)    # 选择图表2的子图1
    plt.plot(x, np.sin(i*x))
    plt.sca(ax2)    # 选择图表2的子图2
    plt.plot(x, np.cos(i*x))
  
plt.show()
下面这个例子是通过Kmeans聚类,数据集是load_diabetes载入糖尿病数据集,然后使用PCA对数据集进行降维操作,降低成两维,最后分别聚类为2类、3类、4类和5类,通过subplot显示子图。
# -*- coding: utf-8 -*-

#糖尿病数据集
from sklearn.datasets import load_diabetes
data = load_diabetes()
x = data.data
print (x[:4])
y = data.target
print (y[:4])

#KMeans聚类算法
from sklearn.cluster import KMeans
#训练
clf = KMeans(n_clusters=2)
print (clf)
clf.fit(x)
#预测
pre = clf.predict(x)
print (pre[:10])

#使用PCA降维操作
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
newData = pca.fit_transform(x)
print (newData[:4])

L1 = [n[0] for n in newData]
L2 = [n[1] for n in newData]

#绘图
import numpy as np
import matplotlib.pyplot as plt

#用来正常显示中文标签
plt.rc('font', family='SimHei', size=8)
#plt.rcParams['font.sans-serif']=['SimHei'] 

#用来正常显示负号
plt.rcParams['axes.unicode_minus']=False 

p1 = plt.subplot(221)
plt.title(u"Kmeans聚类 n=2")
plt.scatter(L1,L2,c=pre,marker="s")
plt.sca(p1)


###################################
# 聚类 类蔟数=3

clf = KMeans(n_clusters=3)
clf.fit(x)
pre = clf.predict(x)

p2 = plt.subplot(222)
plt.title("Kmeans n=3")
plt.scatter(L1,L2,c=pre,marker="*")
plt.sca(p2)


###################################
# 聚类 类蔟数=4

clf = KMeans(n_clusters=4)
clf.fit(x)
pre = clf.predict(x)

p3 = plt.subplot(223)
plt.title("Kmeans n=4")
plt.scatter(L1,L2,c=pre,marker="+")
plt.sca(p3)


###################################
# 聚类 类蔟数=5

clf = KMeans(n_clusters=5)
clf.fit(x)
pre = clf.predict(x)

p4 = plt.subplot(224)
plt.title("Kmeans n=5")
plt.scatter(L1,L2,c=pre,marker="o")
plt.sca(p4)

#保存图片本地
plt.savefig('power.png', dpi=300)  
plt.show()



你可能感兴趣的:(学习总结)