文章目录

  • 1、引言
  • 2、数据可视化
  • 3、线性回归
    • 3.1 基于自变量与因变量的线性回归
      • 3.1.1 最小二乘法
      • 3.1.2 梯度下降法
      • 3.2 基于异常检测的线性回归
  • 4、主成分分析
    • 4.1 原理推导
    • 4.2 归一化问题
  • 5、回归分析的局限性
  • 6、总结
  • 7、资料
  • 8、练习
  • 参考文献

1、引言

  真实数据集中不同维度的数据通常具有高度的相关性,这是因为不同的属性往往是由相同的基础过程以密切相关的方式产生的。在古典统计学中,这被称为——回归建模,一种参数化的相关性分析。
  一类相关性分析试图通过其他变量预测单独的属性值,另一类方法用一些潜在变量来代表整个数据。前者的代表是 线性回归,后者一个典型的例子是 主成分分析。本文将会用这两种典型的线性相关分析方法进行异常检测。

  需要明确的是,这里有两个重要的假设:

  假设一:近似线性相关假设。线性相关假设是使用两种模型进行异常检测的重要理论基础。

  假设二:子空间假设。子空间假设认为数据是镶嵌在低维子空间中的,线性方法的目的是找到合适的低维子空间使得异常点(o)在其中区别于正常点(n)。

  基于这两点假设,在异常检测的第一阶段,为了确定特定的模型是否适合特定的数据集,对数据进行探索性和可视化分析是非常关键的。

2、数据可视化

  以breast-cancer-unsupervised-ad数据集为例做一些简单的数据可视化。

#coding:utf-8
#导入warnings包,利用过滤器来实现忽略警告语句。
import warnings
warnings.filterwarnings('ignore')import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import missingno as msno
## 1) 载入训练集和测试集;
path = 'dataverse_files/'
f=open(path+'breast-cancer-unsupervised-ad.csv')
Train_data = pd.read_csv(f)
## 2) 简略观察数据(head()+shape)
Train_data.head()

## 2) 简略观察数据(tail()+shape)
Train_data.tail()

## 1) 通过describe()来熟悉数据的相关统计量
Train_data.describe()

## 2) 通过info()来熟悉数据类型
Train_data.info()

numeric_features = ['f' + str(i) for i in range(30)]## 1) 相关性分析
numeric = Train_data[numeric_features]
correlation = numeric.corr()f , ax = plt.subplots(figsize = (14, 14))sns.heatmap(correlation,square = True)
plt.title('Correlation of Numeric Features with Price',y=1,size=16)
plt.show())

## 3) 每个数字特征得分布可视化
f = pd.melt(Train_data, value_vars=numeric_features)
g = sns.FacetGrid(f, col="variable",  col_wrap=6, sharex=False, sharey=False)
g = g.map(sns.distplot, "value", hist=False, rug=True)

#变量两两之间的相关性
sns.set()
sns.pairplot(Train_data[numeric_features],size = 2 ,kind ='scatter',diag_kind='kde')
plt.savefig('correlation.png')
plt.show()

部分展示

#数据降维可视化
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, init='pca', random_state=0)
result = tsne.fit_transform(numeric)
x_min, x_max = np.min(result, 0), np.max(result, 0)
result = (result - x_min) / (x_max - x_min)
label = Train_data['label']
fig = plt.figure(figsize = (7, 7))
#f , ax = plt.subplots()
color = {'o':0, 'n':7}
for i in range(result.shape[0]):plt.text(result[i, 0], result[i, 1], str(label[i]),color=plt.cm.Set1(color[label[i]] / 10.),fontdict={'weight': 'bold', 'size': 9})
plt.xticks([])
plt.yticks([])
plt.title('Visualization of data dimension reduction')

3、线性回归

  在线性回归中,我们假设不同维度的变量具有一定的相关性,并可以通过一个相关系数矩阵进行衡量。因此对于特定的观测值,可以通过线性方程组来建模。在实际应用中,观测值的数量往往远大于数据的维度,导致线性方程组是一个超定方程,不能直接求解。因此需要通过优化的方法,最小化模型预测值与真实数据点的误差。

  线性回归是统计学中一个重要的应用,这个重要的应用往往是指通过一系列自变量去预测一个特殊因变量的值。在这种情况下,异常值是根据其他自变量对因变量的影响来定义的,而自变量之间相互关系中的异常则不那么重要。这里的异常点检测主要用于数据降噪,避免异常点的出现对模型性能的影响,因而这里关注的兴趣点主要是正常值(n)。

  而我们通常所说的异常检测中并不会对任何变量给与特殊对待,异常值的定义是基于基础数据点的整体分布,这里我们关注的兴趣点主要是异常值(o)。

