求解数据公式

  说明:为什么要存在拉普拉斯平滑,因为在P(W|C)中,在C分类的条件下,W为多个特征,但是如果W中存在一个为0的情况,那个整个结果就为0,这样不合理。概率统计,为了是统计在分类条件下,特征的成立数

P(C|W) = —————————— 说明:P为概率,|在C的前提下W的概率, C分类, W多个条件(特征值) P(C):每个文档类别的概率(某文档类别数/文档类别总数) P(W|C):给定类别特征(被预测文档中出现的词)的概率 避免出现次数为0的时候,计算结果直接为0 说明:a指系数一般为1, m为W(多个条件)的个数,NI为每个条件的个数,N为W(多个条件)的总个数 源于古典数学理论,有稳定的分类效率 对缺失数据不太敏感,算法比较简单,常用语文本 使用样本属性独立性假设,与样本属性关联密切。如果训练集准确率不高,会影响结果 # 训练集中词的重要性统计 # 根据训练集转换测试集 二分类的算法评价指标(准确率、精准率、召回率、混淆矩阵、AUC) 预测值 0 预测值 1 F1 = ————————————— = ——————————————————— print("精准率和召回率:

  3)决策树和随机森林

        信息熵:
 说明:log 低数为2,单位比特,H(X)为熵,x为特征具体值,p(x)为该值在x特征值中的概率
 

  说明:随机森林是在决策树的基础上,种植多颗树的方式,只是每一颗树的深度没有决策树那么深

       特征复杂度决定了决策树的深度,不是树的深度越深,就越好的,有可能存在计算不出结果。

       信息熵:是确定树深度的最大值。

       信息增益:得知特征X的信息而使得类Y的信息的不确定性的减少程度。

简化理解和解释,树木可视化 需要很少的数据准备,其他技术通常需要数据归一化 减枝cart算法(决策树API中已经实现) 在当前所有算法中具有极好的准确率 能够有效的运行在大数据集上 能够处理具有高维特征的输入样本中,而且不需要降维 能够评估各个特征在分类问题上的重要性
说明:log 低数为2,单位比特,H(X)为熵,x为特征具体值,p(x)为该值在x特征值中的概率 简化理解和解释,树木可视化 需要很少的数据准备,其他技术通常需要数据归一化 减枝cart算法(决策树API中已经实现) 在当前所有算法中具有极好的准确率 能够有效的运行在大数据集上 能够处理具有高维特征的输入样本中,而且不需要降维 能够评估各个特征在分类问题上的重要性 # 采用DictVectorizer目的是,数据更多是文本类型的,借助dict的方式来处理成0/1的方式 # 网络搜索与交叉验证
(m行, l列)* (l行, n列) = (m行, n列)
w:权重, b偏置项, x:特征数据 b:单个特征是更加通用 通过一个或者多个自变量与因变量之间进行建模的回归分析 其中可以为一个或者多个自变量之间的线性组合(线性回归的一种) 涉及变量为两个或者两个以上

  b、损失函数(最小二乘法)

     损失函数(最小二乘法)(误差的平方和):
 yi:训练样本的真实值, hw(xi):第i个训练样本的特征、组合预测值

  说明:当损失值在最小的时候,说明,函数的拟合状态最好,这种方式,也就更加接近具体的预测轨迹

X:特征值矩阵, Y:目标值矩阵 Xt:转置特征值(行列替换) 特征比较复杂时,不一定能得出结果
w1 = -w1 - α———————————————— || w0 = -w0 - α———————————————— || α:学习速率,需要手动指定 ———————————————— 表示方向

  说明:在求最小损失值的时候,需要不断的求解W(权重值),权重值的求解方式一般为上面两种。求出的值,然后在计算损失值,然后在反过来推导,权重值。如此得出结果,速率越慢当然拟合程度越高,但都是拟合越高越好。

过拟合(训练集和测试集表现不好): 原始特征数量过多,存在一些嘈杂的特征,模型过于复杂是因为模型尝试去兼顾各个测试数据点 进行特征选择,消除一些关联性不大的特征(不好做) 交叉验证(让所有数据进行训练)

  最理想的状态不是第三种,而是第二种。

