Handwritten digits
from sklearn.datasets import load_digits
digits= load_digits()
digits.keys()
dict_keys(['data', 'target', 'target_names', 'images', 'DESCR'])
digits.images.shape
(1797, 8, 8)
digits.images[0,:,:]
array([[ 0.,  0.,  5., 13.,  9.,  1.,  0.,  0.],
       [ 0.,  0., 13., 15., 10., 15.,  5.,  0.],
       [ 0.,  3., 15.,  2.,  0., 11.,  8.,  0.],
       [ 0.,  4., 12.,  0.,  0.,  8.,  8.,  0.],
       [ 0.,  5.,  8.,  0.,  0.,  9.,  8.,  0.],
       [ 0.,  4., 11.,  0.,  1., 12.,  7.,  0.],
       [ 0.,  2., 14.,  5., 10., 12.,  0.,  0.],
       [ 0.,  0.,  6., 13., 10.,  0.,  0.,  0.]])
from matplotlib import pyplot as plt
plt.imshow(digits.images[50,:,:])
plt.show()

Python数据分析-PCA_方差

digits.target.shape
(1797,)
digits.target[50] # show the true number
2
digits.data.shape # the Series data of the digits.images
(1797, 64)
digits.data[0,:]
array([ 0.,  0.,  5., 13.,  9.,  1.,  0.,  0.,  0.,  0., 13., 15., 10.,
       15.,  5.,  0.,  0.,  3., 15.,  2.,  0., 11.,  8.,  0.,  0.,  4.,
       12.,  0.,  0.,  8.,  8.,  0.,  0.,  5.,  8.,  0.,  0.,  9.,  8.,
        0.,  0.,  4., 11.,  0.,  1., 12.,  7.,  0.,  0.,  2., 14.,  5.,
       10., 12.,  0.,  0.,  0.,  0.,  6., 13., 10.,  0.,  0.,  0.])
PCA of handwritten gigits
  1. 函数说明
    sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)

  2. 参数说明:

    • n_components: PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n
      特点:int 或者 string,缺省时默认为None,所有成分被保留。
      赋值为int,比如n_components=1,将把原始数据降到一个维度。
      赋值为string,比如n_components='mle',将自动选取特征个数n,使得满足所要求的方差百分比。
    • copy: bool型;表示是否在运行算法时,将原始训练数据复制一份。
      若为True,则运行PCA算法后,原始训练数据的值不会有任何改变,因为是在原始数据的副本上进行运算;
      若为False,则运行PCA算法后,原始训练数据的值会改,因为是在原始数据上进行降维计算。
    • whiten:bool型,白化,使得每个特征具有相同的方差。
  3. PCA对象的属性

    • components_ :返回具有最大方差的成分。
    • explained_variance_ratio_:返回 所保留的n个成分各自的方差百分比。
    • n_components_:返回所保留的成分个数n。
    • mean_
    • noise_variance_
  4. PCA对象的方法

    • fit(X,y=None):fit()可以说是scikit-learn中通用的方法,每个需要训练的算法都会有fit()方法,它其实就是算法中的“训练”这一步骤。因为PCA是无监督学习算法,此处y自然等于None。fit(X),表示用数据X来训练PCA模型。函数返回值:调用fit方法的对象本身。比如pca.fit(X),表示用X对pca这个对象进行训练。
    • fit_transform(X):用X来训练PCA模型,同时返回降维后的数据。newX=pca.fit_transform(X),newX就是降维后的数据。
    • inverse_transform():将降维后的数据转换成原始数据,X=pca.inverse_transform(newX)
    • transform(X):将数据X转换成降维后的数据。当模型训练好后,对于新输入的数据,都可以用transform方法来降维。