广义的回归建模只是一种工具,这种工具既可以用来进行数据降噪也可以进行异常点检测。

3.1 基于自变量与因变量的线性回归

3.1.1 最小二乘法

  为了简单起见,这里我们一元线性回归为例:

Y=∑i=1dai⋅Xi+ad+1Y=\sum_{i=1}^{d} a_{i} \cdot X_{i}+a_{d+1}Y=i=1∑d​ai​⋅Xi​+ad+1​

  变量Y为因变量,也就是我们要预测的值;X1...XdX_{1}...X_{d}X1​...Xd​为一系列因变量,也就是输入值。系数a1...ad+1a_{1}...a_{d+1}a1​...ad+1​为要学习的参数。假设数据共包含NNN个样本,第jjj个样本包含的数据为xj1...xjdx_{j1}...x_{jd}xj1​...xjd​和yjy_{j}yj​,带入式(1)如下式所示:

yj=∑i=1dai⋅xji+ad+1+ϵjy_{j}=\sum_{i=1}^{d} a_{i} \cdot x_{j i}+a_{d+1}+\epsilon_{j}yj​=i=1∑d​ai​⋅xji​+ad+1​+ϵj​

  这里ϵj\epsilon_{j}ϵj​为第jjj个样本的误差。以YYY 代表 N×1N \times 1N×1 的因变量矩阵(y1...yN)T{(y_{1}...y_{N})}^{T}(y1​...yN​)T,即样本中的真实值;以UUU代表N×(d+1)N \times (d+1)N×(d+1)的自变量矩阵,其中第jjj行为(xj1...xjd,1)(x_{j1}...x_{jd}, 1)(xj1​...xjd​,1);以AAA 代表 (d+1)×1(d+1) \times 1(d+1)×1 的系数矩阵(a1...ad+1)T(a_{1}...a_{d+1})^{T}(a1​...ad+1​)T。则模型可表示为:
f(U,A)=U⋅Af(U, A) = U \cdot Af(U,A)=U⋅A

  定义目标函数为:

L(A)=12∥Y−U⋅A∥2L(A) = \frac{1}{2}{\left\| {Y - U \cdot A} \right\|^2} L(A)=21​∥Y−U⋅A∥2

  目标函数是关于AAA的凸函数,其对AAA求偏导为:

∂L(A)∂A=12∂∥Y−U⋅A∥2∂A=−UT(Y−U⋅A)\frac{{\partial L(A)}}{{\partial A}} = \frac{1}{2}\frac{{\partial {{\left\| {Y - U \cdot A} \right\|}^2}}}{{\partial A}} = - {U^T}(Y - U \cdot A)∂A∂L(A)​=21​∂A∂∥Y−U⋅A∥2​=−UT(Y−U⋅A)

  令∂L(A)∂A=0\frac{{\partial L(A)}}{{\partial A}}=0∂A∂L(A)​=0,得到最优参数为:

A=(UT⋅U)−1⋅(UT⋅Y)A=\left(U^{T} \cdot U\right)^{-1} \cdot\left(U^{T} \cdot Y\right)A=(UT⋅U)−1⋅(UT⋅Y)

  这种求解线性回归参数的方法也叫最小二乘法

  最小二乘法要求矩阵 UT⋅UU^{T} \cdot UUT⋅U 可逆,即UT⋅UU^{T} \cdot UUT⋅U是满秩的。当UT⋅UU^{T} \cdot UUT⋅U不可逆时可以通过两种方法进行参数估计,一种先使用主成分分析等方法来预处理数据,消除不同特征之间的相关性,然后再使用最小二乘法。第二种方法是使用梯度下降法

3.1.2 梯度下降法

数据集

  监督学习一般靠数据驱动。我们通常收集一系列的真实数据,例如多栋房屋的真实售出价格和它们对应的面积和房龄。我们希望在这个数据上面寻找模型参数来使模型的预测价格与真实价格的误差最小。在机器学习术语里,该数据集被称为训练数据集(training data set)或训练集(training set),通常还应该有一个用于防止过拟合的交叉验证集和一个用于评估模型性能的测试集(test set)。一栋房屋被称为一个样本(sample),其真实售出价格叫作标签(label),用来预测标签的两个因素叫作特征(feature)。