3、当特征数量n很大时,也比较适用 4、适用于各种类型的模型 1、不需要选择学习率α 3、需要计算(XtX)^(-1), 如果特征数量n很大时,时间复杂度很高,通常n<100000,可以接受 4、只能用于线性模型,不适合逻辑回归模型等其他模型
1、因为线性回归(LinearRegression)容易出现过拟合的情况,所有需要正则化 2、正则化的目的,就是将高幂(x^n,n很大),的权重降到接近于0 3、岭回归为带有正则化的线性回归 4、回归得到的系数更加符合实际,更加可靠,更存在病态数据偏多的研究中存在较大价值
        1、具有l2正则化的线性最小二乘法
 
w:权重, b偏置项, x:特征数据 b:单个特征是更加通用 通过一个或者多个自变量与因变量之间进行建模的回归分析 其中可以为一个或者多个自变量之间的线性组合(线性回归的一种) 涉及变量为两个或者两个以上 (m行, l列)* (l行, n列) = (m行, n列) 损失函数(最小二乘法)(误差的平方和): yi:训练样本的真实值, hw(xi):第i个训练样本的特征、组合预测值 X:特征值矩阵, Y:目标值矩阵 Xt:转置特征值(行列替换) 特征比较复杂时,不一定能得出结果 w1 = -w1 - α———————————————— || w0 = -w0 - α———————————————— || α:学习速率,需要手动指定 ———————————————— 表示方向 yi:预测值 y:真实值 3、当特征数量n很大时,也比较适用 4、适用于各种类型的模型 1、不需要选择学习率α 3、需要计算(XtX)^(-1), 如果特征数量n很大时,时间复杂度很高,通常n<100000,可以接受 4、只能用于线性模型,不适合逻辑回归模型等其他模型 1、因为线性回归(LinearRegression)容易出现过拟合的情况,所有需要正则化 2、正则化的目的,就是将高幂(x^n,n很大),的权重降到接近于0 3、岭回归为带有正则化的线性回归 4、回归得到的系数更加符合实际,更加可靠,更存在病态数据偏多的研究中存在较大价值 1、具有l2正则化的线性最小二乘法 # 数据标准化(目的,特征值差异过大,按比例缩小) # 目标值也要进行标准化(目的,特征值标准化后,特征值值过大在回归算法中,得出的权重值差异过大) # 两次标准化实例的目的,就是不同数据之间的实例化不一样 # 目标值也要转成2维数组(-1,不知道样本数) # 4、线性回归正规算法 1、通过结果可以看出真实值和预测值的差距还是很大的。 2、这是直接通过线性回归的正确公式来算出权重值的结果。 3、为了更好的减少误差,所以采用梯度下降的方式,来重新计算权重值 # 注意这里的预测值是标准化过后的数据,需要转回来 # 4、线性回归梯度下降算法 # 注意这里的预测值是标准化过后的数据,需要转回来 # 4、线性回归正则化算法(岭回归) # alpha为超参数,可以通过网格搜索和交叉验证,来确认alpha的值 # 注意这里的预测值是标准化过后的数据,需要转回来

  说明:从结果可以看出差异并不是很大,那是因为训练次数的原因,可以通过多次的训练来达到效果

g(z) = —————————— 输入:[0,1]区间的概率,默认值0.5作为阈值

   说明:逻辑回归,是算一种二分类算法。比如:是否是猫、狗等。我们不能完全确认,他是否是猫,那就用概率的方式来确认分类。概率值越高说明是,反之否。通过大约阈值来确认分类,这种方式人图像识别中还是比较常用的方式。

与线性回归原理相同,但是由于是分类问题。损失函数不一样。 只能通过梯度下降求解。 hθ(x)为x的概率值
          说明:在均方误差中不存在多个最低点,但是对数似然损失函数,会存在多个低点的情况 cost损失值越小,那么预测的类别精准度更高

   对数似然损失函数表现:(目前没有好的方式去解决确认最低点的问题)

    1、多次随机初始化,多次比较最小值结果

    2、求解过程中,调整学习率

  上面两种方式只是改善,不是真正意义上的解决这个最低点的问题。虽然没有最低点,但是最终结果还是不错的。

  损失函数,表现形式:

  说明:如果真实值为y=1时,当hθ(x)的概率越接近1时,说明损失函数的值越小。图形公式 -log(P)

  说明:如果真是值为y=0时,概率越小,损失值就越小

