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()
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
函数说明
sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)
参数说明:
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型,白化,使得每个特征具有相同的方差。
PCA对象的属性
components_
:返回具有最大方差的成分。explained_variance_ratio_
:返回 所保留的n个成分各自的方差百分比。n_components_
:返回所保留的成分个数n。mean_
:noise_variance_
:
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()
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()
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()
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()