损失函数

  如果把线性回归看作是一个优化问题,那么我们要优化的目标就是损失函数。损失函数是用来衡量样本误差的函数,我们的优化目标是要求得在误差最小的情况下模型参数的值。这里强调一下损失函数和代价函数的区别:

注意:
**Loss Function(损失函数):**the error for single training example;
**Cost Function(代价函数):**the average of the loss functions of the entire training set;

  线性回归常用的损失函数是均方误差,表达式为:

l(i)(w,b)=12(y^(i)−y(i))2l^{(i)}(\mathbf{w}, b)=\frac{1}{2}\left(\hat{y}^{(i)}-y^{(i)}\right)^{2}l(i)(w,b)=21​(y^​(i)−y(i))2

L(w,b)=1n∑i=1nl(i)(w,b)=1n∑i=1n12(w⊤x(i)+b−y(i))2L(\mathbf{w}, b)=\frac{1}{n} \sum_{i=1}^{n} l^{(i)}(\mathbf{w}, b)=\frac{1}{n} \sum_{i=1}^{n} \frac{1}{2}\left(\mathbf{w}^{\top} \mathbf{x}^{(i)}+b-y^{(i)}\right)^{2} L(w,b)=n1​i=1∑n​l(i)(w,b)=n1​i=1∑n​21​(w⊤x(i)+b−y(i))2
  其中 y^\hat{y}y^​ 为预测值,yyy 为真实值。
优化算法 - 随机梯度下降

  当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来。这类解叫作解析解(analytical solution)。本节使用的线性回归和平方误差刚好属于这个范畴。然而,大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。这类解叫作数值解(numerical solution)。

  在求数值解的优化算法中,小批量随机梯度下降(mini-batch stochastic gradient descent)被广泛使用。它的算法很简单:先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch),然后求小批量中数据样本的平均损失和有关模型参数的导数(梯度),最后用此结果与预先设定的学习率的乘积作为模型参数在本次迭代的减小量。如下式所示:

(w,b)←(w,b)−η∣B∣∑i∈B∂(w,b)l(i)(w,b)(\mathbf{w}, b) \leftarrow(\mathbf{w}, b)-\frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \partial_{(\mathbf{w}, b)} l^{(i)}(\mathbf{w}, b) (w,b)←(w,b)−∣B∣η​i∈B∑​∂(w,b)​l(i)(w,b)

学习率(η\etaη): 代表在每次优化中,能够学习的步长的大小
批量大小(BBB): 是小批量计算中的批量大小batch size

3.2 基于异常检测的线性回归

  前一节讨论了这样一种情况:即一个特定的变量被认为是特殊的,最优平面是通过最小化该特殊变量的均方误差而确定的。而我们通常所说的异常检测中并不会对任何变量给与特殊对待,异常值的定义是基于基础数据点的整体分布,因此需要采用一种更一般的回归建模:即以相似的方式对待所有变量,通过最小化数据对该平面的投影误差确定最佳回归平面。在这种情况下,假设我们有一组变量 X1…XdX_{1}… X_{d}X1​…Xd​, 对应的回归平面如下:

a1⋅X1+…+ad⋅Xd+ad+1=0a_{1} \cdot X_{1}+\ldots+a_{d} \cdot X_{d}+a_{d+1}=0a1​⋅X1​+…+ad​⋅Xd​+ad+1​=0

  为了后续计算的方便,对参数进行如下约束:
∑i=1dai2=1\sum\limits_{i = 1}^d {a_i^2 = 1} i=1∑d​ai2​=1
  以L2L_{2}L2​范数作为目标函数:
L=∥U⋅A∥2L = {\left\| {U \cdot A} \right\|_2}L=∥U⋅A∥2​

  这样的一个问题可以通过主成分分析方法得到有效解决,我们会单独用一个部分进行讨论。

4、主成分分析

  上一节的最小二乘法试图找到一个与数据具有最佳匹配 (d−1)(d−1)(d−1) 维超平面。主成分分析方法可用于解决这一问题的广义版本。具体来说,它可以找到任意 k(k<d)k( k<d )k(k<d) 维的最优表示超平面,从而使平方投影误差最小化。