g(z) = —————————— 输入:[0,1]区间的概率,默认值0.5作为阈值 与线性回归原理相同,但是由于是分类问题。损失函数不一样。 只能通过梯度下降求解。 说明:在均方误差中不存在多个最低点,但是对数似然损失函数,会存在多个低点的情况 cost损失值越小,那么预测的类别精准度更高 C为回归系数默认值1.0

  五、上面说的都是监督学习的算法,下面介绍一种非监督学习的算法(k-mean)

   1)步骤和优缺点

分类个数,一般是知道分类个数的,如果不知道,进行超参数设置 1)随机在数据中抽取K个样本,当做K个类别的中心点 2)计算其余的点到这K个点的距离,每一个样本有K个距离值,从中选出最近的一个距离点作为自己的标记 3)计算着K个族群的平均值,把这K个平均值,与之前的K个中心点进行比较。 如果不同:把K个平均值作为新的中心点,进行计算 采用迭代式算法,直观易懂并且非常实用 容易收敛到局部最优解(多次聚类) 注意:聚类一般是在做分类之前
sci = ——————————— 注:对于每个点i为已聚类数据中的样本,bi为i到其他族群的所有样本的距离 最小值,ai为i到本族群的距离平均值 最终算出所有的样本的轮廓系数平均值
分类个数,一般是知道分类个数的,如果不知道,进行超参数设置 1)随机在数据中抽取K个样本,当做K个类别的中心点 2)计算其余的点到这K个点的距离,每一个样本有K个距离值,从中选出最近的一个距离点作为自己的标记 3)计算着K个族群的平均值,把这K个平均值,与之前的K个中心点进行比较。 如果不同:把K个平均值作为新的中心点,进行计算 采用迭代式算法,直观易懂并且非常实用 容易收敛到局部最优解(多次聚类) 注意:聚类一般是在做分类之前 # 交叉表(特殊分组) # (用户ID, 类别) sci = ——————————— 注:对于每个点i为已聚类数据中的样本,bi为i到其他族群的所有样本的距离 最小值,ai为i到本族群的距离平均值 最终算出所有的样本的轮廓系数平均值
}

根据已知条件,设置函数的方法及步骤是:

1、打开Excel工作表;

2、根据下述已知条件:

可以通过IF函数建立一个嵌套条件函数;

3、在A2单元格输入以下公式

公式表示:A1加上根据A1条件的不同而返回的不同的数值。

1、打开Excel工作表;

2、根据已知条件,判断条件规律,是在一个升序的数列中,返回对应的数值;可以将这组升序数值整理到一个区域,也可以直接在公式中罗列,通过LOOKUP函数返回升序数列中小于条件的最大值所对应的数值。

公式表示:在升序数列D列中,查找比A1数值小的最大值,并返回其对应的E列的数值,然后加上A1

1、打开Excel工作表;

2、根据已知条件判断,返回值与5的倍数有关系,可以建立与5的倍数的关系式。

公式表示:A1单元格数值除以5的整数,加上A1,再加上2 。

}

  数据:工资和年龄(2个特征)

  目标:预测银行会贷款多少钱(标签)

  考虑:工资和年龄都会影响最终银行贷款的结果,那么它们各自有多大的影响?(参数)

  通过图表可以看出随着工资和年龄的增长,贷款额度也随之增长。X1和X2的数量级是不同的,因此需要增加两个因子:θ1x12x2=y ,在已知x1,x2,y的情况下建立回归方程。方程的目标就是求出最合适的θ1、θ2,这样就知道工资和年龄对贷款额度到底有多大的影响。

  X1、X2就是我们的两个特征(年龄、工资),Y是银行最终会借给我们多少钱。

  找到最合适的一条线(想象一个高维)来最好的拟合我们的数据点。(无法满足所有,满足尽可能多的点)

  图中红点是样本数据,想根据给定的数据集拟合一个平面,使得各个样本数据到达平面的误差最小。

  这个图就是机器如何进行预测的(回归)它会根据贷款的历史数据(年龄和工资分别对应于X1与X2)找出来最好的拟合线(面)来进行预测,这样新的数据来了之后直接带入进去就可以得出来该给多少钱了。

