Functional Mechanism: Regression Analysis under Differential Privacy

1. 摘要

差分隐私是一种能在保护隐私的同时发布敏感数据的方法。

目前,已经提出了很多种方法将差分隐私应用到回归分析中。但是,这些方法要么只能在某些非标准类型的回归中使用,

要么就无法达到足够的精度。

于是,为了解决上面的两个问题,作者提出了函数机制,并将它应用到了线性回归和 logistic 回归上。

那么函数机制有什么特别之处呢?现有的方法都是直接扰动最终的结果,而函数机制是在目标函数上进行扰动。

2. 介绍

2.1 函数机制的设计难点

  1. 扰动目标函数比扰动标量要论难的多
  2. 直接在目标函数的系数上加人噪声很容易导致注入了过量的噪声,从而导致函数无法收敛
  3. 部分目标函数被扰动后可能失效,比如产生了无界的结果,或者多个局部最优。

2.2 函数机制的优点

  • 对于线性回归和 logistic 回归,无论训练集的规模是多少,加入的噪声量是恒定的。
  • 在 ϵ\epsilonϵ - differential privacy上就能实现,不需要使用松弛化项 δ\deltaδ

3. 准备工作

3.1 线性回归

线性回归假设目标值和特征之间线性相关,即可以通过多个特征来预测目标值。线性回归可以由以下公式表示:
y^=ωx+b(线性回归的一般表示)\widehat{y} = \omega x + b (线性回归的一般表示) y​=ωx+b(线性回归的一般表示)
其中,ω\omegaω 是权重,b是偏移量。

线性回归的一个经典例子就是房价预测,使用占地面积,地段,房龄等特征来预测房价

线性回归使用均方误差来做损失函数,用梯度下降法来不断修正参数,使得预测结果变得越来越精确。

线性回归损失函数为 L(ω,b)=1n∑i=1n(ωxi+b−yi)2L(\omega,b) =\frac{1}{n}\sum_{i=1}^n(\omega x_i + b - y_i)^2L(ω,b)=n1​∑i=1n​(ωxi​+b−yi​)2

线性回归的核心思路就是通过梯度下降求解损失函数最小时的 ω∗和b∗\omega ^* 和 b^*ω∗和b∗
(ω∗,b∗)=argmin(ω,b)∑i=1n(ωxi+b−yi)2(\omega ^*,b^*) = argmin(\omega,b)\sum_{i=1}^n(\omega x_i + b - y_i)^2 (ω∗,b∗)=argmin(ω,b)i=1∑n​(ωxi​+b−yi​)2

3.2 Logistic 回归

Logistic 回归常用于分类问题。它使用sigmoid函数将原函数转化成一个值在 (0,1)(0,1)(0,1) 之间的分布。例如,我们可以将预测值大于 0.50.50.5 的个体分为一类,小于等于 0.50.50.5 的个体分为第二类。Logistic 的一般公式为:y^=eωx1+eωx\widehat{y}=\frac{e^{\omega x}}{1+e^{\omega x}}y​=1+eωxeωx​

