任务目标:
-
提取更多特征值
-
进行回归分析
1.灰分可提取特征值(学习)
常见的特征提取算法主要分为以下3类:
基于颜色特征:如颜色直方图、颜色集、颜色矩、颜色聚合向量等;
基于纹理特征:如Tamura纹理特征、自回归纹理模型、Gabor变换、小波变换、MPEG7边缘直方图等;
基于形状特征:如傅立叶形状描述符、不变矩、小波轮廓描述符等;
考虑到煤灰分颜色、形状较单一,所以选择纹理特征作为分析量。
常用的特征提取与匹配-纹理特征描述方法分类
(1)统计法:统计法的典型的分析方法是共生矩阵法,Tammra方法等。利用灰度共生矩阵可得到描述纹理特征的统计量,常用的有对比度、能量、熵等七个特征。Tammra提出了与人的视觉感受相关的六个纹理特征,分别是粗糙度、对比度、方向性、线性相似性、规则性和粗略度。
(2)几何法 (3)模型法 (4)信号处理法。在对图像纹理特征的提取算法中,高斯马尔可夫随机场(GMRF)、局部二值模式(LBP)、灰度共生矩阵(GLCM)这3种应用最为广泛,分别对应3种不同的纹理空间,即3种纹理分类的途径。
算法实现步骤
(1) 提取灰度图像
(2) 灰度级量化
(3) 计算特征值的参数选择
计算特征值前,先选择计算过程中的一些参数:
• 滑动窗口尺寸:一般选择5×5或7×7的滑动窗口进行计算特征值;
• 步距d:一般选择d = 1,即中心像素直接与其相邻像素点做比较运算;
• 方向选择:计算灰度共生矩阵的方向一般为0°,45°,90°,135°四个方向;求出四个方向矩阵的特征值后,可以通过计算四个特征值的平均值作为最终特征值共生矩阵;
◦ 注:如果选择其他方向,则在每个方向上都会得到相当繁多的纹理特征,不利于使用的效率。
(4) 纹理特征值的计算
HaralickHaralick曾提出了14种基于灰度共生矩阵计算出来的统计量:能量、熵、对比度、均匀性、相关性、方差、和平均、和方差、和熵、差方差、差平均、差熵、相关信息测度以及最大相关系数。
- 纹理特征值
1) 角二阶矩 / 能量( ASM)
灰度共生矩阵( grey level co-occurrence matrix,GLCM)用来描述图像灰度分布的均匀程度和纹理的粗细程度。
2) 相关性(Correlation)
自相关反应了图像纹理的一致性。
3)熵(Entropy)
表示矩阵中元素的分散程度,也表示图像纹理的复杂程度。
4)对比度(Contrast)
5)反差分矩阵(Inverse Differential Moment, IDM)
6)能量(Energy)
7)相异性(Dissimilarity)
8)同质性/逆差距(Homogeneity)
9)集群阴影(ClusterShade)
阴影大小(shade),可能和图片质量有关,更直观的是与服装的褶皱程度相关(褶皱处与光线形成反射阴影),越平整,shade值越小。测量矩阵的偏度并衡量均匀性的概念; 当值很高时,图像是不对称的。
10)集群突出物(ClusterProminence)
物体在图中的突兀情况,纹路和纹案反差越大,prom值就越大。(可看我另一篇纹理相关分析的文章)
11)最大概率(Maximum probability)
表示图像中出现次数最多的纹理特征。
12)集群趋势(clusterTendency)
群集趋势是具有相似灰度值的体素分组的度量。(该值在我这个项目中没有做)
13)差熵(Difference Entropy)
差熵是邻域强度值差异的随机性/变异性的度量。
14)峰度(Kurtosis)
15)均值(Mean)
16)标准差(Std)
注:后3个不属于纹理特征,为常规统计量

-
偏斜度
偏斜度:偏斜度是对统计数据分布偏斜方向及程度的度量。

-
峰度
表征概率密度分布曲线在平均值处峰值高低的特征数。