(3)进一步整合回归方程

  整合是把偏置项和权重参数项放到了一起(加了个θ0让其都等于1)。

  • 假设θ1是年龄的参数,θ2是工资的参数。
  • + θ2x2 。参数θ1、θ2为权重项,对结果影响较大。θ0是偏置项

  一个传统的神经网络就可以看成多个逻辑回归模型的输出作为另一个逻辑回归模型的输入的“组合模型”。

  因此,讨论神经网络中的偏置项b的作用,就近似等价于讨论逻辑回归模型中的偏置项b的作用。

  逻辑回归模型本质:利用 y = WX + b 这个函数画决策面,其中W为模型参数,也是函数的斜率;b为函数的截距。

  一维情况:W=[1],b=2,y=WX+b得到一个截距为2,斜率为1的直线如下所示:

  二维情况:W=[1 1],b=2,则 y=WX+b得到一个截距为2,斜率为[1 1]的平面如下所示:

  显然y=WX+b这个函数,就是2维/3维/更高维空间的直线/平面/超平面。如果没有偏置项b,则只能在空间里画过原点的直线/平面/超平面。

  因此对于逻辑回归必须加上偏置项b,才能保证分类器可以在空间任何位置画决策面。

  同理,对于多个逻辑回归组成的神经网络,更要加上偏置项b。

  如果隐层有3个节点,那就相当于有3个逻辑回归分类器。这三个分类器各画各的决策面,那一般情况下它们的偏置项b也会各不相同。

  复杂决策边界由三个隐层节点的神经网络画出如下:

  如何机智的为三个分类器(隐节点)分配不同的b呢?或者说如果让模型在训练的过程中,动态的调整三个分类器的b以画出各自最佳的决策面呢?

  那就是先在X的前面加个1,作为偏置项的基底,(此时X就从n维向量变成了n+1维向量,即变成 [1, x1,x2…] ),然后,让每个分类器去训练自己的偏置项权重,所以每个分类器的权重就也变成了n+1维,即[w0,w1,…],其中,w0就是偏置项的权重,所以1*w0就是本分类器的偏置/截距啦。这样,就让截距b这个看似与斜率W不同的参数,都统一到了一个框架下,使得模型在训练的过程中不断调整参数w0,从而达到调整b的目的。

  所以,如果在写神经网络的代码的时候,把偏置项给漏掉了,那么神经网络很有可能变得很差,收敛很慢而且精度差,甚至可能陷入“僵死”状态无法收敛。

  银行的目标得让误差越小越好,这样才能够使得我们的结果是越准确的。

  • 真实值和预测值之间肯定要存在差异——用 ε 来表示该误差。
  • 每一个样本的误差值是不同的:

4、误差规律——独立同分布

  独立同分布(iid,independently identically distribution)在概率统计理论中,指随机过程中,任何时刻的取值都为随机变量,如果这些随机变量服从同一分布,并且互相独立,那么这些随机变量是独立同分布。

  • 误差ε(i)是独立且具有相同分布,并且服从均值为0方差为θ2的高斯分布;
  • 独立:张三和李四一起来贷款,他俩没有关系,即每个样本到拟合平面的距离都不相同;
  • 同分布:他俩都来得是我们假定的同一家银行,所以它在预测的时候是按照同样的方式,数据是在同一个分布下去建模,尽可能来自相同的分布;
  • 高斯分布:银行可能会多给,也可能会少给,但是绝大多数情况下,这个浮动不会太大,极小情况下浮动会比较大(有的多有的少,大概来看,均值为0)。

   误差在0附近浮动的可能性较大,正负差距较大的可能性越来越小。符合概率统计中现实分布情况。

  将(1)式转化为:ε(i) = y(i) - θTx(i) ,即:误差=实际值-预测值,然后带入高斯分布函数(2)式,就将误差项都替换为了x,y。

  p(x;θ)代表:在给定θ的情况下x的取值;

  p(y|x;θ)代表:在给定x的情况下,还给定某种参数θ的情况下,y的概率密度函数。

  由于x和θ是一个定值,所以θTx(i) 可以理解为一个定值C。

  似然函数是一种关于模型中参数的函数,用来表示模型参数中的似然性

  已知样本数据x(x1,x2,...,xn)组合,要使用什么样的参数θ和样本数据组合后,可以恰好得到真实值

  要让误差项越小越好,则要让似然函数越大越好,由此将问题转为求L(θ)的最大值。

  引入似然函数如下:(Π从...到...的积)

  连续型变量相互独立的充要条件是联合概率密度等于边缘概率密度的乘积。因此变量符合独立同分布前提下,联合概率密度等于边缘概率密度的乘积成立。

  p(y(i) | x(i);θ):什么样的x和θ组合完后,能成为y的可能性越大越好。m项的乘积非常难解,难以估计,因此要想办法转为加法。

  对数似然:乘法难解,加法相对容易,对数里面乘法可以转换成加法,因此对式子左右两边取对数。

  首先,取对数不影响函数的单调性,保证输入对应的概率的最大最小值对应似然函数的最值。

  其次,减少计算量,比如联合概率的连乘会变成加法问题,指数亦可。

  最后,概率的连乘将会变成一个很小的值,可能会引起浮点数下溢,尤其是当数据集很大的时候,联合概率会趋向于0,非常不利于之后的计算。依据ln曲线可知,很小的概率(越接近0)经过对数转换会转变为较大的负数,解决下溢问题。

  取对数虽然会改变极值,但不会改变极值点。任务依然是求极值,因此L(θ)和logL(θ)两者是等价的。