和线性回归不同的是,Logistic 回归的损失函数为对数损失函数。公式表示如下:
L(ω,b)=−[ylogy^+(1−y)log(1−y^)]L(\omega,b) = -[y{\,}log{\,}\widehat{y}+(1-y)log(1-\widehat{y})] L(ω,b)=−[ylogy​+(1−y)log(1−y​)]
该损失函数可用分段函数表示为
L(ω,b)={−log(y^)y=1−log(1−y^)y=0L(\omega,b) =\left\{ \begin{matrix} -log({\,}\widehat{y}){\,} \quad \quad \quad y=1 \\ -log({\,}1-\widehat{y}){\,}{\,} \quad y=0 \end{matrix} \right. L(ω,b)={−log(y​)y=1−log(1−y​)y=0​

Logistic 回归通过最小化损失函数来实现更精准的分类。

3.3 ϵ\epsilonϵ- Differential Privacy

差分隐私使查询随机化,让攻击者无法判断某条记录是否在数据集中。

如果一个随机化算法 A\mathcal{A}A 满足 $\epsilon $- Differential Privacy,那么 AAA 在任意两个相邻数据集 D1D1D1 和 D2D2D2 上的输出满足:
Pr[A(D1)=O]≤eϵ⋅Pr[A(D2)=O]Pr[\mathcal{A}(D_1) = O ]{\,}\le e^\epsilon\cdot Pr[\mathcal{A}(D_2) = O] Pr[A(D1​)=O]≤eϵ⋅Pr[A(D2​)=O]
其中 OOO 表示输出的结果 ,PrPrPr 表示概率。

ϵ\epsilonϵ为隐私保护强度,ϵ\epsilonϵ越大,数据可用性越高,隐私保护强度越低。反之亦然。

3.4 拉普拉斯机制

实现差分隐私最简单的方式就是将拉普拉斯噪声注入到查询的结果中。

设查询为 f(x)f(x)f(x) ,扰动后的查询为 F(x)F(x)F(x) ,那么 F(x)=f(x)+Lap(sϵ)F(x) = f(x){\,}+Lap(\frac{s}{\epsilon})F(x)=f(x)+Lap(ϵs​)

其中,Lap(sϵ)Lap(\frac{s}{\epsilon})Lap(ϵs​) 是满足拉普拉斯分布的噪声。

sss 为全局敏感度,设 D1D1D1 和 D2D2D2 是两个相差只有一条记录的兄弟数据集,QQQ 为查询函数。sss 等于任意两个兄弟数据集查询结果的L1L_1L1​范数的最大值:
s=max∣∣Q(D1)−Q(D2)∣∣1s = max{\,}||Q(D_1)-Q(D2)||_1 s=max∣∣Q(D1​)−Q(D2)∣∣1​

3.5 符号定义

符号 描述
DDD 包含 n 条记录的数据集
ti=(xi,yi)t_i = (x_i,y_i)ti​=(xi​,yi​) 数据集 D 中的第 i 条记录
ddd 特征向量 xix_ixi​ 的特征数
ω\omegaω 回归模型的权重向量
f(ti,ω)f(t_i,\omega)f(ti​,ω) 回归模型的损失函数
fD(ω)f_D(\omega)fD​(ω) fD(ω)=∑ti∈Df(ti,ω)f_D(\omega) = \sum_{t_i\in D}f(t_i,\omega)fD​(ω)=∑ti​∈D​f(ti​,ω) | 对所有记录的损失函数求和
ω∗\omega^*ω∗ ω∗=argminωfD(ω)\omega^* = argmin_{\omega} f_D(\omega)ω∗=argminω​fD​(ω)
fˉD(ω)\bar{f}_D(\omega)fˉ​D​(ω) 扰动后的fD(ω)f_D(\omega)fD​(ω)
ωˉ\bar{\omega}ωˉ fˉD(ω)\bar{f}_D(\omega)fˉ​D​(ω) 最小时对应的权重ω\omegaω
f~D(ω)\widetilde{f}_D(\omega)f​D​(ω) 对 fD(ω)f_D(\omega)fD​(ω) 泰勒展开后得到的损失函数
ω~\widetilde{\omega}ω f~D(ω)\widetilde{f}_D(\omega)f​D​(ω) 最小时对应的权重ω\omegaω
f^D(ω)\widehat{f}_D(\omega)f​D​(ω) 取泰勒展开式中的低次项构成的渐进函数
ω^\widehat{\omega}ω f^D(ω)\widehat{f}_D(\omega)f​D​(ω) 最小时对应的权重ω\omegaω
ϕ\phiϕ ω\omegaω 中的各个分量运算得到的结果(与二项展开式有关)如(ω1)3⋅ω2(\omega_1)^3\cdot\omega^2(ω1​)3⋅ω2
Φj\Phi_jΦj​ 所有幂为 jjj 的 ϕ\phiϕ 对应的集合
λϕti\lambda_{\phi_{t_i}}λϕti​​​ 第 iii 条记录对应的 ϕ\phiϕ 的多项式系数(这里有多个,因为 ϕ\phiϕ的幂有多个)

3.6 部分说明

  • 设 DDD 包含 nnn 条记录 t1,t2,...tnt_1,t_2,...t_nt1​,t2​,...tn​ ,每条记录包含 n+1n+1n+1 个属性,X1,X2...Xd,YX_1,X_2...X_d,YX1​,X2​...Xd​,Y。

    假设不失一般性, ∑j=1dxij2≤1\sqrt{\sum^d_{j=1}x^2_{ij}}\le1∑j=1d​xij2​​≤1 (第 iii 条记录的特征的 L2 范数小于等于 1 )

    这里我觉得是因为对数据做了规范化处理(均值为0,方差为1)

  • 为了方便进行讨论,论文所有的属性都是二值属性,即 0 或 1 。如果有多值,比如婚姻状况,有未婚,已婚,丧偶三种。则将这个三值属性转换成两个二值属性,即是否已婚,是否丧偶。

4.理论部分

4.1 函数机制

直接在目标函数上进行扰动,极具挑战。这主要是因为权重 ω\omegaω 的全局敏感度分析起来十分困难 。

根据 Stone−WeierstrassStone -WeierstrassStone−Weierstrass 定理,任何连续可微分的函数 f(x)f(x)f(x) 可以由一个多项式 Axn+Bxn−1...+Kx1+bx0Ax^n +Bx^n-1...+Kx^1+bx^0Axn+Bxn−1...+Kx1+bx0来表示。

这样,在将原函数转换成多项式形式后。就可以在多项式系数上加入噪声,而不是在权重 ω\omegaω 上加入噪声。

在回归问题中,对于训练集中的一条记录,目标函数为 f(ti,ω)f(t_i,\omega)f(ti​,ω) 。这里的 ω\omegaω 就可以看作是 f(x)f(x)f(x) 中的 xxx 。

向量 ω\omegaω 中包含 ddd 个值 ω1,ω2...ωd\omega_1,\omega_2...\omega_dω1​,ω2​...ωd​,令 ϕ\phiϕ 为 ω\omegaω 中的各个分量幂运算得到的结果(这里与二项式定理有关)

Φj\Phi_jΦj​ 为所有幂为 jjj 的 ϕ\phiϕ 对应的集合,公式表达如下:
Φj={ω1c1ω2c2...ωdcd∣∑l=1dcl=j}\Phi_j = \left\{\begin{matrix}\omega_1^{c_1}\omega_2^{c_2}...\omega_d^{c_d}|\sum_{l=1}^dc_l=j \end{matrix}\right\} Φj​={ω1c1​​ω2c2​​...ωdcd​​∣∑l=1d​cl​=j​}
例如,Φ0={1}\Phi_0=\left\{\begin{matrix}1 \end{matrix}\right\}Φ0​={1​} ,Φ1={ω1,ω2...,ωd}\Phi_1=\left\{\begin{matrix}\omega_1,\omega_2...,\omega_d \end{matrix}\right\}Φ1​={ω1​,ω2​...,ωd​​} ,Φ2={ωi⋅ωj∣i,j∈[1,d]}\Phi_2=\left\{\begin{matrix}\omega_i\cdot\omega_j|i,j \in[1,d]\end{matrix}\right\}Φ2​={ωi​⋅ωj​∣i,j∈[1,d]​} 。

这里其实就是对 ω\omegaω 求幂,ω0=1\omega^0 = 1ω0=1 ,ω1={ω1,ω2...,ωd}\omega^1=\left\{\begin{matrix}\omega_1,\omega_2...,\omega_d \end{matrix}\right\}ω1={ω1​,ω2​...,ωd​​},ω2={ωi⋅ωj∣i,j∈[1,d]}\omega^2=\left\{\begin{matrix}\omega_i\cdot\omega_j|i,j \in[1,d]\end{matrix}\right\}ω2={ωi​⋅ωj​∣i,j∈[1,d]​}

设 JJJ 为多项式的最高次幂,J∈[0,∞]J\in[0,\infty]J∈[0,∞] ,λϕti为多项式系数\lambda_{\phi_{t_i}}为多项式系数λϕti​​​为多项式系数, f(ti,ω)f(t_i,\omega)f(ti​,ω) 为可以由多项式表示为:
f(ti,w)=∑j=0J∑ϕ∈Φjλϕtiϕ(ω)f(t_i,w)=\sum^J_{j=0}\sum_{\phi\in\Phi_j}\lambda_{\phi_{t_i}}\phi(\omega) f(ti​,w)=j=0∑J​ϕ∈Φj​∑​λϕti​​​ϕ(ω)
因为函数机制是在多项式系数上加入拉普拉斯噪声,所以我们需要求解多项式系数的全局敏感度 sss

对于兄弟数据集 DDD 和 D′D'D′,它们的目标函数可以由如下多项式表示:
f(ti,ω)=∑j=0J∑ϕ∈Φj∑ti∈Dλϕtiϕ(ω),f(ti,ω)=∑j=0J∑ϕ∈Φj∑ti∈D1λϕtiϕ(ω).f(t_i,\omega) =\sum^J_{j=0}\sum_{\phi\in\Phi_j}\sum_{t_i \in D}\lambda_{\phi_{t_i}}\phi(\omega),\\ f(t_i,\omega) =\sum^J_{j=0}\sum_{\phi\in\Phi_j}\sum_{t_i \in D_1}\lambda_{\phi_{t_i}}\phi(\omega). f(ti​,ω)=j=0∑J​ϕ∈Φj​∑​ti​∈D∑​λϕti​​​ϕ(ω),f(ti​,ω)=j=0∑J​ϕ∈Φj​∑​ti​∈D1​∑​λϕti​​​ϕ(ω).
对它们的多项式作差,可得如下不等式:
∑j=0J∑ϕ∈Φj∣∣∑ti∈Dλϕti−∑ti′∈D′λϕti′∣∣1≤2max⁡t∑j=1J∑ϕ∈Φj∣∣λϕt∣∣1\sum_{j=0}^J\sum_{\phi\in\Phi_j}||\sum_{t_i\in D}\lambda_{\phi_{t_i}}-\sum_{t'_i\in D'}\lambda_{\phi_{t_i'}}||_1 \le 2\max_t \sum_{j=1}^J\sum_{\phi \in \Phi_j}||\lambda_{\phi_t}||_1 j=0∑J​ϕ∈Φj​∑​∣∣ti​∈D∑​λϕti​​​−ti′​∈D′∑​λϕti′​​​∣∣1​≤2tmax​j=1∑J​ϕ∈Φj​∑​∣∣λϕt​​∣∣1​
根据上述,可以得到函数机制的算法流程:

4.2 泰勒展开式

泰勒展开是用一个多项式函数 g(x)g(x)g(x) 来仿造原函数 f(x)f(x)f(x) 的方法,使这两个函数在某一点的初始值相等,111 阶导数相等,222 阶导数相等,… nnn 阶导数相等。泰勒展开式在点 x0x_0x0​ 处的表达式如下:
g(x)=g(x0)+f1(x0)1!x+f2(x0)2!x2+......fn(x0)n!xng(x) = g(x_0)+\frac{f^1(x_0)}{1!}x + \frac{f^2(x_0)}{2!}x^2+......\frac{f^n(x_0)}{n!}x^n g(x)=g(x0​)+1!f1(x0​)​x+2!f2(x0​)​x2+......n!fn(x0​)​xn
知乎上有个很好的帖子来理解泰勒展开式:怎样更好的理解并记忆泰勒展开式?

4.3 将函数机制应用到线性回归上

前面说到,函数机制用多项式来渐进目标函数,而线性回归的损失函数本身就是多项式,所以可以直接在损失函数的多项式系数上加噪声。

线性回归的目标函数:
fD(ω)=∑ti∈D(yi−xiTω)2=∑ti∈D(yi)2−∑j=1d(2∑ti∈Dyixij)ωj+∑1≤j,l≤d(∑ti∈Dxijxil)ωjωlf_D(\omega) = \sum_{t_i\in D}(y_i-x_i^T\omega)^2 =\\ \sum_{t_i\in D}(y_i)^2-\sum_{j=1}^d\left(2\sum_{t_i\in D}y_ix_{ij}\right)\omega_j + \sum_{1\le j,l \le d}\left(\sum_{t_i \in D}x_{ij}x_{il}\right)\omega_j\omega_l fD​(ω)=ti​∈D∑​(yi​−xiT​ω)2=ti​∈D∑​(yi​)2−j=1∑d​(2ti​∈D∑​yi​xij​)ωj​+1≤j,l≤d∑​(ti​∈D∑​xij​xil​)ωj​ωl​
全局敏感度求解如下:
Δ=2max⁡t=(x,y)∑j=1J∑ϕ∈ΦJ∣∣λϕt∣∣1≤2max⁡t=(x,y)(y2+2∑j=1dyx(j)+∑1≤j,l≤dx(j)x(l))≤2(1+2d+d2)\Delta = 2{\,} \max_{t=(x,y)}\sum_{j=1}^J\sum_{\phi\in\Phi_J}||\lambda_{\phi_t}||_1 {\,} \le 2{\,} \max_{t=(x,y)}\left(y^2+2\sum_{j=1}^dyx_{(j)}+\sum_{1\le j,l \le d}x_{(j)}x_{(l)}\right) \le 2{\,}(1+2d+d^2) Δ=2t=(x,y)max​j=1∑J​ϕ∈ΦJ​∑​∣∣λϕt​​∣∣1​≤2t=(x,y)max​⎝⎛​y2+2j=1∑d​yx(j)​+1≤j,l≤d∑​x(j)​x(l)​⎠⎞​≤2(1+2d+d2)
∵y∈[−1,1]→max(y2)=1,max(yxj)=1\because y \in [-1,1] \rightarrow max({\,}y^2) = 1,max(yx_j)=1∵y∈[−1,1]→max(y2)=1,max(yxj​)=1

将求解得到的全局敏感度 Δ\DeltaΔ 带入到算法1中即可求解。

4.4 将函数机制应用到 Logistic 回归上

LogisticLogisticLogistic 回归的损失函数本身不是多项式,需要使用泰勒展开式构造一个多项式。

Logistic 回归的损失函数为:fD(w)=−[ylogxiTω+(1−y)log(1−xiTω)]f_D(w) = -[y{\,}log{\,}x_i^T\omega+(1-y)log(1-x_i^T\omega)]fD​(w)=−[ylogxiT​ω+(1−y)log(1−xiT​ω)]

论文证明在 Logistic 回归中泰勒展开到二阶就能保证构造的多项式函数相对于原函数损失只有 ≈0.015\approx 0.015≈0.015

我们将 Logistic 回归的损失函数用泰勒在 000 处展开到二阶(后面一项本身是多项式不需要展开)
f^D(ω)=∑i=1n∑k=02f1(k)(0)k!(xiTω)k−(∑i=1nyixiT)ω\widehat{f}_D(\omega)=\sum_{i=1}^n\sum_{k=0}^2\frac{f_1^{(k)}(0)}{k!}\left(x_i^T\omega\right)^k -\left(\sum_{i=1}^ny_ix_i^T\right)\omega f​D​(ω)=i=1∑n​k=0∑2​k!f1(k)​(0)​(xiT​ω)k−(i=1∑n​yi​xiT​)ω
对应的全局敏感度 Δ\DeltaΔ 为
Δ=2max⁡t=(x,y)(f1(1)(0)1!∑j=1dx(j)+f1(2)(0)2!∑j,lx(j)x(l)+y∑j=1dx(j))≤2(d2+d28+d)=d24+3d\Delta = 2{\,}\max_{t={(x,y)}}\left(\frac{f_1^{(1)}(0)}{1!}\sum_{j=1}^dx_{(j)}+\frac{f_1^{(2)}(0)}{2!}\sum_{j,l}x_{(j)}x_{(l)}+y\sum^d_{j=1}x_{(j)}\right) \\ \le 2 {\,}(\frac{d}{2}+\frac{d^2}{8}+d) = \frac{d^2}{4}+3d Δ=2t=(x,y)max​⎝⎛​1!f1(1)​(0)​j=1∑d​x(j)​+2!f1(2)​(0)​j,l∑​x(j)​x(l)​+yj=1∑d​x(j)​⎠⎞​≤2(2d​+8d2​+d)=4d2​+3d
将 Δ\DeltaΔ 带入到算法1中即可求解

5. 避免注入的噪声使损失函数无法收敛

使用函数机制 LogisticLogisticLogistic 回归中注入噪声,可能会导致损失函数无法收敛。

我们在对 LogisticLogisticLogistic 进行低阶泰勒展开后,得到的是一个二阶多项式。

为了方便描述,我们令这个式子为Ax2+bx+cAx^2+bx+cAx2+bx+c. 当 A>0A>0A>0 时,损失函数为一个开口向上的抛物线。

如果加入对多项式系数扰动后,A<0A<0A<0 那么损失函数就变成了一个开口向下的抛物线,那么就导致损失函数无法收敛到最小值处。

所以在 LogistcLogistcLogistc 回归中需要保证多项式的二次项系数加噪后仍然为正。

论文中给出的一个解决方式是:如果发现 A<0A<0A<0 了,重新运行函数机制,直到它扰动后为正。

6. 实验

作者将自己的算法与DPMEDPMEDPME,Filter−PriorityFilter-PriorityFilter−Priority,Truncated 以及不加差分隐私的算法进行了对比,结果证明函数机制造成的性能损失更小,训练时间更短,基本上是完胜其他几个算法(在我的论文里,你们是无法战胜我的)

原作者使用的matlab进行实验且代码未公开,具体性能需要复现后才能知道。

Functional Mechanism: Regression Analysis under Differential Privacy相关推荐

  1. [paper reading] Federated Learning With Differential Privacy:Algorithms and Performance Analysis

    Federated Learning With Differential Privacy:Algorithms and Performance Analysis 1.整篇论文的总结: (1)提出了一种 ...

  2. Differential Privacy and Fairness in Decisions and Learning Tasks: A Survey

    1 摘要 综述了近年来差分隐私与公平交叉领域的成果 分析了差分隐私在决策问题和学习任务中可能加剧不公平性的原因 在差分隐私系统中缓解不公平性的措施 在公平的条件下部署隐私模型面临的挑战 2 介绍 大型 ...

  3. Repo:Deep Learning with Differential Privacy

    翻译参考:https://blog.csdn.net/qq_42803125/article/details/81232037 >>>Introduction: 当前的神经网络存在的 ...

  4. 差分隐私相关论文(2) —— Deep Learning with Differential Privacy, Abadi 2016

    本文向大家介绍一下一篇CCS 2016的工作,文章的名字叫Deep Learning with Differential Privacy,在网上应该很容易就能找到,如果有朋友找不到还有兴趣的话可以私信 ...

  5. Programming Differential Privacy第七章

    Approximate Differential Privacy近似差分隐私 • Define approximate differential privacy 定义 • Explain the di ...

  6. Releasing Graph Neural Networks with Differential Privacy Guarantees

    Releasing Graph Neural Networks with Differential Privacy Guarantees 1 :动机 针对图片分类成员推理攻击的防御方法-教师集成学生模 ...

  7. 【FL-GAN】Private FL-GAN: Differential Privacy Synthetic Data Generation Based on Federated Learning

    Private FL-GAN: Differential Privacy Synthetic Data Generation Based on Federated Learning 私有FL-GAN: ...

  8. 密码学小知识(9):差分隐私(Differential Privacy)

    首先要明白什么是隐私?若单个用户的某个属性可以是隐私,而一群用户的某个属性就可以不看做隐私了.例如,张三喜欢抽烟,所以得了肺癌.这个"张三得了肺癌"这条信息就是隐私.而医院里,抽烟 ...

  9. 什么是回归分析(regression analysis)?有哪些类型的回归分析(regression analysis)?

    什么是回归分析(regression analysis)?有哪些类型的回归分析(regression analysis)? #线性回归(Linear Regression) 线性回归被用作预测模型,它 ...

最新文章

  1. ThreadLocal的使用方法
  2. 怎么把快捷键改成eclipse_Java IDE超好用的10个快捷键
  3. Asp.Net页面输出到EXCEL
  4. 【PC工具】速度最快最好用的文件搜索工具:everything,更新文件内容搜索方法...
  5. 【ruoyi若依】echarts图表跑版
  6. P1313 计算系数(组合数)
  7. java面试题_1000道Java工程师面试题+答案PDF485页
  8. 发年终奖了,创了新高
  9. 以太网实习_从最初有从事IT的想法,到现在实习两个月的感受
  10. QQ 新增“语音进度条”;滴滴顺风车负责人道歉;华为研发费将超 1000 亿美元 | 极客头条...
  11. zabbix自定义SNMP监控项
  12. IntelliJ IDEA 2019.3 首个最新访问版本发布,新特性抢先看
  13. socket.io html5 聊天,WebSocket探讨之——socket.io搭建多聊天室
  14. Fury:一个基于JIT动态编译的高性能多语言原生序列化框架
  15. “新元宇宙”奇科幻小说原创作品系列连载《地球人奇游天球记》第三回零点惊魂
  16. [linux thermal] thermal device tree
  17. HTML在线转换成PDF
  18. Unity3d将资源打包成AssetBundle 读取后材质球丢失的问题
  19. 2.shel脚本l知识点学习一
  20. 获取openwrt mac地址

热门文章

  1. TIA博途中累计流量的两种计算方法示例
  2. 蓝牙远程打卡java_Android基于ibeacon实现蓝牙考勤功能
  3. android 驾考软件开发,安卓模拟驾考游戏软件
  4. 计算机动画实践教学反思,引导层动画教学反思
  5. osg+pdal大数据点云的LOD可视化
  6. opencv实现字符分割
  7. 如何在SketchUp中快速切割铺砖?
  8. android使用官方v4裁剪圆角和圆角矩形
  9. 阿里新增37天假期,“反卷”第一战正式打响
  10. OFDM雷达信号模糊函数MATLAB仿真分析