from sklearn import decomposition
pca= decomposition.PCA(n_components= 1) # parameter n_components: the number of components
digits_pca_1= pca.fit(digits.data)
digits_pca_1.components_
array([[-2.63692645e-18, -1.73094662e-02, -2.23428865e-01,
        -1.35913279e-01, -3.30322160e-02, -9.66339898e-02,
        -8.32939244e-03,  2.26900656e-03, -3.20516662e-04,
        -1.19308907e-01, -2.44451671e-01,  1.48512831e-01,
        -4.67318345e-02, -2.17740727e-01, -1.48136706e-02,
         4.47779622e-03, -4.94135515e-05, -7.95419368e-02,
         8.33951536e-02,  2.15915388e-01, -1.72126775e-01,
        -1.63712186e-01,  2.86444007e-02,  4.23251522e-03,
         9.85488994e-05,  6.42319050e-02,  2.54093292e-01,
        -3.56771084e-02, -2.09462584e-01, -4.31311895e-02,
         5.13118370e-02,  2.13422638e-04,  0.00000000e+00,
         1.59950865e-01,  3.68690745e-01,  1.64406778e-01,
         8.52007665e-02,  3.72983884e-02,  2.15867501e-02,
         0.00000000e+00,  1.28865580e-03,  1.06945278e-01,
         3.03067437e-01,  2.47813092e-01,  2.09637231e-01,
         1.22325649e-02, -3.69457664e-02,  1.61485202e-03,
         6.93023931e-04, -8.35145028e-03, -5.58599233e-02,
         9.30535631e-02,  1.07387720e-01, -1.37734564e-01,
        -6.32879113e-02,  9.61668793e-04,  9.55081888e-06,
        -1.40786852e-02, -2.35675503e-01, -1.41225574e-01,
        -9.15969422e-03, -8.94185029e-02, -3.65977413e-02,
        -1.14685134e-02]])
y_1= digits_pca_1.transform(digits.data)
plt.plot(y_1)
plt.show()

Python数据分析-PCA_Python数据分析_02

y_1= y_1.reshape(-1)
y_grouped= []
y_1[]
for ii in range(10):
    y_grouped.append(y_1[digits.target== ii])
plt.boxplot(y_grouped, labels= list(range(10)))
plt.show()

Python数据分析-PCA_数据_03

2-dimensional PCA
pca= decomposition.PCA(n_components= 2)
digits_pca_2= pca.fit(digits.data)
y_2= digits_pca_2.transform(digits.data)
y_2
array([[ -1.25946711,  21.27488332],
       [  7.95761084, -20.76869825],
       [  6.99192353,  -9.9559862 ],
       ...,
       [ 10.80128406,  -6.96025317],
       [ -4.8721003 ,  12.42395389],
       [ -0.34438922,   6.36554851]])
plt.figure(figsize= [10, 10])
for ii in range(10):
    plt.scatter(y_2[digits.target== ii, 0],
                y_2[digits.target== ii, 1],
                label= ii)
plt.legend()
plt.show()

Python数据分析-PCA_方差_04

Tranining a machine learning model
from sklearn.linear_model import LogisticRegression
logreg= LogisticRegression()
X= y_2
y= digits.target
lr_fit= logreg.fit(X, y)
C:\Users\Howell.L\AppData\Roaming\Python\Python37\site-packages\sklearn\linear_model\logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.
  FutureWarning)
C:\Users\Howell.L\AppData\Roaming\Python\Python37\site-packages\sklearn\linear_model\logistic.py:469: FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning.
  "this warning.", FutureWarning)
y_fit= lr_fit.predict(X)
y_fit
array([0, 7, 1, ..., 1, 9, 5])
import numpy as npnp.mean(y== y_fit)
0.5843071786310517
Explore the logistic regression classification
n_grid= 1000
vals= np.linspace(-40, 40, n_grid)
grid_vals= np.repeat(vals, n_grid)
xx= grid_vals
yy= grid_vals.reshape(n_grid, n_grid).transpose().reshape(-1)
X_grid= np.stack([xx, yy], axis= 1)
y_grid= lr_fit.predict(X_grid)
y_grid
array([3, 3, 3, ..., 0, 0, 0])
plt.imshow(y_grid.reshape(n_grid, n_grid), cmap= 'tab10')
plt.colorbar()
plt.show()

Python数据分析-PCA_5e_05