4.1 原理推导

  对于 ddd 维,包含 NNN 个样本的数据,用 RiR_{i}Ri​ 表示其中第 iii 行为:[xi1...xid][x_{i1}... x_{id}][xi1​...xid​]。由此可以得到 d×dd \times dd×d 的协方差矩阵(标准的PCA应当计算相关系数矩阵,即对数据进行均值为0方差为1的标准化处理,而协方差矩阵只需要减去均值即可):

Σ=(R−Rˉ)T⋅(R−Rˉ)Σ = (R - \bar{R})^{T} \cdot (R - \bar{R}) Σ=(R−Rˉ)T⋅(R−Rˉ)

  易知协方差矩阵 ΣΣΣ 是对称并且半正定的,因此可以进行相似对角化:

Σ=P⋅D⋅PTΣ = P \cdot D \cdot P^{T}Σ=P⋅D⋅PT

  这里的 DDD 为对角矩阵,对角元素为特征值;PPP 为标准正交矩阵,每一行为对应的特征向量;这些标准正交向量提供了数据应该投影的轴线方向。与异常检测相关的主成分分析的主要性质如下:

  • 如果前 kkk 的特征向量选定之后(根据最大的kkk个特征值),由这些特征向量定义的 kkk 维超平面是在所有维度为 kkk 的超平面中,所有数据点到它的均方距离尽可能小的平面。

  • 如果将数据转换为与正交特征向量对应的轴系,则转换后的数据沿每个特征向量维的方差等于相应的特征值。在这种新表示中,转换后的数据的协方差为0。

  • 由于沿特征值小的特征向量的转换数据的方差很低,因此沿这些方向的变换数据与平均值的显着偏差可能表示离群值。

  需要注意的是,相比2.2节的内容,这里提供了一个更加普遍的解决方法。2.2中的内容可以归为主成分分析中只保留最大特征值对应的特征向量的情况。

  在得到这些特征值和特征向量之后,可以将数据转换到新的坐标系中。以 Y1...YNY_{1}...Y_{N}Y1​...YN​ 表示新坐标系中的数据,这些数据可以通过原始向量 RiR_{i}Ri​ 与包含新轴系的标准正交特征向量矩阵 PPP 的乘积来实现。
Yi=Ri⋅P{Y_i} = {R_i} \cdot PYi​=Ri​⋅P

  在许多涉及高维数据集的真实场景中,很大一部分特征值往往非常接近于零。这意味着大多数数据都沿着一个低维的子空间排列。从异常检测的角度来看,这是非常方便的,因为离这些投影方向非常远的观测值可以被假定为离群值。例如,对于特征值较小(方差较小)的特征向量 jjj,第 iii 条记录的 yijy_{ij}yij​ 与 ykjy_{kj}ykj​ 的其他值的偏差较大,说明有离群行为。这是因为当jjj固定而kkk变化时,ykjy_{kj}ykj​ 的值应当变化不大。因此,yijy_{ij}yij​ 值是不常见的。

  在不选取任何特定的 kkk 维集合的情况下,一种更精确的异常检测建模方法是使用特征值来计算数据点沿每个主分量方向到质心的归一化距离。设 eje_{j}ej​为第 jjj 个特征向量,λjλ_{j}λj​ 为沿该方向的方差(特征值)。数据点Xˉ\bar{X}Xˉ相对于对数据质心$\bar{\mu} $的总体归一化异常得分可以由下式给出:

Score⁡(Xˉ)=∑j=1d∣(Xˉ−μˉ)⋅eˉj∣2λjS \operatorname{core}(\bar{X})=\sum_{j=1}^{d} \frac{\left|(\bar{X}-\bar{\mu}) \cdot \bar{e}_{j}\right|^{2}}{\lambda_{j}}Score(Xˉ)=j=1∑d​λj​∣∣​(Xˉ−μˉ​)⋅eˉj​∣∣​2​

  值得注意的是,对异常得分的大部分贡献是由 λjλ_{j}λj​ 值较小的主成分的偏差提供的,这一点上文中有提及过。主成分分析比因变量回归能更稳定地处理少数异常值的存在。这是因为主成分分析是根据最优超平面来计算误差的,而不是一个特定的变量。当数据中加入更多的离群点时,最优超平面的变化通常不会大到影响离群点的选择。因此,这种方法更有可能选择正确的异常值,因为回归模型一开始就更准确。

