精华内容
下载资源
问答
  • “通过贝叶斯模型平均的半参数GARCH”代码。 数据 描述 本文的经验研究中使用的数据集包含对股票指数和单个股票的日末(EOD)百分比对数回报率的观察值:标准普尔500(SPX),富时100(FTSE),DAX,日经平均指数225...
  • 线性自回归矩阵代码半参数格拉玛 时间序列分析中GLARMA类型模型的半参数方法(Matlab版本) MATLAB函数spglarma用于使用Pearson或Score类型残差拟合广义线性自回归移动平均值(GLARMA)模型,而基础分布将使用的经验...
  • 论文研究-Heckman-Tobit模型半参数估计.pdf, Heckman-Tobit模型可以同时处理样本选择问题和删失数据问题,是一个重要的微观计量模型.本文根据结果变量的条件生存函数...
  • 论文研究-归并数据回归模型半参数估计方法.pdf, 基于受限因变量的生存函数,构造归并数据回归模型的一个新的半参数估计量, 并设计多项实验与HP估计量进行模拟比较. ...
  • 参数贝叶斯隐式马尔可夫模型

    千次阅读 2017-04-10 04:54:36
    试着翻译 Matthew J.Johnson 的这篇文章Abstract将无处不在的对时间序列处理的马尔可夫模型加入层次性狄利克雷过程隐式马尔可夫链(HDP-HMM)作为一个自然的非参数贝叶斯的扩展是很重要的。但是,很多时候,HMM的...

    试着翻译 Matthew J.Johnson 的这篇文章

    Abstract

    将无处不在的对时间序列处理的马尔可夫模型加入层次性狄利克雷过程隐式马尔可夫链(HDP-HMM)作为一个自然的非参数贝叶斯的扩展是很重要的。但是,很多时候,HMM的马尔可夫性的约束是很不必要的,尤其是当我们想要学习或者编码非几何分布的状态时间的时候。我们可以扩展HDP-HMM来获取一种从确定时间段的半马尔可夫模型获取的架构,这种架构现在基本是使用的参数型的非贝叶斯设置。这样我们可以构建一个可以使用状态时间的自然先验信息的高解释性的模型。
    本文中,我们介绍了确定时间的HDP-HSMM,同时开发了一个快速的后验推理的采样算法。这个方法同时也能用来做有限贝叶斯HSMM的推理。我们的结构化吉布斯采样算法可以被集成在更大的层次性贝叶斯模型中,给贝叶斯推理添加了另一种工具。

    Introduction

    在无监督的前提下,对于一套序列数据,我们经常要推理有意义的状态或者主题。这些状态在数据中,可以用数据的一些特征来描述和区别。比如,Speaker diarization问题,我们有一个记录一个会议的单独的声音文件,我们希望来推理一共有多少个人在说话。他们说话的时候,有一些特征就影响了他们讲话的模式。

    展开全文
  • 对含有MA(3)误差项的面板数据模型,应用半参数计量经济学理论,在相关假设基础上推导出半参数估计方法,并根据蒙特卡洛模拟对这种方法进行实证检验,结果证明这种半参数估计方法是可行的,并且相对参数估计方法(最小二乘...
  • 常用的回归模型及其代码实现

    千次阅读 2019-11-25 10:44:41
    常用的回归模型及其代码实现线性回归(Linear Regression)新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容...

    线性回归(Linear Regression)

    机器学习中最简单的回归模型,在一元回归模型中,形式为一元函数关系Y= Wx + b,称为单变量线性回归(Single Variable Linear Regression )。简单来说就是用一元线性模型来拟合数据关系。当然,实际运用基本都是多变量的线性回归(Multi Variable Linear Regression)(单变量高中生都能拟合了),体现了多个输入自变量(特征变量)与输出因变量之间的关系。
    多变量线性模型
    其中a是系数,b是偏置。适用于建模线性可分数据,使用权重系数a来加权每个特征变量的重要性,可以使用随机梯度(SGD)来确定这些权重。

    线性回归的特点:

    1. 建模速度快,使用建模线性关系明显且数据量不大的情况。
    2. 有非常直观的理解和解释,常用于机器学习的入门
    3. 对异常值非常敏感,建模前最好删除异常值

    线性回归的代码实现

    成本函数(Cost Function)

    使用成本函数J来表示预测结果h(x)与实际输出y之间的误差,这里可以使用最简单的“最小均方误差”(Least mean square)来描述:
    在这里插入图片描述
    其中,m表示样本的数量,i表示第i个样本,其中的1/2,是为了求导方便而添加的专业习惯。

    梯度下降(SGD)

    如上文所说,我们需要使用梯度下降确定我们的参数w=和b,使得损失函数J的值最小。
    在这里插入图片描述
    关于成本函数J的图像大致像一个“碗”(上),我们来看看J关于一个参数w1(其实应该是theta,代表权重参数)的图像
    在这里插入图片描述
    在这里插入图片描述
    所以按照一般的思路,就是对权重参数求导,使得倒数为0的参数的值,就是成本函数J取得最小值的地方。但是大多时候,求得的偏导的数学表达式很复杂,所以我们采用一种叫做“梯度下降(gradient descent)”的方法
    在这里插入图片描述
    即:

    在这里插入图片描述
    通俗一点讲,就是希望权重参数“沿着J减小的方向(梯度减小的方向),一步一步(也就是学习率alpha)的走到那个最低点”

    代码实现——使用sklearn的线性回归模型

    class LinearRegression(fit_intercept = True,normalize = False,copy_X = True,n_jobs = 1)
      """
      :param normalize:如果设置为True时,数据进行标准化。请在使用normalize = False的估计器调时用fit之前使用preprocessing.StandardScaler
     
      :param copy_X:boolean,可选,默认为True,如果为True,则X将被复制
     
      :param n_jobs:int,可选,默认1。用于计算的CPU核数
      """
    

    实例代码:

    from sklearn.linear_model import LinearRegression
    reg = LinearRegression()
    

    波士顿房价预测

    1. 波士顿房价的数据描述
    from sklearn.datasets import load_boston
    boston = load_boston()
    print(boston.DESCR)  #查看数据信息
    
    

    Boston house prices dataset

    Data Set Characteristics:

    :Number of Instances: 506 
    
    :Number of Attributes: 13 numeric/categorical predictive. Median Value (attribute 14) is usually the target.
    
    :Attribute Information (in order):
    
    1. 房价数据分割
    from sklearn.model_selection import train_test_split
    
    import numpy as np
    
    X = boston.data
    y = boston.target
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33, test_size=0.25)
    

    3.训练与预测数据标准化处理

    from sklearn.preprocessing import StandardScaler
    
    ss_X = StandardScaler()
    ss_y = StandardScaler()
    
    X_train = ss_X.fit_transform(X_train)
    X_test = ss_X.transform(X_test)
    y_train = ss_X.fit_transform(y_train.reshape(-1, 1))
    y_test = ss_X.transform(y_test.reshape(-1, 1))
    
    1. 使用线性回归模型对房价进行预测
    from sklearn.linear_model import LinearRegression
    lr = LinearRegression()
    lr.fit(X_train,y_train)
    lr_y_predict = lr.predict(X_test)
    

    5.使用均方误差评测

    from sklearn.metrics import mean_squared_error
     
    print '线性回归模型的均方误差为:',mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_tranform(lr_y_predict))
    

    完整代码:

    from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge
    from sklearn.preprocessing import StandardScaler
    from sklearn.datasets import load_boston
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import mean_squared_error
    
    
    
    def linearmodel():
        """
        线性回归对波士顿数据集处理
        :return: None
        """
    
        # 1、加载数据集
    
        ld = load_boston()
    
        x_train, x_test, y_train, y_test = train_test_split(ld.data, ld.target, test_size=0.25)
    
        # 2、标准化处理
    
        ss_X = StandardScaler()
        ss_y = StandardScaler()
    
        x_train = ss_X.fit_transform(x_train)
        x_test = ss_X.transform(x_test)
        y_train = ss_y.fit_transform(y_train.reshape(-1, 1))
        y_test = ss_y.transform(y_test.reshape(-1, 1))
    
        # 3、估计器流程
    
        # LinearRegression
        lr = LinearRegression()
    
        lr.fit(x_train, y_train)
    
        # print(lr.coef_)
    
        y_lr_predict = lr.predict(x_test)
    
        y_lr_predict = ss_y.inverse_transform(y_lr_predict)
    
        print("Lr预测值:", y_lr_predict)
    
        # SGDRegressor
        sgd = SGDRegressor()
    
        sgd.fit(x_train, y_train)
    
        # print(sgd.coef_)
    
        y_sgd_predict = sgd.predict(x_test)
    
        y_sgd_predict = ss_y.inverse_transform(y_sgd_predict)
    
        print("SGD预测值:", y_sgd_predict)
    
        # 带有正则化的岭回归
    
        rd = Ridge(alpha=0.01)
    
        rd.fit(x_train, y_train)
    
        y_rd_predict = rd.predict(x_test)
    
        y_rd_predict = ss_y.inverse_transform(y_rd_predict)
    
        print(rd.coef_)
    
        # 两种模型评估结果
    
        print("lr的均方误差为:", mean_squared_error(ss_y.inverse_transform(y_test), y_lr_predict))
    
        print("SGD的均方误差为:", mean_squared_error(ss_y.inverse_transform(y_test), y_sgd_predict))
    
        print("Ridge的均方误差为:", mean_squared_error(ss_y.inverse_transform(y_test), y_rd_predict))
    
    
    print(linearmodel())
    
    
    展开全文
  • 欧拉公式求长期率的matlab代码Heston随机波动率模型代码包括: 欧洲看涨期权的封闭式解决方案 蒙特卡洛溶液(零吸收+欧拉方法) 蒙特卡洛解决方案(零反射+欧拉方法) 蒙特卡洛解决方案(零反射+米尔斯坦方法)...
  • 监督学习代码实战

    千次阅读 2020-08-07 23:17:25
    不可能等标注好数据再去训练模型吧,所以你得会监督学习算法。 不过我在这里先打击大家一下,用sklearn的包做不了大数据量的监督学习,我用的数据量大概在15000条以上就要报MemoryError错误了,这个是我最讨厌...

    sklearn官方例子——用半监督学习做数字识别
     

    什么是半监督学习

    半监督学习很重要,为什么呢?因为人工标注数据成本太高,现在大家参加比赛的数据都是标注好的了,那么如果老板给你一份没有标注的数据,而且有几百万条,让你做个分类什么的,你怎么办?不可能等标注好数据再去训练模型吧,所以你得会半监督学习算法。

    不过我在这里先打击大家一下,用sklearn的包做不了大数据量的半监督学习,我用的数据量大概在15000条以上就要报MemoryError错误了,这个是我最讨厌的错误。暂时我还没有解决的办法,如果同志们是小数据量,那就用这个做着玩玩吧


    算法流程

    假设我们有一份数据集,共330个数字,其中前十个是已知的,已经标注好了,后320个是未知的,需要我们预测出来的。

    • 首先把这330个数据全部都放到半监督学习算法里,训练模型,预测那320个标签
    • 然后用某种方法(看下面代码的操作)得知这320个数据里最不确定的前5个数据,对它进行人工标注,然后把它放到之前的10个数据里,现在就有15个已知数据了
    • 这样循环个几次,已标注的数据就变多了,那么分类器的效果肯定也就变好了

    • 一共330个点,都是已经标注好的了,我们把其中的320个点赋值为-1,这样就可以假装这320个点都是没有标注的了
    • 训练一个只有10个标记点的标签传播模型
    • 然后从所有数据中选择要标记的前五个最不确定的点,把它们(带有正确标签)放到原来的10个点中
    • 接下来可以训练15个标记点(原始10个 + 5个新点)
    • 重复这个过程四次,就可以使用30个标记好的点来训练模型
    • 可以通过改变max_iterations将这个值增加到30以上

     

    LabelSpreading是一个半监督学习模型

     

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy import stats
    from sklearn import datasets
    from sklearn.semi_supervised import label_propagation
    from sklearn.metrics import classification_report,confusion_matrix
    
    # 再加下面这个,不然会报错
    from scipy.sparse.csgraph import *
    
    
    digits = datasets.load_digits()
    rng = np.random.RandomState(0)
    
    # indices是随机产生的0-1796个数字,且打乱
    #indices:[1081 1707  927 ... 1653  559  684]
    indices = np.arange(len(digits.data))
    rng.shuffle(indices)
    
    
    # 取前330个数字来玩
    X = digits.data[indices[:330]]
    y = digits.target[indices[:330]]
    images = digits.images[indices[:330]]
    
    
    n_total_samples = len(y) # 330
    n_labeled_points = 10 # 标注好的数据共10条
    max_iterations = 5 # 迭代5次
    
    
    #未标注的数据320条
    #即[10 11 12 ... 329]
    unlabeled_indices = np.arange(n_total_samples)[n_labeled_points:] 
    
    f = plt.figure() # 画图用的
    
    
    for i in range(max_iterations):
        if len(unlabeled_indices) == 0:
            print("no unlabeled items left to label") # 没有未标记的标签了,全部标注好了
            break
        y_train = np.copy(y)
        y_train[unlabeled_indices] = -1 #把未标注的数据全部标记为-1,也就是后320条数据
        
        lp_model = label_propagation.LabelSpreading(gamma=0.25,max_iter=5) # 训练模型
        lp_model.fit(X,y_train)
        
        predicted_labels = lp_model.transduction_[unlabeled_indices] # 预测的标签
        true_labels = y[unlabeled_indices] # 真实的标签
        print('**************************')
        print(predicted_labels)
        print(true_labels)
        print('**************************')
        cm = confusion_matrix(true_labels,predicted_labels,
                             labels = lp_model.classes_)
        
        print("iteration %i %s" % (i,70 * "_")) # 打印迭代次数
        print("Label Spreading model: %d labeled & %d unlabeled (%d total)"
             % (n_labeled_points,n_total_samples-n_labeled_points,n_total_samples))
        
        print(classification_report(true_labels,predicted_labels))
        
        print("Confusion matrix")
        print(cm)
        
        # 计算转换标签分布的熵
        # lp_model.label_distributions_作用是Categorical distribution for each item
        pred_entropies = stats.distributions.entropy(
        lp_model.label_distributions_.T)
        
        # 选择分类器最不确定的前5位数字的索引
        # 首先计算出所有的熵,也就是不确定性,然后从320个中选择出前5个熵最大的
        # numpy.argsort(A)提取排序后各元素在原来数组中的索引。具体情况可看下面
        #  np.in1d 用于测试一个数组中的值在另一个数组中的成员资格,返回一个布尔型数组。具体情况可看下面
        uncertainty_index = np.argsort(pred_entropies)[::1]
        uncertainty_index = uncertainty_index[
            np.in1d(uncertainty_index,unlabeled_indices)][:5] # 这边可以确定每次选前几个作为不确定的数,最终都会加回到训练集
        
        # 跟踪我们获得标签的索引
        delete_indices = np.array([])
        
        # 可视化前5次的结果
        if i < 5:
            f.text(.05,(1 - (i + 1) * .183),
                  'model %d\n\nfit with\n%d labels' %
                  ((i + 1),i*5+10),size=10)
        for index,image_index in enumerate(uncertainty_index):
            # image_index是前5个不确定标签
            # index就是0-4
            image = images[image_index]
    
            # 可视化前5次的结果
            if i < 5:
                sub = f.add_subplot(5,5,index + 1 + (5*i))
                sub.imshow(image,cmap=plt.cm.gray_r)
                sub.set_title("predict:%i\ntrue: %i" % (
                    lp_model.transduction_[image_index],y[image_index]),size=10)
                sub.axis('off')
            
            # 从320条里删除要那5个不确定的点
            # np.where里面的参数是条件,返回的是满足条件的索引
            delete_index, = np.where(unlabeled_indices == image_index)
            delete_indices = np.concatenate((delete_indices,delete_index))
            
        unlabeled_indices = np.delete(unlabeled_indices,delete_indices)
        # n_labeled_points是前面不确定的点有多少个被标注了
        n_labeled_points += len(uncertainty_index)
        
    f.suptitle("Active learning with label propagation.\nRows show 5 most"
              "uncertain labels to learn with the next model")
    plt.subplots_adjust(0.12,0.03,0.9,0.8,0.2,0.45)
    plt.show()
    
    

     

    参考:

    https://www.jianshu.com/p/a21817a81890

    展开全文
  • 模型代码演示版。 运行 Matlab 脚本 runSim.m 来执行代码。 (确保包含代码的文件夹有一个名为“sim”的子文件夹) - -数据 - - 生成的数据由两部分组成:ModeData 和 SensorData。 ModeData(1,:) 是离散模式的...
  • 这种自动算法可以研究具有初始条件(参数、数字或两者的组合,它们可以是已知或未知)和输入函数(已知或未知)的模型。 要求 Lie_Symmetry 需要使用符号工具箱安装 MATLAB。 只需要下载包含两个文件夹和一个主...
  • 文章“使用半参数因子动力学进行的收益曲线建模和预测”中使用的MATLAB代码,HärdleWolfgang Karl和Majer Piotr(2012),CRC 649讨论文件,2012-48() 数量 #Abstract使用动态半参数因子模型(DSFM),我们研究了...
  • 而对于另外一些问题,我们不能确定样本遵从的分布假设,这时我们可以退一步,采用混合分布估计输入样本(也就是半参数方法);如果这样也不行,那么我们就要使用非参数的方法。今天我们来初步了解下聚类 学习。主要的...

    在参数方法中,我们假设样本来自于一个已知的分布,因此我们的主要工作就是估计有限的参数;而对于另外一些问题,我们不能确定样本遵从的分布假设,这时我们可以退一步,采用混合分布估计输入样本(也就是半参数方法);如果这样也不行,那么我们就要使用非参数的方法。今天我们来初步了解下聚类 学习。主要的要点如下:

    • 混合密度
    • K-均值聚类
    • 聚类后的监督学习
    • 层次聚类

    一、混合密度

    之所以要提出混合分布,主要原因就是上面所说的分布假设无法确定的情况,另一个原因也有可能样本遵从的分布本身就不是单一的,比如语音识别的学习,同样一个单词,可能因为说话者的性别、年龄、方言等因素而有不同的发音,因此不能够用统一的分布假设来进行拟合。这里我们采取表示所有这些不同发音方法的策略,即半参数密度估计(semiparamitric density estimation),我们对样本假定有多个分组,每个分组仍然假定一个具体的模型。

    混合密度(mixture density)记作:

    这里的G-i称为混合分支(mixture component),也称做分组(group)或簇(cluster);P(x|G-i)是分支密度,而P(G-i)是混合比例,这里是通过概率的量来度量分支的比例和密度。分支数K是超级参数,应当是预先指定的。实际上,参数分类就是混合模型,但不同的 是,参数分类是有标号的,而这里是不知道标号的,也就是非监督学习问题。因此,我们需要估计标号,接着估计每个分支的参数,为此,先看K均值聚类。

    二、K-均值聚类

    如何对一个样本进行聚类分析呢?这里我们有一个简单的算法,称之为K-均值聚类。为了便于理解,我们引入一个颜色量化的实例。比如我们有一副24位/像素的图像(即24个比特位来标示图像,总共可以表示2^24中颜色,1600多万种),假定我们有个8位/像素的彩色屏幕,显示这副图像无疑会存在像素损失,现在的问题是我们从原先的1600万种颜色中选取256种颜色来显示图像呢?且尽可能不损失图像质量。

    如果直接均匀量化是不实际的,因为图像像素的分布并不均匀,比如一副大海的图片蓝色比较多,而基本不会出现红色;我们量化后的图像像素应当尽可能地接近反映原来的像素密度,将映射表更多地放在高密度区域,丢弃没有数据的区域。

    这里我们一个自然的想法,将“距离”比较近的一些像素用一个近似值来代表,从而实现像素的量化。比如对于24位的像素x,我们有24位的映射表集合M,如果对于某个映射m-i附近的像素值都用序号i来表示像素的话,那么我们只要选取256个映射表,就可以实现1600万-->256的映射。因此这里关键是度量像素样本x与映射表m之间的距离(都是24比特的二进制序列):

    现在的问题是我们应当如何计算符合这样条件的m-i呢?我们的方法是计算总重构误差(reconsturction error),定义为:

    我们可以根据一个迭代算法来计算出这样的m,最终参考向量被设置为它所代表的所有实例的均值。算法的伪代码是:

    选择K个点作为初始中心;

    Repeat

    将每个点指派到最近的中心,形成K个簇;

    重新计算每个簇的中心;

    Until簇的中心不再变化

    初始化K-均值算法可以有不同的方法,比如简单随机选择k个实例作为初始的M,或者可计算所有数据的均值,并将一些小的随机变量加到均值上,得到k个初始的m值。

    参数K的去顶依赖于我们使用的聚类方法类型,我们可以将重构误差或对数似然作为k的函数绘制图形,找出“拐点”,即足够大的K之后,算法将开始分裂分组,此时重构误差不会大幅降低,而对数似然也不会大幅提高。

    其实K-均值聚类算法是期望最大化算法(Expectation-Maximization, EM)的一个特例。

    再给个详细解释:

         聚类属于无监督学习,以往的回归、朴素贝叶斯、SVM等都是有类别标签y的,也就是说样例中已经给出了样例的分类。而聚类的样本中却没有给定y,只有特征x,比如假设宇宙中的星星可以表示成三维空间中的点集clip_image002[10]。聚类的目的是找到每个样本x潜在的类别y,并将同类别y的样本x放在一起。比如上面的星星,聚类后结果是一个个星团,星团里面的点相互距离比较近,星团间的星星距离就比较远了。

         在聚类问题中,给我们的训练样本是clip_image004,每个clip_image006,没有了y。

         K-means算法是将样本聚类成k个簇(cluster),具体算法描述如下:

    1、 随机选取k个聚类质心点(cluster centroids)为clip_image008[6]

    2、 重复下面过程直到收敛 {

                   对于每一个样例i,计算其应该属于的类

                   clip_image009

                   对于每一个类j,重新计算该类的质心

                   clip_image010[6]

    }

         K是我们事先给定的聚类数,clip_image012[6]代表样例i与k个类中距离最近的那个类,clip_image012[7]的值是1到k中的一个。质心clip_image014[6]代表我们对属于同一个类的样本中心点的猜测,拿星团模型来解释就是要将所有的星星聚成k个星团,首先随机选取k个宇宙中的点(或者k个星星)作为k个星团的质心,然后第一步对于每一个星星计算其到k个质心中每一个的距离,然后选取距离最近的那个星团作为clip_image012[8],这样经过第一步每一个星星都有了所属的星团;第二步对于每一个星团,重新计算它的质心clip_image014[7](对里面所有的星星坐标求平均)。重复迭代第一步和第二步直到质心不变或者变化很小。

         下图展示了对n个样本点进行K-means聚类的效果,这里k取2。

         clip_image015

         K-means面对的第一个问题是如何保证收敛,前面的算法中强调结束条件就是收敛,可以证明的是K-means完全可以保证收敛性。下面我们定性的描述一下收敛性,我们定义畸变函数(distortion function)如下:

         clip_image016[6]

         J函数表示每个样本点到其质心的距离平方和。K-means是要将J调整到最小。假设当前J没有达到最小值,那么首先可以固定每个类的质心clip_image014[8],调整每个样例的所属的类别clip_image012[9]来让J函数减少,同样,固定clip_image012[10],调整每个类的质心clip_image014[9]也可以使J减小。这两个过程就是内循环中使J单调递减的过程。当J递减到最小时,clip_image018[6]和c也同时收敛。(在理论上,可以有多组不同的clip_image018[7]和c值能够使得J取得最小值,但这种现象实际上很少见)。

         由于畸变函数J是非凸函数,意味着我们不能保证取得的最小值是全局最小值,也就是说k-means对质心初始位置的选取比较感冒,但一般情况下k-means达到的局部最优已经满足需求。但如果你怕陷入局部最优,那么可以选取不同的初始值跑多遍k-means,然后取其中最小的J对应的clip_image018[8]和c输出。

    K-means补充:

    1.针对初始化点的改进。

    k-means算法是一种基本的聚类算法,这个算法的先决条件是

      1)必须选择最终结果需要聚为几类,就是k的大小。

      2)初始化聚类中心点,也就是seeds。

      当然,我们可以在输入的数据集中随机的选择k个点作为seeds,但是随机选择初始seeds可能会造成聚类的结果和数据的实际分布相差很大。既然选择初始的seeds这么重要,那有什么算法可以帮助选择初始的seeds吗?当然有,k-means++就是选择初始seeds的一种算法。

          k-means++算法选择初始seeds的基本思想就是:初始的聚类中心之间的相互距离要尽可能的远。wiki上对该算法的描述是如下:

    1. 从输入的数据点集合中随机选择一个点作为第一个聚类中心
    2. 对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x)
    3. 选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大
    4. 重复2和3直到k个聚类中心被选出来
    5. 利用这k个初始的聚类中心来运行标准的k-means算法

          从上面的算法描述上可以看到,算法的关键是第3步,如何将D(x)反映到点被选择的概率上,一种算法如下(详见此地):

    1. 先从我们的数据库随机挑个随机点当“种子点”
    2. 对于每个点,我们都计算其和最近的一个“种子点”的距离D(x)并保存在一个数组里,然后把这些距离加起来得到Sum(D(x))。
    3. 然后,再取一个随机值,用权重的方式来取计算下一个“种子点”。这个算法的实现是,先取一个能落在Sum(D(x))中的随机值Random,然后用Random -= D(x),直到其<=0,此时的点就是下一个“种子点”。
    4. 重复2和3直到k个聚类中心被选出来
    5. 利用这k个初始的聚类中心来运行标准的k-means算法

          可以看到算法的第三步选取新中心的方法,这样就能保证距离D(x)较大的点,会被选出来作为聚类中心了。至于为什么原因很简单,如下图 所示:  

                                                   

          假设A、B、C、D的D(x)如上图所示,当算法取值Sum(D(x))*random时,该值会以较大的概率落入D(x)较大的区间内,所以对应的点会以较大的概率被选中作为新的聚类中心。

    三、EM

    下面主要介绍EM的整个推导过程。

    1. Jensen不等式

          回顾优化理论中的一些概念。设f是定义域为实数的函数,如果对于所有的实数x,clip_image002,那么f是凸函数。当x是向量时,如果其hessian矩阵H是半正定的(clip_image004),那么f是凸函数。如果clip_image006或者clip_image008,那么称f是严格凸函数。

          Jensen不等式表述如下:

          如果f是凸函数,X是随机变量,那么

          clip_image010

          特别地,如果f是严格凸函数,那么clip_image012当且仅当clip_image014,也就是说X是常量。

          这里我们将clip_image016简写为clip_image018

          如果用图表示会很清晰:

          clip_image019

          图中,实线f是凸函数,X是随机变量,有0.5的概率是a,有0.5的概率是b。(就像掷硬币一样)。X的期望值就是a和b的中值了,图中可以看到clip_image010[1]成立。

          当f是(严格)凹函数当且仅当-f是(严格)凸函数。

          Jensen不等式应用于凹函数时,不等号方向反向,也就是clip_image021

    2. EM算法

          给定的训练样本是clip_image023,样例间独立,我们想找到每个样例隐含的类别z,能使得p(x,z)最大。p(x,z)的最大似然估计如下:

          clip_image024

          第一步是对极大似然取对数,第二步是对每个样例的每个可能类别z求联合分布概率和。但是直接求clip_image026一般比较困难,因为有隐藏变量z存在,但是一般确定了z后,求解就容易了。

          EM是一种解决存在隐含变量优化问题的有效方法。竟然不能直接最大化clip_image028,我们可以不断地建立clip_image030的下界(E步),然后优化下界(M步)。这句话比较抽象,看下面的。

          对于每一个样例i,让clip_image032表示该样例隐含变量z的某种分布,clip_image032[1]满足的条件是clip_image034。(如果z是连续性的,那么clip_image032[2]是概率密度函数,需要将求和符号换做积分符号)。比如要将班上学生聚类,假设隐藏变量z是身高,那么就是连续的高斯分布。如果按照隐藏变量是男女,那么就是伯努利分布了。

    可以由前面阐述的内容得到下面的公式:

          clip_image035

          (1)到(2)比较直接,就是分子分母同乘以一个相等的函数。(2)到(3)利用了Jensen不等式,考虑到clip_image037是凹函数(二阶导数小于0),而且

          clip_image038

          就是clip_image039的期望(回想期望公式中的Lazy Statistician规则)

          设Y是随机变量X的函数clip_image041(g是连续函数),那么

          (1) X是离散型随机变量,它的分布律为clip_image043,k=1,2,…。若clip_image045绝对收敛,则有

          clip_image047

          (2) X是连续型随机变量,它的概率密度为clip_image049,若clip_image051绝对收敛,则有

          clip_image053

          对应于上述问题,Y是clip_image039[1],X是clip_image055clip_image057clip_image059,g是clip_image055[1]clip_image039[2]的映射。这样解释了式子(2)中的期望,再根据凹函数时的Jensen不等式:

          clip_image060

    可以得到(3)。

          这个过程可以看作是对clip_image028[1]求了下界。对于clip_image032[3]的选择,有多种可能,那种更好的?假设clip_image026[1]已经给定,那么clip_image028[2]的值就决定于clip_image057[1]clip_image062了。我们可以通过调整这两个概率使下界不断上升,以逼近clip_image028[3]的真实值,那么什么时候算是调整好了呢?当不等式变成等式时,说明我们调整后的概率能够等价于clip_image028[4]了。按照这个思路,我们要找到等式成立的条件。根据Jensen不等式,要想让等式成立,需要让随机变量变成常数值,这里得到:

          clip_image063

          c为常数,不依赖于clip_image065。对此式子做进一步推导,我们知道clip_image067,那么也就有clip_image069,(多个等式分子分母相加不变,这个认为每个样例的两个概率比值都是c),那么有下式:

          clip_image070

          至此,我们推出了在固定其他参数clip_image026[2]后,clip_image072的计算公式就是后验概率,解决了clip_image072[1]如何选择的问题。这一步就是E步,建立clip_image028[5]的下界。接下来的M步,就是在给定clip_image072[2]后,调整clip_image026[3],去极大化clip_image028[6]的下界(在固定clip_image072[3]后,下界还可以调整的更大)。那么一般的EM算法的步骤如下:

    循环重复直到收敛 {

          (E步)对于每一个i,计算

                      clip_image074

          (M步)计算

                      clip_image075

          那么究竟怎么确保EM收敛?假定clip_image077clip_image079是EM第t次和t+1次迭代后的结果。如果我们证明了clip_image081,也就是说极大似然估计单调增加,那么最终我们会到达最大似然估计的最大值。下面来证明,选定clip_image077[1]后,我们得到E步

          clip_image083

          这一步保证了在给定clip_image077[2]时,Jensen不等式中的等式成立,也就是

          clip_image084

          然后进行M步,固定clip_image086,并将clip_image088视作变量,对上面的clip_image090求导后,得到clip_image092,这样经过一些推导会有以下式子成立:

          clip_image093

          解释第(4)步,得到clip_image092[1]时,只是最大化clip_image090[1],也就是clip_image095的下界,而没有使等式成立,等式成立只有是在固定clip_image026[4],并按E步得到clip_image097时才能成立。

          况且根据我们前面得到的下式,对于所有的clip_image097[1]clip_image026[5]都成立

          clip_image098

          第(5)步利用了M步的定义,M步就是将clip_image088[1]调整到clip_image100,使得下界最大化。因此(5)成立,(6)是之前的等式结果。

          这样就证明了clip_image102会单调增加。一种收敛方法是clip_image102[1]不再变化,还有一种就是变化幅度很小。

          再次解释一下(4)、(5)、(6)。首先(4)对所有的参数都满足,而其等式成立条件只是在固定clip_image026[6],并调整好Q时成立,而第(4)步只是固定Q,调整clip_image026[7],不能保证等式一定成立。(4)到(5)就是M步的定义,(5)到(6)是前面E步所保证等式成立条件。也就是说E步会将下界拉到与clip_image102[2]一个特定值(这里clip_image088[2])一样的高度,而此时发现下界仍然可以上升,因此经过M步后,下界又被拉升,但达不到与clip_image102[3]另外一个特定值一样的高度,之后E步又将下界拉到与这个特定值一样的高度,重复下去,直到最大值。

          如果我们定义

          clip_image103

          从前面的推导中我们知道clip_image105,EM可以看作是J的坐标上升法,E步固定clip_image026[8],优化clip_image107,M步固定clip_image107[1]优化clip_image026[9]

     

         下面累述一下K-means与EM的关系,首先回到初始问题,我们目的是将样本分成k个类,其实说白了就是求每个样例x的隐含类别y,然后利用隐含类别将x归类。由于我们事先不知道类别y,那么我们首先可以对每个样例假定一个y吧,但是怎么知道假定的对不对呢?怎么评价假定的好不好呢?我们使用样本的极大似然估计来度量,这里是就是x和y的联合分布P(x,y)了。如果找到的y能够使P(x,y)最大,那么我们找到的y就是样例x的最佳类别了,x顺手就聚类了。但是我们第一次指定的y不一定会让P(x,y)最大,而且P(x,y)还依赖于其他未知参数,当然在给定y的情况下,我们可以调整其他参数让P(x,y)最大。但是调整完参数后,我们发现有更好的y可以指定,那么我们重新指定y,然后再计算P(x,y)最大时的参数,反复迭代直至没有更好的y可以指定。

         对应于K-means来说就是我们一开始不知道每个样例clip_image020[10]对应隐含变量也就是最佳类别clip_image022[6]。最开始可以随便指定一个clip_image022[7]给它,然后为了让P(x,y)最大(这里是要让J最小),我们求出在给定c情况下,J最小时的clip_image014[10](前面提到的其他未知参数),然而此时发现,可以有更好的clip_image022[8](质心与样例clip_image020[11]距离最小的类别)指定给样例clip_image020[12],那么clip_image022[9]得到重新调整,上述过程就开始重复了,直到没有更好的clip_image022[10]指定。这样从K-means里我们可以看出它其实就是EM的体现,E步是确定隐含类别变量clip_image024[6],M步更新其他参数clip_image018[9]来使J最小化。这里的隐含类别变量指定方法比较特殊,属于硬指定,从k个类别中硬选出一个给样例,而不是对每个类别赋予不同的概率。总体思想还是一个迭代优化过程,有目标函数,也有参数变量,只是多了个隐含变量,确定其他参数估计隐含变量,再确定隐含变量估计其他参数,直至目标函数最优。

    3. 重新审视混合高斯模型

          我们已经知道了EM的精髓和推导过程,再次审视一下混合高斯模型。之前提到的混合高斯模型的参数clip_image109clip_image111计算公式都是根据很多假定得出的,有些没有说明来由。为了简单,这里在M步只给出clip_image113clip_image115的推导方法。

    E步很简单,按照一般EM公式得到:

          clip_image116

          简单解释就是每个样例i的隐含类别clip_image055[2]为j的概率可以通过后验概率计算得到。

          在M步中,我们需要在固定clip_image072[4]后最大化最大似然估计,也就是

          clip_image118

          这是将clip_image120的k种情况展开后的样子,未知参数clip_image122clip_image124

          固定clip_image126clip_image128,对clip_image130求导得

          clip_image131

          等于0时,得到

          clip_image132

          这就是我们之前模型中的clip_image115[1]的更新公式。

          然后推导clip_image126[1]的更新公式。看之前得到的

          clip_image133

          在clip_image113[1]clip_image115[2]确定后,分子上面的一串都是常数了,实际上需要优化的公式是:

          clip_image134

          需要知道的是,clip_image126[2]还需要满足一定的约束条件就是clip_image136

          这个优化问题我们很熟悉了,直接构造拉格朗日乘子。

          clip_image137

          还有一点就是clip_image139,但这一点会在得到的公式里自动满足。

          求导得,

          clip_image141

          等于0,得到

          clip_image142

          也就是说clip_image143再次使用clip_image136[1],得到

          clip_image144

          这样就神奇地得到了clip_image146

          那么就顺势得到M步中clip_image126[3]的更新公式:

          clip_image147

          clip_image111[1]的推导也类似,不过稍微复杂一些,毕竟是矩阵。结果在之前的混合高斯模型中已经给出。

    4. 总结

          如果将样本看作观察值,潜在类别看作是隐藏变量,那么聚类问题也就是参数估计问题,只不过聚类问题中参数分为隐含类别变量和其他参数,这犹如在x-y坐标系中找一个曲线的极值,然而曲线函数不能直接求导,因此什么梯度下降方法就不适用了。但固定一个变量后,另外一个可以通过求导得到,因此可以使用坐标上升法,一次固定一个变量,对另外的求极值,最后逐步逼近极值。对应到EM上,E步估计隐含变量,M步估计其他参数,交替将极值推向最大。EM中还有“硬”指定和“软”指定的概念,“软”指定看似更为合理,但计算量要大,“硬”指定在某些场合如K-means中更为实用(要是保持一个样本点到其他所有中心的概率,就会很麻烦)。

          另外,EM的收敛性证明方法确实很牛,能够利用log的凹函数性质,还能够想到利用创造下界,拉平函数下界,优化下界的方法来逐步逼近极大值。而且每一步迭代都能保证是单调的。最重要的是证明的数学公式非常精妙,硬是分子分母都乘以z的概率变成期望来套上Jensen不等式,前人都是怎么想到的。

          在Mitchell的Machine Learning书中也举了一个EM应用的例子,明白地说就是将班上学生的身高都放在一起,要求聚成两个类。这些身高可以看作是男生身高的高斯分布和女生身高的高斯分布组成。因此变成了如何估计每个样例是男生还是女生,然后在确定男女生情况下,如何估计均值和方差,里面也给出了公式,有兴趣可以参考。

    四、聚类后的监督学习

    聚类可以用来探查数据,理解数据的结构。维度归约方法用来发现变量间的相关性,从而对变量分组;而聚类方法用于发现实例间的相似性,从而对实例分组。

    聚类的一个最直接应用就是分类问题,一旦发现实例间存在基于某种相似性的分组,那么可以对分组进行命名标记,定义属性,比如“客户关系管理”中对客户进行分组。

    聚类也可以作为监督式学习的预处理步骤,我们先了解发生了什么,然后学习它意味着什么。

    五、层次聚类

    上面的聚类方法通过混合模型拟合数据,或找出最小化重构误差的分组模式,还有一些聚类方法只关注实例间的相似性,对数据没有其他要求。这里的目标是找出分组,使得一个分组汇总的对象比不在一个分组中的对象更相似,这种方法称为层次聚类(hierarchiacl clustering)。

    层次聚类的关键是度量相似性,常用的就是欧式距离(向量对应分量差的组合)和绝对值距离(向量间距离)。在单链接聚类中,距离定义为两个分组的所有可能元素之间的最小距离,而全链接聚类中,两个分组间的距离则取所有可能元素之间的最大距离。

           K-Means属于平面聚类(Flat Clustering),因为这些算法的输出都是返回一个平面的无结构的聚类集合,所以叫做Flat clustering;平面聚类有一个缺陷就是要选择聚类的数目以及初始点,这对于没有经验的人员来说是一件很棘手的工作,因为聚类结果的好坏完全依赖于这一参数的选择,所以很多时候可以考虑下层次聚类算法,避免了聚类数量和初始点的选择。层次聚类算法有多种形式,这里介绍的这个叫做层次凝聚聚类算法(Hierarchical Agglomerative Clustering),简称HAC,其主要思想就是,先把每一个样本点当做一个聚类,然后不断重复的将其中最近的两个聚类合并(就是凝聚的含义),直到满足迭代终止条件。

    HAC具体实现步骤:

    1)将训练样本集中的每个数据点都当做一个聚类;

    2)计算每两个聚类之间的距离,将距离最近的或最相似的两个聚类进行合并;

    3)重复上述步骤,直到得到的当前聚类数是合并前聚类数的10%,即90%的聚类都被合并了;当然还可以设置其他终止条件,这样设置是为了防止过度合并。

    很明显,还是一样的老套路,唯一的新鲜处在于第二步中,如何度量两个聚类间的相似度,关于这个主要有三种定义:

    1)单链(Single-link):不同两个聚类中离得最近的两个点之间的距离,即MIN;

    2)全链(Complete-link):不同两个聚类中离得最远的两个点之间的距离,即MAX;

    3)平均链(Average-link):不同两个聚类中所有点对距离的平均值,即AVERAGE;

    不难发现,其中前两种定义的出发点是那些点集中的特殊点或外点,如噪点;而最后一种定义相对来说就不那么稳定了,所以又有人提出了使用距离的中值,这样可以排除一些个别点的干扰。

    可以看下图效果(基于单链),黑色点是噪声点:

           这是一种自下而上(bottom-up)的层次聚类,因此叫做层次凝聚聚类(Hierarchical Agglomerative Clustering),由于其计算点对距离时需要多次遍历,所以计算量可想而知,并且每次迭代只能合并两个聚类,时间复杂度上同样缺乏优势,因此实际应用中没有Flat clustering那么受欢迎,但是由于其避免了聚类数以及初始点的选择,而且不会陷入局部最优,在一些二次复杂度的问题中还是应该考虑的;在最早的CBIR系统中,HAC被应用到词袋技术中,如下图:

     

    另外还有一种层次聚类算法,叫做自上而下的,这种形式的聚类主要是使用了一种分离聚类的方法,这里就不打算深入了,需要的可参考http://nlp.stanford.edu/IR-book/html/htmledition/hierarchical-agglomerative-clustering-1.html#sec:hac,里面有很详细的关于层次聚类的东西。

    Refer: 《机器学习导论》,Ethen Alpaydin(土耳其),机械工业出版社

    

    

    展开全文
  • #freq 我见的有‘MS‘、H、M ,预测sin,要设置H ,个人理解数据如果变化很快,要用H 其他的内置参数: yearly_seasonality 是年规律拟合,Prophet模型会描绘出以一年为单位的数据规律,后面的部分会有图示;...
  • 这是本人对模型的融合的代码合集,环境是python3,只要复制过去就可以用了,非常方便。 目录 1.交叉验证 1.1 原理 1.2 GridSearchCV 2.绘制学习曲线 3.stacking 3.1 stacking原理 3.2 代码实现不同版本的...
  • 【PEST++】02 新安江模型参数自动率定

    千次阅读 多人点赞 2020-01-15 17:18:04
    文章目录一、背景1.1 模型简介1.2 PEST++简介二、原理2.1 目标函数2.2 参数范围三、过程3.1 准备文件3.1.1 实测值文件3.1.2 参数参数组文件3.1.3 模板文件3.1.4 命令行文件3.2 编写时间序列控制文件3.2.1 设置...
  • 机器翻译模型Transformer代码详细解析

    万次阅读 多人点赞 2017-07-10 10:02:27
    谷歌一个月前发了一篇论文Attention is all you need,文中提出了一种新的架构叫做Transformer,用以来实现机器翻译。论文发出不久,就有人用tensorflow实现了Transformer模型,本文对其代码进行细致的分析。
  • pytorch如何使用精度模型部署

    千次阅读 热门讨论 2020-04-25 13:04:06
    在部署时,为了减少计算量,可以考虑使用16位浮点模型,而训练时涉及到梯度计算,需要使用32位浮点,这种精度的不一致经过测试,模型性能下降有限,可以接受.但是推断时计算量可以降低一半,同等计算资源下,并发度可提升近一...
  • 这篇博客介绍的是一篇用于监督分类问题的方法: 协同训练 Co-training, A. Blum and T. Mitchell, “Combining labeled and unlabeled data with co-training,” in Proc. of the 11th Annual Conf. on ...
  • 1 Ensemble Learning-模型融合 通过对多个单模型融合以提升整体性能。 1.1 Voting 投票制即为,投票多者为最终的结果。例如一个分类问题,多个模型投票(当然可以设置权重)。最终投票数最多的类为最终被预测的类...
  • 半参数成对模型具有以下形式 其中耦合矩阵J和非线性函数 V 都必须从数据中学习。 函数 V 应以非参数方式指定。 有关详细信息,请参阅: Humplik J., Tkačik G. (2016) 基于半参数能量的概率模型。 K-pairwise 模型...
  • --真正的模型驱动开发。 目前的建模工具很多,不过个人的观点来看,基本都跑偏了。没办法真正应用模型驱动来有效开发。 废话少说。 下面的就是MDA(KAYA)建模工具。 左侧是需要用到的元素,简单说来包括 1...
  • 最近看到一个特别有意思的开源项目,能把照片自动转化成漫画效果,经过个小时的调试,终于跑通了。正先给大家看下实际效果,我在网上的随便搜了一张帅哥的证件照片试了下。基本上会把脑袋切出来,然后放大眼睛。 ...
  • 近日,TensorFlow模型优化工具包又添一员大将,训练后的精度浮点量化(float16 quantization)工具。 有了它,就能在几乎不损失模型精度的情况下,将模型压缩至一半大小,还能改善CPU和硬件加速器延迟。 这...
  • 新智元报道 来源:GitHub作者:Google Research 编辑:肖琴【新智元导读】谷歌AI团队终于开源了最强NLP模型BERT的代码和预训练模型。从论文发布以来,BERT在NLP业内引起巨大反响,被认为开启了NLP的新时代。BERT的...
  • 第二部分是代码实验部分,对论文中提出的部分实验进行代码实验,包含模型训练,参数量计算,特征图可视化。第三部分是下一步工作,提出一些失败及未实现的想法,来实现不需要训练的即插即用Ghost module。 二、论文...
  • 理解x64代码模型

    千次阅读 2016-04-22 11:42:32
    原作者:Eli Bendersky ... 在编写x64架构代码时一个...这可能是一个不广为人知的议题,但如果想理解编译器生成的x64机器代码,熟悉代码模型是有教育意义的。这与优化及对哪些真正关心性能,从哪怕最小的指令也要抠性能的
  • yolov--10--目标检测模型参数评估指标详解、概念解析 yolov--11--YOLO v3的原版训练记录、mAP、AP、recall、precision、time等评价指标计算 yolov--12--YOLOv3的原理深度剖析和关键点讲解 1、目标检测中...
  • 集成学习-模型融合学习笔记(附Python代码

    万次阅读 多人点赞 2018-09-04 12:57:03
    # 生成500个决策树,详细的参数建议参考官方文档 bag = BaggingClassifier(base_estimator=tree, n_estimators=500, max_samples=1.0, max_features=1.0, bootstrap=True, bootstrap_features=False, n_jobs=1, ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,185
精华内容 28,074
关键字:

代码半参数模型