线性分类器

丁**

导入

[12]:
%pylab inline

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from sklearn.linear_model import SGDClassifier
from sklearn.model_selection  import train_test_split
from sklearn.preprocessing import StandardScaler
from matplotlib.colors import ListedColormap
from sklearn.metrics import accuracy_score
from skimage import io,data
from sklearn.metrics import confusion_matrix

Populating the interactive namespace from numpy and matplotlib
D:\ProgramData\Anaconda3\lib\site-packages\IPython\core\magics\pylab.py:161: UserWarning: pylab import has clobbered these variables: ['mat', 'clf', 'shape']
`%matplotlib` prevents importing * from pylab and numpy
  "\n`%matplotlib` prevents importing * from pylab and numpy"

读取数据

[13]:
path_to_tiff='E:\Data\Hyperspectral_Project/'

raster = path_to_tiff + "dc.tif"
samples = path_to_tiff + "dc_samples2.tif"
classification = path_to_tiff + "Classification\\"

#img=io.imread(raster,as_grey=False)
# read data as TIF
img = io.imread(raster)#(191, 1280, 307)
img=np.transpose(img,(1,2,0))#(1280, 307,191)

#img=img[0,:,:]
# read training samples as TIF with same dimensions as the image
roi = io.imread(samples)#(1280, 307,3)
#roi=np.transpose(roi,(2,0,1))#(3, 1280, 307)
[14]:

def rgb2gray(rgb): return np.dot(rgb[...,:3], [0.299, 0.587, 0.114]) Y=np.floor(rgb2gray(roi))#(np.sum(roi,axis=2) labels = np.unique(Y[Y > 0]) print('The training data include {n} classes: {classes}'.format(n=labels.size, classes=labels)) print(img.shape) print(roi.shape) img =img.reshape(392960,191) #print(img) #print(roi) #print(roi > 0) #print(roi[roi > 0])
The training data include 7 classes: [ 1488.  2976.  4465.  5953.  7441.  7663.  9152.]
(1280, 307, 191)
(1280, 307, 3)
[ ]:

[15]:

Y=Y.ravel() np.unique(Y)
[15]:
array([    0.,  1488.,  2976.,  4465.,  5953.,  7441.,  7663.,  9152.])

拆分训练集50,验证集25,测试集25

[16]:
X = img[Y>0,:]
Y = Y[Y>0]
print(Y.shape)
print(X.shape)

train_size=0.75
test_size=0.25
shape=Y.size

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, train_size=train_size, test_size=test_size, random_state=None)
#X_train, X_valid, Y_train, Y_valid = train_test_split(X_train, Y_train, train_size=0.66, random_state=None)
(8079,)
(8079, 191)

训练模型

[23]:
#模型参数
lossParams=["hinge","modified_huber","log"]
penaltyParams=["l2","l1","elasticnet"]
n_iterParams=200#迭代次数

i=2
j=0

params=[lossParams[i],penaltyParams[j],n_iterParams]

clf = SGDClassifier(loss=params[0], penalty=params[1],alpha=0.01, n_iter=params[2], fit_intercept=True)
clf.fit(X_train, Y_train)

[23]:
SGDClassifier(alpha=0.01, average=False, class_weight=None, epsilon=0.1,
       eta0=0.0, fit_intercept=True, l1_ratio=0.15,
       learning_rate='optimal', loss='log', n_iter=200, n_jobs=1,
       penalty='l2', power_t=0.5, random_state=None, shuffle=True,
       verbose=0, warm_start=False)
[24]:
scores=[0,0]
#训练集得分
scores[0]=("%.6f" % clf.score(X_train, Y_train))
[25]:
#测试集得分
#用于调试分类器参数
y_model=clf.predict(X_test)
scores[1]= ("%.6f" % clf.score(X_test,Y_test))

#混淆矩阵
mat = confusion_matrix(Y_test, y_model)

sns.heatmap(mat, square=True, annot=True,fmt='d', cbar=False)
plt.xlabel('predicted value')
plt.ylabel('true value')

filename=classification+str(train_size)+"_"+str(shape)+"_"+str(params)+"_"+str(scores)
plt.savefig(filename+".png",dpi=100)
../../_images/StudentReports_2017Student_Liner_14_0.png

对图形分类

[26]:
#对图像进行分类
img_class=clf.predict(img)
img_class=img_class.reshape(1280,307)
#绘制  plt.imshow(img_class)
#保存
io.imsave(filename+".tif",img_class)
[27]:
#plt.imshow(img.reshape(1280,307,191))

[ ]:

[28]:
params=['2',2,'kome']
strs=str(params)+str(scores)+'.jpg'
print(strs)

p=np.array([[[1,2,3],[1,2,5]],[[1,4,5],[1,3,6]]])
p=p.reshape(2,2,3)
print(p.shape)
np.sum(p,axis=2)
['2', 2, 'kome']['0.996534', '0.997525'].jpg
(2, 2, 3)
[28]:
array([[ 6,  8],
       [10, 10]])