(1)公式继续展开化简

  这里要求解是的 θ,因此其他的都可以看作是常数项。 因此可以把看作是m倍的常数项:。

  再观察另一个部分:,exp:高等数学里以自然常数e为底的指数函数,它同时又是航模名词,全称Exponential(指数曲线)。由于给对数取不同的底数只会影响极值,但不会影响极值点。 

  将这一部分底数取e,则与exp(x)的以e为底的指数发生抵消,再将常数项提取出来,可以将公司转成这种累加形式:

  公式到这里就不能继续化简了,毕竟每个人的年龄(x)和每个有多少钱(y)是不同的,因此,必须从第一个样本迭代到第m个样本。最终简化为:

(2)目标:让似然函数越大越好

  之前的目标:x和θ组合完后,成为y的可能性越大越好。因此现在要求得极大值点。A是一个恒为正的常数,B中包含平分因此也是一个正数。因此是两个正数间的减法。

  如要求值越大越好,因此B:必须越小越好。

  现在就将目标转换为求解最小二乘法

  从上面的推导可以得出结论:要求让似然函数越大越好,可转化为求θ取某个值时使J(θ)最小的问题。

  求解最小二乘法的方法一般为两种:矩阵式梯度下降法

  数据集含有m个样本,每个样本有n个特征时:

  • 数据x可以写成m*(n+1)维的矩阵(+1是添加一列1,用于与截断b相乘);
  • θ则为n+1维的列向量(+1是截断b);
  • y为m维的列向量代表每m个样本结果的预测值。

  矩阵式的推导如下所示:

  让J(θ)对θ求偏导,当偏导等于零时,则这个θ就是极值点。XT代表X矩阵的转置,XT与X的乘积一定会得到一个对称阵。

  另外存在公式: θTXTXθ 等于 2XTXθ。

  XTX的逆矩阵为:(XTX)-1 ,将这个逆矩阵分别乘到偏导结果等式两边,左边期望是零,推导得到:

  这种方法存在的问题:不存在学习的过程;矩阵求逆不是一个必然成功的行为(存在不可逆);

2、梯度下降法(GD)

  对于多元线性回归来说,拟合函数为:

  由于目标函数是由m个样本累加得到的,因此可以求一个平均得到损失函数:

  1)对损失函数求偏导数,批量梯度下降:

  容易得到最优解,但是每次考虑所有样本,执行速度很慢。

  2)每次只用一个样本,随机梯度下降:

  去除累加操作,每次抽样一个样本来计算,速度快,结果不准。

  3)每次更新选择一部分数据,小批量梯度下降法:

