精华内容
下载资源
问答
  • 对数关系和线性关系转换
    万次阅读
    2017-08-24 10:38:11

    墙裂推荐阅读:y的衍生物

    关键词:最小二乘法;正则化;对数线性回归; y的衍生物

    3.1 基本形式

    假设样本x有d个属性,线性模型(linear model)试图学得一个通过属性的线性组合来进行预测的函数,即 f(x)=w1x1+w2x2++wdxd+b f ( x ) = w 1 x 1 + w 2 x 2 + ⋅ ⋯ + w d x d + b ,向量形式 f(x)=wTx+b f ( x ) = w T x + b

    3.2 线性回归

    关键词:无序属性连续化。
    对离散属性,若属性值之间存在“序”(order)关系,可通过连续化将其转化为连续值,例如二值属性身高的取值,“高”“矮”可和转化为{1.0 , 0}。 若属性值之间不存在序的关系,例如属性“瓜类”的取值为西瓜,南瓜,冬瓜,则可转化为(0,0,1),(0,1,0),(1,0,0)。

    关键词:最小二乘法(least square method)。
    基于均方误差最小化来进行模型求解的方法称为“最小二乘法”。在线性回归中,最小二乘法就是试图找到一条直线,使所有样本到直线上的欧氏距离之和最小。

    关键词: 正则化(regularization)项。
    假设解一个线性方程组,当方程数大于自由变量数时,是没有解的。反过来,当方程数小于自由变量数的时候,解就有很多个了。往往,我们会碰到这种情况,参数多,“方程”少的情况,那么有很多个w(权值向量)都能使均方误差最小,那么该选哪一个呢? 这就涉及到 归纳偏好问题了,常见的做法是引入正则化项。

    关键词:对数线性回归(log-linear regression);y的衍生物
    把线性回归模型简写为: f(x)=wTx+b f ( x ) = w T x + b ,当我们希望线性模型的预测值逼近真实标记y,这样就是线性模型。那可否令模型的预测值毕竟y的衍生物呢? 作者的这一描述实在太妙了!y的衍生物,通俗易懂! 假设y的衍生物是 y的对数即lny,那么就可以得到对数线性回归模型: lny=wTx+b l n y = w T x + b , 也就是让模型 去逼近 lny,而不是y。也可以对 lny=wTx+b l n y = w T x + b 做一下变换就变成了 y=ewTx+b y = e w T x + b ,也可以理解为让 ewTx+b e w T x + b 去逼近y。形式上还是线性回归的,但实质上已是在求取输入空间到输出空间的非线性函数映射。如图:
    这里写图片描述

    来思考一个问题
    想从线性模型出发,去扩展线性模型,就是让线性模型 f(x)=wTx+b f ( x ) = w T x + b 去拟合y的衍生物,那么我们常说的逻辑回归(对数几率回归)是怎么从线性模型演变而来的呢?是让 wTx+b w T x + b 去拟合哪一种“y的衍生物” 什么呢?这个可以思考思考后,请看下篇:逻辑回归

    更多相关内容
  • 一个采用两个列向量并对数据进行线性回归的函数。... 它需要两个列向量、一个描述、x 标签 y 标签并进行线性回归。 然后绘制数据并输出所有统计数据(r 平方、OLS 斜率、RMA 斜率 95% 置信区间)
  • 如果系统内只提供了高分辨率的线性数字电位器,在不更改系统硬件的前提下,可以采用以下方式将线性电位器(图1)转换对数电位器。  图1. 该系列数字电位器采用标准配置,具有电阻串的高端、低端以及中心抽头连接...
  • 更多CFA官方教材详解,请关注“边际实验室”。“边际实验室”是一家专注于金融科技...■在估计回归之前,可能需要转换一个或多个回归变量(例如,通过对变量取自然对数)。■回归模型汇集了来自不同样本中不应该被汇集...

    更多CFA官方教材详解,请关注“边际实验室”。

    “边际实验室”是一家专注于金融科技、金融大数据领域的工作室,同时提供CFA、FRM等金融考试内容的免费讲解。

    每当我们估计回归模型时,都必须假定回归具有正确的函数形式。该假设可能会有以下几种错误:

    ■可以从回归中忽略一个或多个重要变量。

    ■在估计回归之前,可能需要转换一个或多个回归变量(例如,通过对变量取自然对数)。

    ■回归模型汇集了来自不同样本中不应该被汇集的数据。

    首先,考虑从回归中忽略一个重要的自变量的影响(遗漏变量偏差)。如果真正的回归模型是:

    Yi= b0 + b1X1i + b2X2i +εi

    但是我们估计的模型是:

    Yi= a0 + a1X1i +εi

    那么我们的回归模型将被错误指定。该模型有什么问题?如果省略的变量(X2)与其余变量(X1)相关,则模型中的误差项将与(X1)相关,并且回归系数a0和a1的估计值将有偏差且不一致。另外,这些系数的标准误估计值也将不一致,因此我们既不能使用系数估计值也不能使用估计的标准误差来进行统计检验。 案例遗漏变量偏差和买卖价差

    在本例中,我们扩展了对买卖价差的研究,以显示从回归中省略重要变量的影响。在此前的案例中,我们证明了[(买卖价差)/价格]的自然对数与做市商数量的自然对数和公司市值的自然对数存在显著相关。

    下表显示了结果:

    46a8462efc41ab79435659d2ae69936c.png

    如果我们去除市值的自然对数,只对[(买卖价差)/价格]的自然对数与做市商数量的自然对数进行一个自变量的回归,结果如下表所示。

    dd1107f4e4064e34c779611a22e371df.png
    e5a2efab14153675c52c7f38e83ce0c8.png

    请注意,ln(纳斯达克做市商数量)的系数从原始回归(正确结果)的-1.5186变为错误的-3.1027。同样,截距从原始回归中的1.5949变为5.0707。这些结果说明,遗漏回归中应包含的自变量会导致其余回归系数的不一致。

    回归模型发生错误指定的第二个常见原因是,对于需要转换的数据,在回归中没有进行转换,或使用了错误的数据形式。例如,有时分析人员无法判断因变量和自变量之间的非线性关系,进而指定了变量之间的线性关系。在指定回归模型时,应考虑经济理论是否暗示了非线性关系。我们通常可以通过绘制数据图表来确认非线性关系,如下面的案例所示。如果当一个或多个变量的比例变化表现出线性关系时,我们可以通过取自然对数来对错误指定进行纠正。在其他时候,分析师更倾向于使用无单位的数据进行回归分析(例如将净收入或现金流量除以销售额)。在此前的案例中,我们用股票价格对买卖差价进行了除法计算,因为对于投资者而言,买卖差价在交易成本方面的意义取决于股票价格;如果我们没有调整买卖差价,那么回归模型就会发生错误指定。

    案例 非线性与买卖价差

    在此前的案例中,我们的结果表明[(买入-卖出价差)/价格]的自然对数与做市商数量的自然对数和公司市值的自然对数均显著相关。但是,为什么我们在回归中使用的是变量的自然对数呢?

    关于[(买入-卖出点差)/价格]及其决定因素(自变量)之间的关系的性质,有什么理论基础吗?Stoll(1978)建立了市场中买卖差价百分比决定因素的理论模型。他的模型如下:

    b822bf94cdf3da140805454bcf9d800c.png

    其中,c是常数。在初始变量中,买卖差价百分比与做市商数量与市值的关系不是线性的。但是,如果对上述模型等式两边取自然对数,转换后的变量是线性的(对数-对数回归):

    Yi= b0 + b1X1i + b2X2i +εi

    其中

    Yi= 股票i(买入-卖出价差)/价格的自然对数

    b0= 常数,ln(c)

    X1i= 股票i的做市商数量的自然对数

    X2i= 公司i市值的自然对数

    εi= 残差

    如此前案例所述,对数-对数模型的斜率系数被解释为弹性,准确地说,因变量相对于自变量存在部分弹性(“部分”是指保持其他自变量不变)。

    我们可以绘制数据以评估对数转换后变量是否线性相关。例如,下图展示了一个股票的做市商数量自然对数的散点图(X轴)、(买卖价差)/价格的自然对数(Y轴)及回归线。这两个经过转换后的变量之间的关系显然是线性的。

    035e3076766a236daccf2f553e3db718.png
    8ce4a9c40bd93e34b2e7d949774b8004.png

    如果我们不取[(买卖价差)/价格]的对数,回归线就不是线性的。上面第二张图显示了做市商数量自然对数(X轴)和[(买卖价差)/价格](Y轴)之间的关系。我们看到这两个变量之间的非线性关系非常明显的。因此,我们不应该以[(买卖价差)/价格]为因变量来估计回归。另外,考虑到需要确保预测的买卖价差是正的,因此我们不能直接使用[(买卖价差)/价格]作为因变量。如果我们直接使用[(买卖价差)/价格]作为因变量,模型也可以将买卖价差预测为负值。这个结果是荒谬的——在现实中,没有买卖价差是负的(交易员不可能同时在高位买入和低位卖出),因此能够预测买卖价差为负的模型肯定是错误的。我们下面将讨论预测买卖价差为负值的问题。

    下表显示了以[(买卖价差)/价格]为因变量,做市商数量的自然对数和公司市值的自然对数为自变量的回归结果。

    57541f78e1b6143f34fac6a7430185d9.png

    1、假设对于在纳斯达克上市的特定股票,做市商的数量为50,市值为60亿美元。根据上述模型,该股票的预期买卖差价与价格的比率是多少?

    做市商数量的自然对数等于ln50 = 3.9120,股票市值(百万美元)的自然对数等于ln6000 = 8.6995。

    在这种情况下,预期买卖差价与价格的比率为0.0674+(-0.0142×3.9120)+(-0.0016×8.6995)=-0.0021。因此,该模型预测买卖价差与股票价格之比为-0.0021。

    2、上述股票的预期买卖价差是否有意义?如果没有,如何避免这个问题?

    预测的买卖差价为负,这在经济上没有意义。

    通过使用[(买卖价差)/价格]的对数作为因变量,可以避免此问题。

    通常,分析师在比较公司之间的数据之前必须决定是否对变量进行加工。例如,在财务报表分析中,分析师通常会使用百分比财务报表。在百分比利润表中,所有金额都除以了公司的收入。

    百分比财务报表使公司之间的可比性更加容易。对于想要使用回归分析来比较一组公司业绩的分析师来说,可能会出现可比性问题。如以下案例所示。

    案例 经营现金流和自由现金流之间的关系

    假设有一位分析师想解释美国11家服装公司2001年自由现金流与经营现金流量的关系。

    为了调查此问题,分析师可能在线性回归中将自由现金流作为因变量,将经营现金流作为自变量。下图显示了回归的结果。请注意,经营活动现金流的斜率系数的t统计量非常高(6.5288),回归的F统计量的显著性水平很低(0.0001),R方值非常高。我们可能会倾向于认为这种回归是准确的。如果经营活动现金流增加1.00美元,我们可以有把握地预测公司的自由现金流量将增加0.3579美元。

    d1d41e030fcf7f8df32905bc012c7806.png
    de3280f07b6b9ca0ab019c5a0f9151c4.png

    但是这个估计是正确吗?该回归没有考虑样本中公司之间的规模差异。

    我们可以通过使用常见的现金流百分比结果来解决规模差异。在使用回归分析之前,我们将经营活动现金流和公司的自由现金流除以公司的销售额。我们将(自由现金流/销售额)作为因变量,并使用(经营活动现金流/销售额)作为自变量。下图显示了回归结果。请注意,(经营活动现金流/销售额)斜率系数的t统计量为1.6262,在0.05水平上不显著。另外,F统计量的显著性水平为0.1383,因此我们不能在0.05水平上拒绝“回归不能解释服装公司(自由现金流/销售额)的差异”该假设。

    最后,我们也应该注意到,此回归中的R方比以前的回归低得多。

    16d2cebcad5f18ea9781122659c5be80.png

    哪种回归更有意义?通常,等比例的回归更有意义。我们想知道如果来自经营活动的现金流量(与销售额的比率)发生变化,自由现金流(与销售额的比率)会发生什么。如果不进行缩除法,则回归结果可以仅基于公司之间的规模差异,而不是基于公司的基本经济状况。

    回归模型中错误指定的第三种常见形式是合并不应合并的来自不同样本的数据。我们用图形方式说明这种类型的错误指定。下图显示了变量X和Y的两个数据集,并带有拟合的回归线。数据可以表示两个不同时间段的两个金融变量之间的关系。

    67aae09bc9e1fba70a3e5b4342fd8146.png

    在X和Y的每个数据集中,两个变量之间的相关性几乎为0。由于组合样本中两个数据集的X和Y的均值不同,所以X和Y高度相关。然而,这种相关性是假的,因为它反映了X和Y在两个不同时期的关系的差异。

    本文由边际实验室自媒体原创,如需转载请务必注明出处!

    be86df410fb4d999e353ee3c398fceee.png
    展开全文
  • 至于有人可能会提到用神经网络,那主要是用于修复老照片、或者细节缺失严重的视频资料,以及一些无法用映射法有效转换的照片(即这类照片的映射需要运用到一些非线性采样方程,而方程的函数参数我们未知)。...

    灰度直方图(Gray Histogram)

    在数字图像处理中,灰度直方图是一种计算代价非常小但却很有用的工具,它概括了一幅图像的灰度级信息,它用来描述每个灰度级在图像矩阵中的像素个数或者占有率,或者出现频率。

    通过直方图,我们可以很快知道一个灰度图片中有效数据的大概范围,可以通过一些简单的线性计算,将我们感兴趣的数据重新编辑到新的图片中,也可以调节一张照片的曝光量,某些教科书上称这种做法叫对比度进行调节。

    当然,如果配合神经元网络,我们也可以对一些黑白照片重新上色。当然这些都是比较高阶的技巧了。

    直方图调整有几种常用的方法,如线性变换、分段线性变换、伽马变换、直方图正规化、直方图均衡化、局部自适应直方图均衡化、图像翻转等,这些方法的计算代价较小,但是却产生了较为理想的效果。

    直方图的计算方法

    在这里插入图片描述
    我又把这张图拿了出来,直方图的计算方式,其实就是从上到下,从左到右一个一个像素进行统计。所以假设我们对林肯的照片进行分析,绘制这张照片的直方图,那么在X轴的方向,就是强度信息,也就是灰度值 [ 0 , 255 ] [0, 255] [0,255],而它的Y轴方向,就是频率信息,或者说是各像素点值的出现率。

    def calculate_hist(img):
        # create a matrix to hold histogram information
        histogram = np.zeros(256, dtype=np.uint64)
    
        # iterate each pixel
        row, col = img.shape
        for r in range(row):
            for c in range(col):
                histogram[img[r, c]] = histogram[img[r, c]] + 1
    
        # return to caller
        return histogram
    

    我们对结果进行比对,看看是否一致:

        # load data from file
        img = cv2.imread("Data/lincoln.jpg", cv2.IMREAD_GRAYSCALE)
        my_hist = calculate_hist(img)
    
        # show
        show_images(img.reshape(-1), my_hist)
    

    输出的效果:

    在这里插入图片描述
    左侧是我们的计算结果,而右侧是通过matplotlib进行统计的结果,我们可以看到结果是一样的。通过直方图,我们知道我们感兴趣的数据,主要集中在 [ 0 , 100 ] [0, 100] [0,100] [ 160 , 255 ] [160, 255] [160,255]这两个范围区间内,那么这两个区间内都包含哪些有趣的图像信息呢?

    在这里插入图片描述

    简单的图像转换方法

    线性变换 / 图像翻转(Image Nagatives)

    线性变换,又或者叫图像翻转,通常被应用于X光照片这类图像的处理。由于我们兴趣区域的数据多处于低密度区域,而这部分数据如果直接显示通常较难观察到(low intensity),例如X光来说,低密度的细节通常很难进行观察,而通过线性转换,则可以得到一些用肉眼不太容易注意到的细节。

    在这里插入图片描述
    比如这张对乳腺的X光照片,转换后的右侧图片中黑色斑块的位置,可能预示患者已经有了肿块,可能需要进一步的细致检查。

    假设图像的灰阶为 [ 0 , 255 ] [0, 255] [0,255]这个范围,那么它的线性转换计算方式可以简单的表示为:

    I c = 255 − I o I_c = 255 - I_o Ic=255Io

    其中 I c I_c Ic表示为转换后的图像灰阶, I o I_o Io表示为原始图像灰阶。在冈萨雷斯的教材上,这个公式表示为: s = L − 1 − r s = L - 1 - r s=L1r,本质上是一样的。算法代码如果使用到 numpy 的独有特性,那么可以更简单的写成这样:

    def image_negative(file: str):
        image = cv2.imread(file, cv2.IMREAD_GRAYSCALE)
    
        negative_img = 255 - image.flatten()
        negative_img = negative_img.reshape(image.shape)
        show_images(image, negative_img, "Negative Image")
    

    对数变换(Log Transformation)

    由于线性变化,正如其名字线性的,所以如果很多重要的数据都挤压在低密度数据区间时,直接进行线性变化也很难看出图像的特征,那么就通过对数的方式,不成比例的“放大”图像的细节。

    I c = c ⋅ l o g ( 1 + I o ) I_c = c \cdot log(1 + I_o) Ic=clog(1+Io)

    其中 c c c 是曲线放大系数, ( 1 + I o ) (1+I_o) (1+Io) 的目的是把 log 曲线向左移1个单位。
    在这里插入图片描述
    放大系数并无固定要求,通常根据自己实际工作的需要来调试确定。
    在这里插入图片描述

    def log_transform(file: str):
        image = cv2.imread(file, cv2.IMREAD_GRAYSCALE)
    
        log_trans = 10 * np.log(1 + image)
        log_trans = np.uint8(log_trans)
        show_images(image, log_trans, "Log Transform")
    

    Gamma变换(Power-Law Transformation)

    Gamma函数实际上就是幂函数,其公式为:
    I c = c ⋅ I o γ I_c = c \cdot I{_o}^\gamma Ic=cIoγ
    不同的gamma值,会输出不同的映射曲线,由于我们通常只使用其第一象限内的映射,且把 [ 0 , 255 ] [0,255] [0,255]的灰阶强度,归一化后控制在 [ 0 , 1 ] [0,1] [0,1]这个区间

    在这里插入图片描述
    所以实际上的转换效果是这样:

    在这里插入图片描述
    通过gamma变换,可以有效的纠正一张过曝或欠光的图片。从图中的曲线可以得知,如果要将一张欠光的照片调整到正常的样子,可以让 γ < 1 \gamma < 1 γ<1。而对于一张过曝的照片,则可以让 γ > 1 \gamma > 1 γ>1,从而获得满意的效果。

    c c c 通常为放大、缩小倍数,一般情况下,我们令其为1。

    对于欠光的图片:
    在这里插入图片描述

    而对于过曝照片:
    在这里插入图片描述

    
    def gamma_transform(file: str, c, gamma):
        image = cv2.imread(file, cv2.IMREAD_GRAYSCALE)
    
        # # normalization the pixels
        float_image = image / 255.0
    
        gamma_trans = c * np.power(float_image, gamma)
        gamma_trans = np.uint8(gamma_trans  * 255.0)
    
        show_images(image, gamma_trans , "Gamma Transform")
    
    展开全文
  • 使用C++、opencv实现对图像的对数变换及非线性变换,实现图像增强 相关API: void normalize(InputArray src, OutputArray dst, double alpha=1, double beta=0, int norm_type=NORM_L2, int dtype=-1, Input...

    使用C++、opencv实现对图像的对数变换及非线性变换,实现图像增强

    相关API:

    void normalize(InputArray src, OutputArray dst, double alpha=1, double beta=0, int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray() )

    normalize函数的作用是进行矩阵的归一化。归一化就是把要处理的数据经过某种算法的处理限制在所需要的范围内。首先归一化是为了后面数据处理的方便,其次归一化能够保证程序运行时收敛加快。归一化的具体作用是归纳同意样本的统计分布性,归一化在0-1之间是统计的概率分布,归一化在某个区间上是统计的坐标分布,在机器学习算法的数据预处理阶段,归一化也是非常重要的步骤。

    第一个参数,InputArray类型的src。输入图像,即源图像,填Mat类的对象即可。
    第二个参数,OutputArray类型的dst。函数调用后的运算结果存在这里,和源图片有一样的尺寸和类型。
    第三个参数,double类型的 alpha。归一化后的最大值,有默认值1。
    第四个参数,double类型的beta。归一化后的最大值,有默认值0。
    第五个参数,int类型的 norm type。归一化类型,有NORM_INF、 NORM_L1、NORM_L2和 NORM_MINMAX等参数可选,有默认值 NORM_L2。

    第六个参数,int类型的 dtype,有默认值-1。当此参数取负值时,输出矩阵和src有同样的类型,否则,它和src有同样的通道数,且此时图像深度为CV_MAT_DEPTH(dtype)。
    第七个参数,InputArray类型的mask,可选的操作掩膜,有默认值noArray()。

    void meanStdDev(InputArray src, OutputArray mean, OutputArray stddev, InputArray mask=noArray())

    第一个参数src,输入数组,应该有1到4个通道,以便结果可以存储在Scalar中。

    第二个参数mean,输出参数,计算的平均值。

    第三个参数srddev,输出参数,计算标准偏差。

    第四个参数mask,可选的操作掩膜,有默认值没有掩膜

    meanStdDev计算结果是double类型的。
    meanStdDev计算的均值和标准差都以Mat形式返回,这里返回的是1X1的矩阵。所以访问结果,要访问Mat的元素。

    以上参考:毛星云《OpenCV3编程入门》、https://blog.csdn.net/billbliss/article/details/44178737 


    代码通过对图像进行对数变换和非线性变换增强图像暗处细节,适用于彩色图像及灰度图像,但灰度图像不要使用cvtColor函数转换,直接以三通道形式输入。

    其中,对数变换使用函数为dst(i,j)=c*log(1+src(i,j)),src(i,j)为源图像(i,j)处的像素值,c为可调节的系数,dst(i,j)为经过对数变换后(i,j)处的像素值。

    非线性变换的公式如下图:

    #include "stdafx.h"
    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include <iostream>
    #include <fstream>
    #include <iterator>
    #include <math.h>
    using namespace cv;
    using namespace std;
    
    //定义声明一些全局变量和函数
    Mat src = imread("C:\\Users\\lenovo\\Desktop\\4.jpg");
    
    Mat hsv, lab, ycrcb;
    Mat logdst, nonlinerdst;
    Mat dst(src.size(), src.type(), Scalar::all(0));
    
    void LogTransform(cv::Mat& src, cv::Mat& dst, double c);//对数变换函数
    void non_liner_tran(Mat& src, Mat& dst);//非线性变换函数
    void balance(Mat& src, Mat& logdst, Mat&  nonlinerdst);//平衡图像函数
    
    int main(int argc, char** argv)
    {
    	system("color 02");
    	/*//获取图像每个像素点的RGBHSVLabYCrCb的值,并写入文件中
    	cvtColor(src, hsv, COLOR_BGR2HSV);
    	cvtColor(src, lab, COLOR_BGR2Lab);
    	cvtColor(src, ycrcb, COLOR_BGR2YCrCb);
    	FILE *fp;
    	fopen_s(&fp, "C:\\Users\\lenovo\\Desktop\\RGB数据.xls", "a");
    	for(int i=0;i<src.rows;i++)
    		for (int j = 0; j < src.cols; j++)
    		{
    			fprintf(fp, "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n", src.at<Vec3b>(i, j)[2], src.at<Vec3b>(i, j)[1], src.at<Vec3b>(i, j)[0],
    				hsv.at<Vec3b>(i, j)[0], hsv.at<Vec3b>(i, j)[1], hsv.at<Vec3b>(i, j)[2],
    				lab.at<Vec3b>(i, j)[0], lab.at<Vec3b>(i, j)[1], lab.at<Vec3b>(i, j)[2], 
    				ycrcb.at<Vec3b>(i, j)[0], ycrcb.at<Vec3b>(i, j)[1], ycrcb.at<Vec3b>(i, j)[2]);
    		}
    	fclose(fp);*/
    
    	//对数变换
    	LogTransform(src, logdst, 8);
    	//非线性变换
    	non_liner_tran(src, nonlinerdst);
    	//平衡图像
    	balance(src, logdst, nonlinerdst);
    	//显示原图
    	namedWindow("src", WINDOW_NORMAL);
    	imshow("src", src);
    	waitKey(0);
    	return 0;
    }
    
    /*对数变换方法1*(灰度图像和彩色图像都适用)*/
    void LogTransform(cv::Mat& src, cv::Mat& dst, double c) {
    	int nr = src.rows;
    	int nc = src.cols*src.channels();
    	src.copyTo(dst);
    	dst.convertTo(dst, CV_64F);
    	if (src.isContinuous() && dst.isContinuous()) {  //判断图像连续性
    		nr = 1;
    		nc = src.rows*src.cols*src.channels(); //行数*列数 * 通道数= 一维数组的个数
    	}
    
    	for (int i = 0; i < nr; i++) {
    		const uchar* srcdata = src.ptr <uchar>(i);  //采用指针访问像素,获取第i行的首地址
    		double* dstdata = dst.ptr <double>(i);
    		for (int j = 0; j < nc; j++) {
    			dstdata[j] = c*log(double(1.0 + srcdata[j])); //开始处理每个像素
    		}
    	}
    	normalize(dst, dst, 0, 255, NORM_MINMAX); //经过对比拉升(将像素值归一化到0-255)得到最终的图像
    	dst.convertTo(dst, CV_8U);  //转回无符号8位图像
    	namedWindow("logdst", WINDOW_NORMAL);
    	imshow("logdst", dst);
    }
    
    void non_liner_tran(Mat& src, Mat& dst)
    {
    	src.copyTo(dst);
    	//拆分图像,获取每个通道的平均像素值
    	Mat channels[3];
    	Mat mat_mean[3], mat_stddev[3];
    	double vmean[3] = { 0 };
    	split(src, channels);
    
    	for (int n = 0; n < 3; n++)
    	{
    		meanStdDev(channels[n], mat_mean[n], mat_stddev[n]);
    		vmean[n] = mat_mean[n].at<double>(0, 0);
    	}
    	//非线性变换
    	double m = 0, kv = 0, a = 1;
    	for (int i = 0; i < src.rows; i++)
    	{
    		for (int j = 0; j < src.cols; j++)
    		{
    			for (int n = 0; n < 3; n++)
    			{
    				if ((src.at<Vec3b>(i, j)[n] >= 0) && (src.at<Vec3b>(i, j)[n] <= 60))
    				{
    					kv = 7;
    				}
    				else if ((src.at<Vec3b>(i, j)[n] > 60) && (src.at<Vec3b>(i, j)[n] <= 200))
    				{
    					kv = (src.at<Vec3b>(i, j)[n] - 60) / 70 + 7;
    				}
    				else if ((src.at<Vec3b>(i, j)[n] > 200) && (src.at<Vec3b>(i, j)[n] <= 255))
    				{
    					kv = (src.at<Vec3b>(i, j)[n] - 200) / 55 + 9;
    				}
    
    				m = kv*(src.at<Vec3b>(i, j)[n] / (src.at<Vec3b>(i, j)[n] + a*vmean[n]));
    				
    				dst.at<Vec3b>(i, j)[n] = (int)(2 / (1 + exp(-m)) - 1) * 255 - src.at<Vec3b>(i, j)[n];
    			}
    
    		}
    	}
    
    	namedWindow("nonlinerdst", WINDOW_NORMAL);
    	imshow("nonlinerdst", dst);
    }
    
    void balance(Mat& src, Mat& logdst, Mat&  nonlinerdst)
    {
    	for (int i = 0; i < src.rows; i++)
    	{
    		for (int j = 0; j < src.cols; j++)
    		{
    			for (int n = 0; n < 3; n++)
    			{
    				//将源图像、对数变换图像、非线性变换图像以一定比例合并
    				dst.at<Vec3b>(i, j)[n] = (int)(0.05*logdst.at<Vec3b>(i, j)[n] +
    					0.05*nonlinerdst.at<Vec3b>(i, j)[n] + 0.8*src.at<Vec3b>(i, j)[n]);
    			}
    		}
    	}
    	namedWindow("dst", WINDOW_NORMAL);
    	imshow("dst", dst);//显示经直方图均衡化的图像
    }

    源图像:

        

    对数变换后图像:

        

    非线性变换后图像:

        

    结果图:

        

    参考文献:http://xueshu.baidu.com/usercenter/paper/show?paperid=864f24732d62a37915e71dbea2050010&site=xueshu_se&hitarticle=1

    代码部分参考:http://www.pianshen.com/article/2960258309/

    展开全文
  • 从线性到非线性模型-对数线性模型

    千次阅读 2018-08-25 17:41:30
    4、Fisher线性判别和线性感知机 5、三层神经网络 6、支持向量机 二、Logistic回归SoftMax回归,最大熵模型 一、Logistic回归 分类问题可以看作是在回归函数上的一个分类。...
  • 我总是告诉学生,采用自然对数转换变量的三个原因。记录变量的原因将决定您是要记录独立变量还是因变量或两者。为了清楚起见,我正在谈论采用自然对数。首先,如其他海报所指出的那样,提高模型拟合度。例如,如果...
  • 文章目录通用形式简介重要概念指数族分布线性回归简介正则化基扩展核函数对数几率回归简介多分类策略[4]凸函数求解一些问题# 参考链接 通用形式 简介 ​ 广义线性模型(Generalized Linear Model),将线性模型...
  • 煤矿事故死亡率与人力的增产或减资有关,成比例关系。 因此,我们将死亡率映射到对数尺度,转换为加性递减,并使用线性模型预测未来五年的死亡人数,然后将其映射并四舍五入到现实煤矿工人生命风险的预测。
  • 线性回归1、线性回归介绍与离散属性转换为实数值线性回归(linear regeression)试图学习一个线性模型以尽可能准确预测实值输出标记。对于预测值本来就是实数值的数据还好说,对于离散属性,其离散值转化为实数值有两...
  • 韦伯-费希纳定律与对数关系的深意

    万次阅读 2018-01-20 01:43:44
    我喜欢在秋冬的时候把头发留得很长,一直留到盛夏,然后选这么一天,这天非常炎热干燥,最好再尘土飞扬(可惜上海深圳都没有这样的夏日),然后确认前一天没有洗头,在这天午后最热的时候,跑去一个理发店,直接剃成...
  • 机器学习篇——对数线性模型

    千次阅读 2018-04-14 15:36:29
    对数线性模型包括逻辑回归、最大熵模型条件随机场等 1、模型 条件概率分布(对数线性模型、概率模型)、判别模型 逻辑回归: 概率分布可由广义线性模型推导得到 多分类时,分子部分为:第k类exp(-wk*x+b),...
  • 线性回归模型是学习机器学习首先要学习的模型
  • 1 线性回归 线性回归其实就是高中讲过的那种回归,但是不同的是线性回归在神经网络这个学科里大多使用梯度下降来计算参数w,bw,bw,b,而高中讲的是使用最小二乘法。 线性回归想解决的问题也是回归问题,公式: y=wx+b...
  • 常用的三个线性模型的原理及python实现——线性回归(Linear Regression)、对数几率回归(Logostic Regression)、线性判别分析(Linear Discriminant)。 这可能会是对线性模型介绍最全面的博客一、线性模型 ...
  • 交叉熵和对数损失函数之间的关系

    千次阅读 2019-03-09 22:06:08
    交叉熵和对数损失函数之间的关系 交叉熵 熵/信息熵 假设一个发送者想传输一个随机变量的值给接收者。这个过程中,他们传输的平均信息量为: 叫随机变量的熵,其中 把熵扩展到连续变量的概率分布,则熵变为 ...
  • 用R语言进行数据分析:常规广义线性模型线性模型对于常规的多重模型(multiple model)拟合,最基本的函数是lm()。 下面是调用它的方式的一种改进版:>fitted.model例如> fm2 将会拟合 y 对 x1 x2 的多重...
  • 基本形式 优点:线性模型形式简单、易于建模。 很多非线性模型是在线性...1、线性回归介绍与离散属性转换为实数值 线性回归(linear regeression)试图学习一个线性模型以尽可能准确预测实值输出标记。 对...
  • matlab 简单的图像对数变换
  • 这时需要微控制器将传感器的对数响应线性化。该方案的一个较好例子就是SandboxElectronics公司的SEN-000007模块,该模块使用的是汉威电子公司生产的MG-811二氧化碳传感器。参考文献1中给出了电路代码,但没有说明...
  • 对数几率回归(logistic regression),有时候会译为逻辑回归(音译),其实是我们把回归模型应用到分类问题时,线性回归的一种变形,主要是针对二分类提出的。既然是线性回归的一种变形,那么在理解对数几率回归时,...
  • 对数线性模型log linear model 对数线性模型有:最大熵模型逻辑斯谛回归。 特征指示特征 ...对数线性模型的一般形式 ...对数线性模型的不同形式 ...将因子转换到对数空间,成为对数线性模型。 ...
  • 线性回归是一种研究影响关系的方法,在实际研究里非常常见。本文就来梳理下线性回归分析的分析流程,闲话少说,我们开始吧!线性回归回归分析实质上就是研究一个或多个自变量X对一个因变量Y(定量数据)的影响关系情况...
  • Component logarithmic conversion 成分对数转换 Centered log-ratio transformation 中心对数转换 数据要求:行=OTU/基因 列=样本 require(qiime2R) #Samples are columns data_clr=make_clr(data)
  • 第十一章坐标转换和线性变换

    千次阅读 2020-02-11 20:12:10
    11.1空间的基坐标系 11.2其他坐标系与标准坐标系的转换 11.3任意坐标系转换 11.4线性变换 11.5坐标转换和线性变换 ...
  • 线性坐标在显示有较大区值范围的\(x\)\(y\)时(\(x\)\(y\)的取值范围有很大尺度的差异)不能很清楚地将两者的对应关系表现出来。对于函数\(y=log_{10}x, x\in[1, 100000]\)在线性坐标下如图一所示。import ...
  • 线性模型基本形式:f(x)=w1*x1+w2*x2+w3*x3+...+wd*xd+b 向量形式:f(x)=w'x+b(w'指w转置w'=(w1,w2,w3,...,wd)) 回归任务最常用均方误差作为性能度量,见下图 ...如对数线性回归:lny=w'x+b,让e^(w'x+b)逼近y ...
  • 常见的广义线性模型有:probit模型、poisson模型、对数线性模型等等。对数线性模型里有:logistic regression、Maxinum entropy。本篇是对逻辑回归理论应用的学习总结、以及广义线性模型导出逻辑回归的过程,下一...
  • 跟着博主的脚步,每天进步一点点本文介绍对数线性分类模型,在线性模型的基础上通过复合函数(sigmoid,softmax,entropy )将其映射到概率...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,557
精华内容 16,622
热门标签
关键字:

对数关系和线性关系转换