4.2 归一化问题

  当不同维度的尺度差别较大时,使用 PCAPCAPCA 有时并不能得到直观有效的结果。例如,考虑一个包含年龄和工资等属性的人口统计数据集。工资属性的范围可能是几万,而年龄属性几乎总是小于100,使用主成分分析会导致主成分被高方差属性所控制。对于一个只包含年龄和工资的二维数据集,最大的特征向量几乎与工资轴平行,这会降低异常点检测过程的有效性。因此,一个自然的解决方案是对数据进行均值为0方差为1的标准化处理。这隐含地导致在主成分分析中使用相关矩阵而不是协方差矩阵。当然,这个问题并不是线性建模所独有的,对于大多数异常检测算法,都需要使用这样的预处理。

5、回归分析的局限性

  回归分析作为检测离群值的工具有一些局限性。这些缺点中最重要的是在本章的一开始就讨论了,其中探讨了回归分析的数据特定性质。特别是,为了使回归分析技术有效,数据需要高度相关,并沿着低维子空间对齐。当数据不相关,但在某些区域高度聚集时,这种方法可能不会有效。

  另一个相关的问题是,数据中的相关性在本质上可能不是全局性的。最近的一些分析观察**[1]**表明,子空间相关性是特定于数据的特定位置的。在这种情况下,由主成分分析发现的全局子空间对于异常检测是次优的。因此,为了创建更一般的局部子空间模型,有时将线性模型与邻近模型(在后续章节中讨论)结合起来是有用的。这将是高维和子空间异常检测的主题,将在后续章节详细讨论。

6、总结

  真实数据中,数据不同属性之间往往具有显著的相关性。在这种情况下,线性建模可以提供一种有效的工具来从底层数据中移除异常值或者进行异常检测。对于其他基于因变量回归的应用,线性建模是一种工具,去除异常值对于提高此类应用的性能是非常重要的。在大多数情况下,主成分分析提供了去除异常值和进行异常检测最有效的方法,因为它对存在少数异常值的数据更有鲁棒性。

7、资料

数据集

8、练习

1.使用pyod库生成example并使用该库的pca模块进行检测

from pyod.utils.data import evaluate_print,generate_data# 1)生成example
contamination = 0.1  # percentage of outliers
n_train = 200  # number of training points
n_test = 100  # number of testing pointsX_train, y_train, X_test, y_test = generate_data(n_train=n_train, n_test=n_test, contamination=contamination)
#2)PCA降维可视化
from pyod.models.pca import PCA
from pyod.utils.example import visualize
clf_name='PCA'
clf = PCA()
clf.fit(X_train)## 返回训练数据的标签和分值
y_train_pred = clf.labels_  # (0表示正常值,1表示异常值)
y_train_scores = clf.decision_scores_  # 分值越大越异常## 用训练好的数据预测未知数据中的异常值
y_test_pred = clf.predict(X_test)
y_test_scores = clf.decision_function(X_test)# evaluate and print the results
print("\nOn Training Data:")
evaluate_print(clf_name, y_train, y_train_scores)
print("\nOn Test Data:")
evaluate_print(clf_name, y_test, y_test_scores)
visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,y_test_pred, show_figure=True, save_figure=True)

参考文献

[1]:Outlier Analysis Charu C. Aggarwal

[2]:Anomaly Detection: A Survey VARUN CHANDOLA, ARINDAM BANERJEE, and VIPIN KUMAR University of Minnesota

[3]:Outlier Analysis Charu C. Aggarwal

[4]:Anomaly Detection: A Tutorial

[5]:Data Mining Concepts and Techniques Third Edition