#新增偏斜度、峰度
sc_gray = 0
ku_gray = 0
for i in range(len(hist)):
sc_gray += np.mean((hist[i] - mean_gray) ** 3) # 计算偏斜度
grayFeature.append(sc_gray[0])
for i in range(len(hist)):
ku_gray += np.mean((hist[i] - mean_gray) ** 2) / pow(var_gray, 2) # 计算峰度
grayFeature.append(ku_gray[0])
2.回归分析
七种常见的回归分析:
线性、逻辑(0、1)、多项式、逐步、岭回归、套索、ElasticNet回归
随机森林集成算法
- 集成学习
集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的做出预测。
- 特点
- 在当前所有算法中,具有极好的准确率/It is unexcelled in accuracy among current
algorithms;
能够有效地运行在大数据集上/It runs efficiently on large data bases;
能够处理具有高维特征的输入样本,而且不需要降维/It can handle thousands of input variables
without variable deletion;
能够评估各个特征在分类问题上的重要性/It gives estimates of what variables are important in the classification;
在生成过程中,能够获取到内部生成误差的一种无偏估计/It generates an internal unbiased estimate
of the generalization error as the forest building progresses;
3.上机操作
运行环境:python3.6,annaconda3
3.1数据集展示(未增加峰值和偏斜度)
24组数据,每列分别对应灰度均值,灰度方差,能量值,熵,灰度对比度 。最后一列是图片的灰分。

