线性分类器
丁**
导入
[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)
对图形分类
[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]])