(1)为什么要使用梯度下降

  当得到一个目标函数时,通常是不能直接求解的,线性回归能求出结果在机器学习中是一个特例。

  机器学习常规套路:交给机器一堆数据,然后告诉它使用什么样的学习方式(目标函数),然后它朝着这个方向去学习。

  算法优化:一步步完成迭代,每次优化一点点,积累起来就能获得大成功。

  在一元函数中叫做求导,在多元函数中就叫做求梯度。梯度下降是一个最优化算法,通俗的来讲也就是沿着梯度下降的方向来求出一个函数的极小值。比如一元函数中,加速度减少的方向,总会找到一个点使速度达到最小。

  通常情况下,数据不可能完全符合我们的要求,所以很难用矩阵去求解,所以机器学习就应该用学习的方法,因此我们采用梯度下降,不断迭代,沿着梯度下降的方向来移动,求出极小值。

  梯度下降法包括批量梯度下降法和随机梯度下降法(SGD)以及二者的结合mini批量下降法(通常与SGD认为是同一种,常用于深度学习中)。

  对于梯度下降,我们可以形象地理解为一个人下山的过程。假设现在有一个人在山上,现在他想要走下山,但是他不知道山底在哪个方向,怎么办呢?显然我们可以想到的是,一定要沿着山高度下降的地方走,不然就不是下山而是上山了。山高度下降的方向有很多,选哪个方向呢?这个人比较有冒险精神,他选择最陡峭的方向,即山高度下降最快的方向。现在确定了方向,就要开始下山了。

  又有一个问题来了,在下山的过程中,最开始选定的方向并不总是高度下降最快的地方。这个人比较聪明,他每次都选定一段距离,每走一段距离之后,就重新确定当前所在位置的高度下降最快的地方。这样,这个人每次下山的方向都可以近似看作是每个距离段内高度下降最快的地方。

  现在我们将这个思想引入线性回归,在线性回归中,我们要找到参数矩阵  使得损失函数  最小。如果把损失函数  看作是这座山,山底不就是损失函数最小的地方吗,那我们求解参数矩阵  的过程,就是人走到山底的过程。

  如图所示,这是一元线性回归(即假设函数  )中的损失函数图像,一开始我们选定一个起始点(通常是  ),然后沿着这个起始点开始,沿着这一点处损失函数下降最快的方向(即该点的梯度负方向)走一小步,走完一步之后,到达第二个点,然后我们又沿着第二个点的梯度负方向走一小步,到达第三个点,以此类推,直到我们到底局部最低点。为什么是局部最低点呢?因为我们到达的这个点的梯度为 0 向量(通常是和 0 向量相差在某一个可接受的范围内),这说明这个点是损失函数的极小值点,并不一定是最小值点。 

  从梯度下降法的思想,我们可以看到,最后得到的局部最低点与我们选定的起始点有关。通常情况下,如果起始点不同,最后得到的局部最低点也会不一样。

  每次更新参数的操作:

  其中α学习率(步长),对结果会产生巨大的影响,调节学习率这个超参数是建模中的重要内容。

  选择方法:从小的开始,不行再小。

  批处理数量:32、64、128比较常用,很多时候还要考虑内存和效率。

  因为J(θ)是凸函数,所以GD求出的最优解是全局最优解。批量梯度下降法是求出整个数据集的梯度,再去更新θ,所以每次迭代都是在求全局最优解。

  写一个prepare_for_training函数,对数据进行函数变换、标准化等操作。最后返回处理过的数据,以及均值和标准差。

  写一个LinearRegression类,包含线性回归相关的方法。

1.对数据进行预处理操作 2.先得到所有的特征个数 # 获取多少个列作为特征量 训练模块,执行梯度下降 梯度下降,实际迭代模块 梯度下降参数更新计算方法(核心代码,矩阵运算) # 参差=预测值-真实值 # 参差=预测值-真实值 # 如果处理的是一维数组,则得到的是两数组的內积;如果处理的是二维数组(矩阵),则得到的是矩阵积 用训练的数据模型,预测得到回归值结果

  对 LinearRegression类进行建模、预测、计算损失等。

"""单变量线性回归""" # 得到训练和测试数据集

  开始时的损失 463505
  训练后的损失 26.332

  多特征建模,观察与单特征建模效果对比。

  Plotly 是一款用来做数据分析和可视化的在线平台,功能非常强大,可以在线绘制很多图形比如条形图、散点图、饼图、直方图等等。而且还是支持在线编辑,以及多种语言python、javascript、matlab、R等许多API。使用Plotly可以画出很多媲美Tableau的高质量图:

  把mode设置为markers就是散点图,然后marker里面设置一组参数,比如颜色的随机范围,散点的大小,还有图例等等。

"""单变量线性回归""" # 得到训练和测试数据集
}

我要回帖

更多关于 韦达定理公式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信