灰分检测02(纹理特征值学习,利用少量数据进行多元线性回归、集成回归的学习)

任务目标:

  1. 提取更多特征值

  2. 进行回归分析

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结果分析

  1. 多元线性
    利用剩余三组数据,进行了测试。
    测试结果与实际结果存在约30%的偏差
  2. 随机森林
    因为数据集较少,取得偏差值较大
    少量数据集不适用随机森林算法
    在这里插入图片描述

参考

  1. https://thutmose.blog.csdn.net/article/details/84032927
  2. https://www.cnblogs.com/Lin-Yi/p/8972051.html
  3. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值