异常检测——线性模型相关推荐

  1. 【Datawhale第25期组队学习】Task03:基于线性模型的异常检测

    Taks03 基于线性模型的异常检测 文章目录 Taks03 基于线性模型的异常检测 0 写在前面 1 概述 2 线性回归 2.1 基于自变量与因变量的线性回归 2.1.1梯度下降法优化目标函数 2. ...

  2. CMU赵越 关于异常检测的分享!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:赵越,卡内基梅隆大学,Datawhale特邀 作者信息 知乎微调: ...

  3. 【机器学习基础】关于异常检测的分享!

    作者:赵越,卡内基梅隆大学,Datawhale特邀 作者信息 知乎微调:https://www.zhihu.com/people/breaknever 内容概括 1.什么是异常检测? 2.异常检测有什 ...

  4. 时间序列异常检测 EGADS Surus iForest

    北京站 | NVIDIA DLI深度学习培训 2018年1月26日 NVIDIA 深度学习学院 带你快速进入火热的DL领域 阅读全文                           正文共3483 ...

  5. 异常检测方法——DBSCAN、孤立森林、OneClassSVM、LOF、同比环比、正态分布、箱线图

    异常检测方法 基于时间序列分析 同比环比 基于统计 单特征且符合正态分布 基于统计 箱线图 基于聚类 DBSCAN 基于树模型 孤立森林 基于线性模型 OneClassSVM 基于密度 LOF 异常检 ...

  6. 【时序异常检测翻译】1.DeepAnT: A Deep Learning Approach for Unsupervised Anomaly Detection in Time Series

    DeepAnT:一种用于时间序列中无监督异常检测的深度学习方法 摘要 传统的基于距离和密度的异常检测技术无法检测流数据中常见的周期性和季节性点异常,在当前物联网时代,时间序列异常检测存在很大差距.为了 ...

  7. 异常检测——5月(task1)

    task1的学习分为两部分 1.了解异常检测相关的基本概念. 2.学习异常检测的基本方法. 1.异常检测的基本概念 什么是异常检测? 按字面意思理解:异常检测就是识别与正常数据不同的数据,与预期行为差 ...

  8. 读书笔记《Outlier Analysis》 第八章 分类、文本和混合属性中的异常检测

    1.引言 前面讨论的都是数值数据,然而,在现实生活生成中,还有很多其他类型的数据,如性别.种族.邮编.人员和实体的名称.IP地址等.通常处理这些数据更有挑战,因为难以以均匀和一致的方式来处理各种类型的 ...

  9. 数据异常检测方法以及实际应用

    转载于: 已获得作者同意转载 关于数据的异常检测,看这一篇就够了 - 携程技术中心的文章 - 知乎 https://zhuanlan.zhihu.com/p/65023844 文章目录 前言 一.应用 ...

  10. 轨迹数据之数据清洗以及异常检测

    轨迹数据之数据清洗以及异常检测 空间轨迹是一个(x,y)点的序列,每个点都有一个时间戳.因为轨迹通常是由传感器测量的,所以它们不可避免地会出现一些错误,需要对数据进行平滑化处理. 此外,司机绕路或者交 ...

最新文章

  1. jquery 判断一个对象是否存在
  2. 谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
  3. 第五期 IP数据包结构和OSI第三层网络层
  4. 天梯赛 L2-005 集合相似度 (set容器)
  5. STL-vector容器
  6. 我的NVIDIA开发者之旅——Caffe教程(3)使用sklearn和caffe进行简单逻辑回归实践
  7. linux服务器一键可视化,安装宝塔教程
  8. STATA进行回归分析时,自变量是分类变量,如何设置哑变量?
  9. 解决执行hive语句时出现虚拟内存不够的问题
  10. 最新hexo+github搭建个人博客详细教程(二)——关于博客的美化
  11. GP技术的展望——道生一,一生二
  12. 会员权益体系内容设计维度
  13. rjs 合并压缩完 js 后 js 不压缩的问题
  14. 使用 Tkinter 制作记事本
  15. python的认识PPT
  16. 宝宝取名要考虑五行八字吗
  17. 下列不属于php的是,下列选项中不属于PHP中跳转的语句是 答案:goto语句
  18. 数据科学与大数据技术与计算机科学与技术哪个好
  19. IT之路——入门以后
  20. 追忆那些昙花一现的P2P平台

热门文章

  1. 短视频SDK用于旅游行业
  2. Pandoc+TeXLive实现Markdown转PDF
  3. 安科瑞导轨表DDS/DTS/DTZ的功能特点
  4. sparkStreaming常见问题
  5. Mongodb节点同步失败状态“ RECOVERING ”恢复
  6. arcengine 加载地图不显示_Devexpress使用后arcengine地图加载不能全图显示
  7. rxjava背压_Rx系列第十八篇:RxJava之背压策略
  8. Quadro专业显卡与Geforce游戏显卡区别在哪?
  9. 高频java基础面试题
  10. Millet谷仓对电商的三大革命