3.2代码展示
- 多元线性回归
import random
import numpy as np
import matplotlib.pyplot as plt
# 多元线性回归,五个个特征输入为例
# 加载数据
def load_exdata(filename):
data = []
with open(filename, 'r') as f:
for line in f.readlines():
line = line.split(',')
current = [float(item) for item in line]
# 5.5277,9.1302
data.append(current)
return data
data = load_exdata('testdata.txt')
data = np.array(data, np.float64) # 数据是浮点型
# 特征缩放
def featureNormalize(X):
X_norm = X
mu = np.zeros((1, X.shape[1]))
sigma = np.zeros((1, X.shape[1]))
for i in range(X.shape[1]):
mu[0, i] = np.mean(X[:, i]) # 均值
sigma[0, i] = np.std(X[:, i]) # 标准差
# print(mu)
# print(sigma)
X_norm = (X - mu) / sigma
return X_norm, mu, sigma
# 计算损失
def computeCost(X, y, theta):
m = y.shape[0]
# J = (np.sum((X.dot(theta) - y)**2)) / (2*m)
C = X.dot(theta) - y
J2 = (C.T.dot(C)) / (2 * m)
return J2
# 梯度下降
def gradientDescent(X, y, theta, alpha, num_iters):
m = y.shape[0]
# print(m)
# 存储历史误差
J_history = np.zeros((num_iters, 1))
for iter in range(num_iters):
# 对J求导,得到 alpha/m * (WX - Y)*x(i), (3,m)*(m,1) X (m,3)*(3,1) = (m,1)
theta = theta - (alpha / m) * (X.T.dot(X.dot(theta) - y))
J_history[iter] = computeCost(X, y, theta)
return J_history, theta
iterations = 10000 # 迭代次数
alpha = 0.01 # 学习率
x = data[:, (0, 1, 2, 3, 4)].reshape((-1, 5)) # 数据特征输入,采用数据集一行的,第0,1,2,3,4个数据,然后将其变成一行,所以用shape
y = data[:, 5].reshape((-1, 1)) # 输出特征,数据集的第5位
m = y.shape[0]
x, mu, sigma = featureNormalize(x)
X = np.hstack([x, np.ones((x.shape[0], 1))])
# X = X[range(2),:]
# y = y[range(2),:]
theta = np.zeros((6, 1)) # 因为x+y.总共有6个输入,所以theta是六维
j = computeCost(X, y, theta)
J_history, theta = gradientDescent(X, y, theta, alpha, iterations)
print('Theta found by gradient descent', theta)
def predict(data):
testx = np.array(data)
testx = ((testx - mu) / sigma)
testx = np.hstack([testx, np.ones((testx.shape[0], 1))])
huifen = testx.dot(theta)
print('predit value is %f ' % (huifen))
return 0
predict([76.78790207851084, 529.8437858113992, 31.46116445574951, 6.44746918231814, 228])#输入为5维
print('done')
- 随机森林集成回归分析
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestRegressor, ExtraTreesRegressor, GradientBoostingRegressor
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
import numpy as np
'''
随机森林回归
极端随机森林回归
梯度提升回归
通常集成模型能够取得非常好的表现
'''
# 1 准备数据
def load_exdata(filename):
data = []
with open(filename, 'r') as f:
for line in f.readlines():
line = line.split(',')
current = [float(item) for item in line]
# 5.5277,9.1302
data.append(current)
return data
data = load_exdata('testdata.txt')
data = np.array(data, np.float64) # 数据是浮点型
x = data[:, (0, 1, 2, 3, 4)].reshape((-1, 5)) # 数据特征输入,采用数据集一行的,第0,1,2,3,4个数据,然后将其变成一行,所以用shape
y = data[:, 5].reshape((-1, 1)) # 输出特征,数据集的第5位
# 2 分割训练数据和测试数据
# 随机采样25%作为测试 75%作为训练
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=33)
# 3 训练数据和测试数据进行标准化处理
ss_x = StandardScaler()
x_train = ss_x.fit_transform(x_train)
x_test = ss_x.transform(x_test)
ss_y = StandardScaler()
y_train = ss_y.fit_transform(y_train.reshape(-1, 1))
y_test = ss_y.transform(y_test.reshape(-1, 1))
# 4 三种集成回归模型进行训练和预测
# 随机森林回归
rfr = RandomForestRegressor()
# 训练
rfr.fit(x_train, y_train)
# 预测 保存预测结果
rfr_y_predict = rfr.predict(x_test)
# 极端随机森林回归
etr = ExtraTreesRegressor()
# 训练
etr.fit(x_train, y_train)
# 预测 保存预测结果
etr_y_predict = rfr.predict(x_test)
# 梯度提升回归
gbr = GradientBoostingRegressor()
# 训练
gbr.fit(x_train, y_train)
# 预测 保存预测结果
gbr_y_predict = rfr.predict(x_test)
# 5 模型评估
# 随机森林回归模型评估
print("随机森林回归的默认评估值为:", rfr.score(x_test, y_test))
print("随机森林回归的R_squared值为:", r2_score(y_test, rfr_y_predict))
print("随机森林回归的均方误差为:", mean_squared_error(ss_y.inverse_transform(y_test),
ss_y.inverse_transform(rfr_y_predict)))
print("随机森林回归的平均绝对误差为:", mean_absolute_error(ss_y.inverse_transform(y_test),
ss_y.inverse_transform(rfr_y_predict)))
# 极端随机森林回归模型评估
print("极端随机森林回归的默认评估值为:", etr.score(x_test, y_test))
print("极端随机森林回归的R_squared值为:", r2_score(y_test, gbr_y_predict))
print("极端随机森林回归的均方误差为:", mean_squared_error(ss_y.inverse_transform(y_test),
ss_y.inverse_transform(gbr_y_predict)))
print("极端随机森林回归的平均绝对误差为:", mean_absolute_error(ss_y.inverse_transform(y_test),
ss_y.inverse_transform(gbr_y_predict)))
# 梯度提升回归模型评估
print("梯度提升回归回归的默认评估值为:", gbr.score(x_test, y_test))
print("梯度提升回归回归的R_squared值为:", r2_score(y_test, etr_y_predict))
print("梯度提升回归回归的均方误差为:", mean_squared_error(ss_y.inverse_transform(y_test),
ss_y.inverse_transform(etr_y_predict)))
print("梯度提升回归回归的平均绝对误差为:", mean_absolute_error(ss_y.inverse_transform(y_test),
ss_y.inverse_transform(etr_y_predict)))
3.3结果分析
- 多元线性
利用剩余三组数据,进行了测试。
测试结果与实际结果存在约30%的偏差 - 随机森林
因为数据集较少,取得偏差值较大
少量数据集不适用随机森林算法

参考
- https://thutmose.blog.csdn.net/article/details/84032927
- https://www.cnblogs.com/Lin-Yi/p/8972051.html
- https://blog.csdn.net/yangyin007/article/details/82385967?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162755946416780264080544%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162755946416780264080544&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-82385967.pc_search_result_control_group&utm_term=%E9%9A%8F%E6%9C%BA%E6%A3%AE%E6%9E%97&spm=1018.2226.3001.4187
&spm=1001.2101.3001.5002&articleId=119209028&d=1&t=3&u=a5be2bf1596d4a2ca0962a77abb1bb5a)
3万+

被折叠的 条评论
为什么被折叠?



