在这里插入图片描述

0.1 数字识别

from sklearn.svm import SVC
from sklearn.metrics import silhouette_score
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.feature_extraction import DictVectorizer
from sklearn.cluster import KMeans
from sklearn.metrics import classification_report,roc_curve,roc_auc_score
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
# 封装一个函数用于可视化结果
def visualization(data,c=None,title=None,centers=None):if data.ndim == 1 or data.shape[1] == 1:print("数据维度过低,跳过可视化")returndata = pd.DataFrame(data)pca = PCA(n_components=2)data = pca.fit_transform(data)plt.scatter(data[:, 0], data[:,1],c=c)if centers is not None:plt.scatter(centers[:,0],centers[:,1],c="red",s=100)plt.title(title)plt.show()data = pd.read_csv("../data/shuzi.csv")
X=data.drop(columns="label")
y=data["label"]
X=X.apply(lambda x:x/255,axis=0)
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2)
AUC = []
for i in [0.75,0.8,0.85,0.9,0.95]:pca = PCA(n_components=i, svd_solver='full')print(i,":","拷贝")X_train_copy = X_train.copy()X_test_copy = X_test.copy()# 降维print(i,":","开始降维")X_train_copy =pca.fit_transform(X_train_copy)X_test_copy =pca.transform(X_test_copy)# 训练print(i,":","开始训练")svc = SVC(C=1,probability=True)svc.fit(X_train_copy,y_train)print(i,":","开始预测")y_pred = svc.predict(X_test_copy)y_proba = svc.predict_proba(X_test_copy)print(i,":","开始评估")# fpr, tpr, thresholds = roc_curve(y_test,y_proba[:,1])auc = roc_auc_score(y_test,y_proba,multi_class="ovr")print(i,"评估结果:\n",classification_report(y_test,y_pred))print(i,":auc:",auc)AUC.append(auc)print(i,":","可视化:")visualization(y_test,c=y_pred)
# 可视化
fig , axes = plt.subplots(2,1)axes[0].imshow(np.array(X.iloc[0,:]).reshape(28,28))
axes[1].imshow(np.array(X.iloc[1,:]).reshape(28,28))plt.show()

0.2 乳腺癌分类预测

from sklearn.svm import SVC
from sklearn.metrics import silhouette_score
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.feature_extraction import DictVectorizer
from sklearn.cluster import KMeans
from sklearn.metrics import classification_report,roc_curve,roc_auc_score
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
plt.rcParams['font.sans-serif'] = ['KaiTi']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
# 绘制决策边界
def plot_boundary(data, estimator, y, pca=None,title=None):"""绘制决策边界和数据点:param data: 预测的数据:param estimator: 训练好的分类器:param y: 数据标签:param pca: PCA对象,用于降维(在函数外已经使用了pca的情况,防止两个pca不一样,输入pca保持降维结果一致):return: None"""data = np.array(data)if data.ndim == 1 or data.shape[1] == 1:print("维度过低")return # PCA 降维(如果传入pca则直接使用传入的pca)if data.shape[1] > 2:if pca is None:pca = PCA(n_components=2)data_reduced = pca.fit_transform(data)  # 使用不同的变量名else:data_reduced = pca.transform(data)need_inv = True  # 用于标记是否经历过降维(如果降维过在后面需要重新升维,防止与estimator的训练维度不统一)else:data_reduced = data   need_inv = False # 用于标记是否经历过降维(如果降维过在后面需要重新升维,防止与estimator的训练维度不统一)# 基于降维后的数据创建网格min_x, max_x = data_reduced[:,0].min()-1, data_reduced[:,0].max()+1min_y, max_y = data_reduced[:,1].min()-1, data_reduced[:,1].max()+1xx, yy = np.meshgrid(np.arange(min_x, max_x, 0.02),np.arange(min_y, max_y, 0.02))# 转为一维且合并的网格点,每行代表一个网格点,用于后续预测grid_points = np.c_[xx.ravel(), yy.ravel()]# 如果降过维,把网格点升回原始空间再预测if need_inv:grid_original = pca.inverse_transform(grid_points)else:grid_original = grid_points# 预测网格点的类别Z = estimator.predict(grid_original).reshape(xx.shape)# 绘图plt.figure(figsize=(10, 10))plt.contourf(xx, yy, Z, alpha=0.8)plt.scatter(data_reduced[:,0], data_reduced[:,1], c=y, edgecolors='black')plt.title(f"可视化决策边界-{title}")plt.show()
data = pd.read_csv("F:\py_MachineLearning\MachineLearning\MachineLearning\scikit_learn\data\乳腺癌分类.csv")# 可视化
sns.countplot(data,x="diagnosis",
)
plt.title("类别分布")
plt.show()
# 数据集划分
X=data.drop(columns=['Unnamed: 32',"id","diagnosis"])
y = data["diagnosis"]
# 创建字典映射
dict={"B":0,"M":1
}
y = y.map(dict)
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2)
from sklearn.preprocessing import StandardScaler
# 特征缩放
transfer = StandardScaler()
transfer.fit(X_train)
X_train = pd.DataFrame(transfer.transform(X_train),columns=X.columns)
X_test = pd.DataFrame(transfer.transform(X_test),columns=X.columns)
# 借助决策树挑选特征
from sklearn.tree import DecisionTreeClassifier
DT = DecisionTreeClassifier()
DT.fit(X_train,y_train)
importances = {"feature":X.columns,"importance":DT.feature_importances_
}pd.DataFrame(importances).sort_values(by="importance",ascending=False)#选择radius_worst和concave points_worst
## X_train,X_test=X_train.loc[:,["radius_worst","concave points_worst"]],X_test.loc[:,["radius_worst","concave points_worst"]]svc = SVC() 
svc.fit(X_train,y_train)
y_pred = svc.predict(X_test)
print("classification_report:\n",classification_report(y_test,y_pred))
# 绘制决策边界
plot_boundary(X_test,svc,y=y_test,title="癌症预测")

结果
在这里插入图片描述

1 相关知识

拉格朗日乘子法:
1 带约束的优化问题

min⁡xf0(x)\min_x f_0(x)xminf0(x)

subject to fi(x)≤0,i=1,...m\text{subject to } f_i(x) \leq 0, i = 1,...msubject to fi(x)0,i=1,...m

hi(x)=0,i=1,...qh_i(x) = 0, i = 1,...qhi(x)=0,i=1,...q

2 原始转换

min⁡L(x,λ,v)=f0(x)+∑i=1mλifi(x)+∑i=1qvihi(x)\min L(x, \lambda, v) = f_0(x) + \sum_{i=1}^{m} \lambda_i f_i(x) + \sum_{i=1}^{q} v_i h_i(x)minL(x,λ,v)=f0(x)+i=1mλifi(x)+i=1qvihi(x)

2 SVC推导过程

2.1 损失函数的推导

2.1.1 距离的方向

已知决策超平面:wTX+b=0w^TX+b=0wTX+b=0

w1x1+w2x2=0w_1x_1+w_2x_2=0w1x1+w2x2=0 可以转化为两个向量相乘 (w1,w2)⋅(x1,x2)=0(w_1,w_2)·(x_1,x_2)=0(w1,w2)(x1,x2)=0

此时会发现(w_1,w_2)正好垂直于(x_1,x_2),这就是法向量,这样就获得了垂直于决策超平面距离的方向wT∣∣w∣∣\frac{w^T}{||w|| }∣∣w∣∣wT(除以w的范数是为了保证这个向量的长度=1.只是单纯的方向没有距离信息)

2.1.2 距离的计算

现在只需要在决策超平面上取一个点x′x'x ,再得到支持向量xxx,计算(x−x′)∗wT∣∣w∣∣(x-x')*\frac{w^T}{||w|| }(xx)∣∣w∣∣wT就是x,x′x,x'x,x在法向量上的距离,也就是支持向量到平面的距离

2.1.3损失函数

现在得到了(x−x′)∗wT∣∣w∣∣(x-x')*\frac{w^T}{||w|| }(xx)∣∣w∣∣wT

因为x′x'x取自决策超平面:wTX+b=0w^TX+b=0wTX+b=0 ,所以wTx′=−bw^Tx'=-bwTx=b

所以:(x−x′)w=wTx−wTx′=wTx+b(x-x')w=w^Tx-w^Tx'=w^Tx+b(xx)w=wTxwTx=wTx+b

这样就得到了初步的损失函数:wTx+b∣∣w∣∣\frac{w^Tx+b}{||w||}∣∣w∣∣wTx+b

简化,由于yiy_iyiwT⋅Φ(xi)+bw^T \cdot \Phi(x_i) + bwTΦ(xi)+b处于同一侧,符号同号(隐含假设,否则则是分类错误)。所以结果不变,得到:yi(wT⋅Φ(xi)+b)∣∣w∣∣\frac{y_i \bigl(w^T \cdot \Phi(x_i) + b\bigr)}{||w||}∣∣w∣∣yi(wTΦ(xi)+b)
(Φ(xi)\Phi(x_i)Φ(xi)表示核函数,表示升维,暂时可继续理解为X)

最后得到:
arg⁡max⁡w,b{1∣∣w∣∣min⁡i[yi⋅(wT⋅Φ(xi)+b)]}\arg \max_{w,b} \left\{ \frac{1}{||w||} \min_i \left[ y_i \cdot (w^T \cdot \Phi(x_i) + b) \right] \right\}argmaxw,b{∣∣w∣∣1mini[yi(wTΦ(xi)+b)]}

2.2 空间缩放

为了进一步简化损失函数

对w和x同乘γ\gammaγ对整个空间进行缩放,使得yi⋅(wT⋅Φ(xi)+b)≥1y_i \cdot (w^T \cdot \Phi(x_i) + b) \geq 1yi(wTΦ(xi)+b)1

此时min⁡[yi⋅(wT⋅Φ(xi)+b)≥1]\min[y_i \cdot (w^T \cdot \Phi(x_i) + b) \geq 1]min[yi(wTΦ(xi)+b)1]就等于1

最后损失函数就成了arg⁡max⁡w,b1∣∣w∣∣\arg \max_{w,b}\frac{1}{||w||}argmaxw,b∣∣w∣∣1

也产生了一个约束条件:min⁡[yi⋅(wT⋅Φ(xi)+b)≥1]\min[y_i \cdot (w^T \cdot \Phi(x_i) + b) \geq 1]min[yi(wTΦ(xi)+b)1]
(接下来的推导均处于这个缩放后的空间)

2.3 目标求解

2.3.1 拉格朗日乘子法

现在的目标函数是arg⁡max⁡w,b1∣∣w∣∣\arg \max_{w,b}\frac{1}{||w||}argmaxw,b∣∣w∣∣1,约束条件是min⁡[yi⋅(wT⋅Φ(xi)+b)≥1]\min[y_i \cdot (w^T \cdot \Phi(x_i) + b) \geq 1]min[yi(wTΦ(xi)+b)1]

正常来说需要将求解极大值问题转化为求解极小值问题,然后求最优值但此时由于有一个约束条件,可以采用拉格朗日乘子法将约束条件融合进f(x)f(x)f(x),使其表面上转化为一个无约束问题

通过拉格朗日乘子法得到:L(w,b,α)=12∣∣w∣∣2−∑i=1nαi(yi(wT⋅Φ(xi)+b)−1)L(w, b, \alpha) = \frac{1}{2}||w||^2 - \sum_{i=1}^{n} \alpha_i \left( y_i \left( w^T \cdot \Phi(x_i) + b \right) - 1 \right)L(w,b,α)=21∣∣w2i=1nαi(yi(wTΦ(xi)+b)1),约束:αi>=0\alpha_i>=0αi>=0(这个约束源于拉格朗日乘子法的KKT性质)

(αi\alpha_iαi:拉格朗日乘数,负号是因为约束条件被重写为 −[yi(wT⋅Φ(xi)+b)−1]≤0−[yi(wT⋅Φ(xi)+b)−1]≤0−[yi(wT⋅Φ(xi)+b)−1]≤0−[yi(wT⋅Φ(xi)+b)−1]≤0-[y_i(w^T \cdot \Phi(x_i) + b) - 1] \leq 0−[yi(wT⋅Φ(xi)+b)−1]≤0[yi(wTΦ(xi)+b)1]0[yi(wTΦ(xi)+b)1]0[yi(wTΦ(xi)+b)1]0 的形式)

2.3.2 对偶性

由于对偶性质(这个当定理记即可,推导极为复杂)
min⁡w,bmax⁡αL(w,b,α)→max⁡αmin⁡w,bL(w,b,α)\min_{w,b} \max_{\alpha} L(w,b,\alpha) \to \max_{\alpha} \min_{w,b} L(w,b,\alpha)minw,bmaxαL(w,b,α)maxαminw,bL(w,b,α)

2.3.3 求导*

对w求偏导:∂L∂w=0⇒w=∑i=1nαiyiΦ(xi)\frac{\partial L}{\partial w} = 0 \Rightarrow w = \sum_{i=1}^{n} \alpha_i y_i \Phi(x_i)wL=0w=i=1nαiyiΦ(xi)
对b求偏导:∂L∂b=0⇒0=∑i=1nαiyi\frac{\partial L}{\partial b} = 0 \Rightarrow 0 = \sum_{i=1}^{n} \alpha_i y_ibL=00=i=1nαiyi

代入:L(w,b,α)=12∣∣w∣∣2−∑i=1nαi(yi(wTΦ(xi)+b)−1)L(w,b,\alpha) = \frac{1}{2}||w||^2 - \sum_{i=1}^{n} \alpha_i (y_i(w^T \Phi(x_i) + b) - 1)L(w,b,α)=21∣∣w2i=1nαi(yi(wTΦ(xi)+b)1)


其中 w=∑i=1nαiyiΦ(xi)0=∑i=1nαiyiw = \sum_{i=1}^{n} \alpha_i y_i \Phi(x_i) \quad 0 = \sum_{i=1}^{n} \alpha_i y_iw=i=1nαiyiΦ(xi)0=i=1nαiyi

=12wTw−wT∑i=1nαiyiΦ(xi)−b∑i=1nαiyi+∑i=1nαi= \frac{1}{2}w^T w - w^T \sum_{i=1}^{n} \alpha_i y_i \Phi(x_i) - b\sum_{i=1}^{n} \alpha_i y_i + \sum_{i=1}^{n} \alpha_i=21wTwwTi=1nαiyiΦ(xi)bi=1nαiyi+i=1nαi

=∑i=1nαi−12(∑i=1nαiyiΦ(xi))T∑i=1nαiyiΦ(xi)= \sum_{i=1}^{n} \alpha_i - \frac{1}{2}(\sum_{i=1}^{n} \alpha_i y_i \Phi(x_i))^T \sum_{i=1}^{n} \alpha_i y_i \Phi(x_i) \quad=i=1nαi21(i=1nαiyiΦ(xi))Ti=1nαiyiΦ(xi)

=∑i=1nαi−12∑i=1,j=1nαiαjyiyjΦT(xi)Φ(xj)= \sum_{i=1}^{n} \alpha_i - \frac{1}{2} \sum_{i=1,j=1}^{n} \alpha_i \alpha_j y_i y_j \Phi^T(x_i)\Phi(x_j)=i=1nαi21i=1,j=1nαiαjyiyjΦT(xi)Φ(xj)


继续对α求极大值:max⁡α∑i=1nαi−12∑i=1n∑j=1nαiαjyiyj(Φ(xi)⋅Φ(xj))\max_{\alpha} \sum_{i=1}^{n} \alpha_i - \frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} \alpha_i \alpha_j y_i y_j (\Phi(x_i) \cdot \Phi(x_j))maxαi=1nαi21i=1nj=1nαiαjyiyj(Φ(xi)Φ(xj))


条件:∑i=1nαiyi=0\sum_{i=1}^{n} \alpha_i y_i = 0i=1nαiyi=0αi≥0\alpha_i \geq 0αi0


极大值转换成求极小值:min⁡α12∑i=1n∑j=1nαiαjyiyj(Φ(xi)⋅Φ(xj))−∑i=1nαi\min_{\alpha} \frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} \alpha_i \alpha_j y_i y_j (\Phi(x_i) \cdot \Phi(x_j)) - \sum_{i=1}^{n} \alpha_iminα21i=1nj=1nαiαjyiyj(Φ(xi)Φ(xj))i=1nαi


条件:∑i=1nαiyi=0\sum_{i=1}^{n} \alpha_i y_i = 0i=1nαiyi=0αi≥0\alpha_i \geq 0αi0

2.4松弛因子

加入松弛因子成为软间隔
min⁡12∣∣w∣∣2+C∑i=1nξi\min \frac{1}{2} ||w||^2 + C \sum_{i=1}^{n} \xi_imin21∣∣w2+Ci=1nξi
约束变成了C−αi−μi=0C - \alpha_i - \mu_i = 0Cαiμi=0μi≥0\mu_i \geq 0μi0

通过与硬间隔一样的求解方式最后得到解
min⁡α12∑i=1n∑j=1nαiαjyiyj(xi⋅xj)−∑i=1nαi\min_{\alpha} \frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} \alpha_i \alpha_j y_i y_j (x_i \cdot x_j) - \sum_{i=1}^{n} \alpha_iαmin21i=1nj=1nαiαjyiyj(xixj)i=1nαi
约束:
∑i=1nαiyi=0\sum_{i=1}^{n} \alpha_i y_i = 0i=1nαiyi=00≤αi≤C0 \leq \alpha_i \leq C0αiC

3 SVC api

(基于SVM的分类)
SVC(C=1.0,
gamma=‘scale’,
random_state=None,
)

C : # 正则化参数,控制分类边界的平滑程度。C值越大对误分类惩罚越强,可能导致过拟合;C值较小则允许更多误分类,泛化能力更强但可能欠拟合
gamma:# 核函数系数,可选’scale’(1/(n_features*X.var()))、‘auto’(1/n_features)或具体数值。影响数据映射到高维空间的分布

代码示例

from sklearn.datasets import load_iris
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_reportiris = load_iris()
data= pd.DataFrame(iris.data, columns=iris.feature_names)
data["target"] = iris.target
X = data.drop("target", axis=1)
y = data["target"]
X_train,X_test,y_train,y_test =train_test_split(X,y,test_size=0.2)transfer = StandardScaler()
X_train = transfer.fit_transform(X_train)
X_test = transfer.transform(X_test)svc = SVC(kernel='rbf')
svc.fit(X_train,y_train)
y_pred = svc.predict(X_test)print(classification_report(y_test, y_pred))

4 SVR

4.1 原理

目的:
SVR也是拟合一个函数y=wx+by=wx+by=wx+b这一点有些类似于线性回归

2. 核心概念

1 ε-不敏感区间
如果 |f(x_i) - y_i| ≤ ε,则认为预测是“足够好”,不计入损失

2 支持向量
只有落在 ε 区间之外的数据点才会对模型产生影响,这些点称为支持向量

3. 损失函数
SVR 的损失函数(ε-insensitive loss):

Lϵ(y,f(x))={0,if ∣y−f(x)∣≤ϵ∣y−f(x)∣−ϵ,if ∣y−f(x)∣>ϵ L_\epsilon(y, f(x)) = \begin{cases} 0, & \text{if } |y - f(x)| \le \epsilon \\ |y - f(x)| - \epsilon, & \text{if } |y - f(x)| > \epsilon \end{cases} Lϵ(y,f(x))={0,yf(x)ϵ,if yf(x)ϵif yf(x)>ϵ

(只有预测值超过 ε 的误差才会被惩罚)

4. 优化目标
最小化:
1/2∣∣w∣∣2+C∑i(ξi+ξi∗)1/2 ||w||^2 + C ∑_i (ξ_i + ξ_i^*)1/2∣∣w2+Ci(ξi+ξi)

ξ_i, ξ_i^*:松弛变量,度量超出 ε 的误差
C:控制对超出误差的惩罚程度
可通过对偶问题使用核函数处理非线性情况

核方法
与SVC一样

理解
除了支持向量(线性回归的误差的样本参与计算,SVR的误差只有在 ε 区间之外的数据点才参与计算)、核方法和松弛变量(线性回归并没有这种内嵌的正则化方式)等区别。SVR就是使用的线性回归那套损失函数,只是SVR根据自身的思想改了一点,且最终有一个∣∣w∣∣||w||∣∣w∣∣距离不是像线性回归一样的均方误差而是通过SVM的计算∣∣w∣∣||w||∣∣w∣∣的方式来计算的。也就是说SVR就是基于支持向量思想对线性回归的升级

4.2 api

(基于SVM的回归)
from sklearn.svm import SVR

SVR(kernel=‘rbf’, C=100, gamma=0.1, epsilon=0.1)

常用参数‌:
C:正则化参数。C的值越大,模型会尽可能减小训练误差,这可能导致过拟合。C的值越小,模型会尽可能平坦,这可能导致欠拟合。
epsilon:SVR中的ε-不敏感损失函数参数。它指定了SVR中函数f与真实值y之间允许的最大偏差。在这个间隔内的样本点被忽略,只有间隔边缘上的样本点才被用于计算损失。
kernel:指定算法中使用的核函数类型。常见的核函数有线性核(‘linear’)、多项式核(‘poly’)、径向基函数核(‘rbf’)等。
degree和gamma参数与SVC中的含义相同。

常用方法‌:**
fit(X, y):训练模型。
predict(X):使用训练好的模型进行预测。
score(X, y):返回给定测试数据和标签的R^2分数,也称为确定系数。它是回归模型拟合优度的一种度量。最好的可能分数是1.0,它可能小于1.0(因为模型的误差可能比随机误差大)。

代码示例

from sklearn.svm import SVR
from sklearn.metrics import root_mean_squared_error
import numpy as np 
import matplotlib.pyplot as plt
X=np.sort(5*np.random.rand(100,1),axis=0)#100个0-5之间的随机数,并按列排序
y = np.sin(X).ravel()+np.random.rand(100)*0.3svr = SVR(C=100,gamma=0.1) # 核函数参数 影响决策边界的形状)
svr.fit(X,y)X_test = np.linspace(0,5,100)
X_test = X_test.reshape(-1,1)
pred =svr.predict(X_test)plt.scatter(X,y)
plt.plot(X_test,pred,c ="red")
plt.show()
root_mean_squared_error(y,pred)# svr = SVR(kernel='rbf')

4.3 SVR、SVC、线性回归区别

  • SVM:主要用于分类(有SVC),也可用于回归(SVR)
  • 线性回归:专门用于回归问题

1.‌目标函数‌

  • SVM:
  • 分类:最大化间隔(margin)
  • 回归(ε-SVR):最小化预测误差,同时保持预测值在ε管道内
  • 线性回归:最小化均方误差(MSE)

2.‌损失函数‌

  • SVM:
  • 分类:铰链损失(Hinge Loss)
  • 回归:ε不敏感损失
  • 线性回归:平方损失

3.‌输出结果‌

  • SVM分类:离散的类别标签
  • SVM回归:连续值,但受ε管道约束
  • 线性回归:无约束的连续值输出

4.‌处理异常值‌

  • SVM:通过调节C参数控制对异常值的敏感度
  • 线性回归:对异常值非常敏感(因使用平方损失)

5.‌非线性扩展‌

  • SVM:可通过核技巧处理非线性问题
  • 线性回归:需要手动添加多项式特征

6.‌几何解释‌

  • SVM:寻找最大间隔超平面
  • 线性回归:寻找最小化垂直距离的超平面

    7 典型应用场景对比‌:
  • SVM更适合:
  • 小样本高维数据(如文本分类)
  • 需要明确决策边界的情况
  • 存在明显间隔的数据集
  • 线性回归更适合:
  • 预测连续数值
  • 需要解释特征权重的情况
  • 大数据量的线性关系建模

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93134.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93134.shtml
英文地址,请注明出处:http://en.pswp.cn/web/93134.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昆山PCB板工厂有哪些?

在长三角电子信息产业版图中,昆山凭借完整的产业链配套和精湛的制造工艺,成为国内PCB(印制电路板)生产的重要基地。本文精选五家具有代表性的本土工厂,从技术实力到服务特色展开深度剖析,为行业客户提供精准…

rk3588 ubuntu20.04安装包经常出现的问题总结(chatgpt回复)

问题1 问题 我在rk3588 ubuntu20.04安装相关环境的时候经常出现下面类似的问题,如何系统的解决 The following packages have unmet dependencies : openssh-server : Depends: openssh-client ( 1:8.2p1-4ubuntu0.13) but 1:8.2p1-4ubuntu0.11 is to be installed …

从根源到生态:Apache Doris 与 StarRocks 的深度对比 —— 论开源基因与长期价值的优越性

在 OLAP 领域,Apache Doris 与 StarRocks 常被一同提及,两者有着深厚的技术渊源 ——StarRocks 源自 Apache Doris 的代码 Fork,却在后续发展中走向了不同的路径。本文将从代码根源、架构演进、社区生态、功能特性等多维度展开对比。 一、代…

【从零开始学习Redis】项目实战-黑马点评D1

项目实战-黑马点评 项目架构短信登录发送短信验证码 实现思路就是按照上图左一部分&#xff0c; 实现类如下 Slf4j Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {/*** 验证手机号发送验证码** param phone* pa…

自然语言处理的范式转变:从Seq2Seq模型到Transformer架构

Seq2Seq 定义 Seq2Seq是一个Encoder-Decoder结构的网络&#xff0c;它的输入是一个序列&#xff0c;输出也是一个序列&#xff0c; Encoder使用循环神经网络(RNN,GRU&#xff0c;LSTM等)&#xff0c;将一个可变长度的信号序列(输入句子)变为固定维度的向量编码表达&#xff0c;…

【博客系统测试报告】---接口自动化测试

目录 1、需求分析 2、挑选接口 3、设计博客系统的测试用例 4、设计自动化测试框架 test_add.py: test_detail.py: test_getAuthorInfo.py: test_getUserInfo: test_list.py: test_login.py: logger_util.py: request_util.py: yaml_util.py: 1、需求分析 根据业务…

Mysql数据库迁移到GaussDB注意事项

mysql数据库迁移高斯数据库 建议开启高斯数据库M模式&#xff0c;mysql兼容模式&#xff0c;可以直接使用mysql的建表语句&#xff0c;自增主键可以使用AUTO_INCREMENT&#xff0c;如果不开启M模式&#xff0c;只能使用高斯数据库的序列添加自增主键1&#xff1a;如果使用数据库…

苹果正计划大举进军人工智能硬件领域

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Serverless 架构核心解析与应用实践

Serverless 的核心定义与优势‌‌核心定义Serverless&#xff08;无服务器架构&#xff09;是一种云计算模型&#xff0c;开发者无需关注底层服务器管理&#xff0c;由云服务商自动分配资源、弹性扩缩容&#xff0c;并按实际使用量计费‌。其核心特点包括&#xff1a;‌按需计算…

Redis持久化机制详解:RDB与AOF的全面对比与实践指南

目录 一、RDB持久化机制 1.1 RDB概述 1.2 RDB触发机制 1) 手动执行save命令 2) 手动执行bgsave命令 3) Redis正常关闭时 4) 自动触发条件满足时 1.3 RDB详细配置 1.4 RDB实现原理 1.5 RDB的优缺点分析 二、AOF持久化机制 2.1 AOF概述 2.2 AOF工作流程 2.3 AOF同步…

介绍一下jQuery的AJAX异步请求

目录 一、核心方法&#xff1a;$.ajax() 二、简化方法&#xff08;常用场景&#xff09; 1. $.get()&#xff1a;快速发送 GET 请求&#xff08;获取数据&#xff09; 2. $.post()&#xff1a;快速发送 POST 请求&#xff08;提交数据&#xff09; 3. $.getJSON()&#xf…

Win10系统Ruby+Devkit3.4.5-1安装

Win10系统RubyDevkit3.4.5-1安装安装步骤软件工具安装Ruby安装gem mysql2处理libmysql.dll验证mysql2安装步骤 软件工具 mysql-connector-c-6.1.11-winx64.zip rubyinstaller-devkit-3.4.5-1-x64.exe 安装Ruby 执行rubyinstaller-devkit-3.4.5-1-x64.exe&#xff0c;期间可…

社交工程:洞穿人心防线的无形之矛

在网络安全领域&#xff0c;一道无形的裂痕正在迅速蔓延。它不是复杂的零日漏洞&#xff0c;也不是精妙的恶意代码&#xff0c;而是利用人性弱点进行攻击的古老技艺——社交工程。当全球网络安全支出突破千亿美元大关&#xff0c;防火墙筑得越来越高&#xff0c;加密算法越来越…

Go 并发控制利器 ants 使用文档

https://github.com/panjf2000/ants1.1 什么是 ants ants 是一个高性能的 Go 语言 goroutine 池&#xff0c;它能复用已完成任务的 goroutine&#xff0c;避免频繁创建和销毁 goroutine&#xff0c;节省 CPU 与内存开销&#xff0c;并且能限制并发数量防止资源被耗尽。 1.2 安装…

Day57--图论--53. 寻宝(卡码网)

Day57–图论–53. 寻宝&#xff08;卡码网&#xff09; 今天学习&#xff1a;最小生成树。有两种算法&#xff08;Prim和Kruskal&#xff09;和一道例题。 prim 算法是维护节点的集合&#xff0c;而 Kruskal 是维护边的集合。 最小生成树&#xff1a;所有节点的最小连通子图&am…

解决海洋探测数据同步网络问题的新思路——基于智能组网技术的探索

随着海洋探测技术的不断发展&#xff0c;数据同步网络的稳定性和低延迟需求变得愈发重要。海洋探测数据来自多个分布式采集点&#xff0c;这些点需要高效的组网方式来实现实时数据传输。然而&#xff0c;由于海洋环境的特殊性&#xff08;如复杂的网络拓扑、高湿度和极端温度&a…

设计模式笔记_行为型_责任链模式

1. 责任链模式介绍责任链模式&#xff08;Chain of Responsibility&#xff09;是一种行为设计模式&#xff0c;它允许将多个处理器&#xff08;处理对象&#xff09;连接成一条链&#xff0c;并沿着这条链传递请求&#xff0c;直到有一个处理器处理它为止。职责链模式的主要目…

pygame的帧处理中,涉及键盘的有`pg.event.get()`与`pg.key.get_pressed()` ,二者有什么区别与联系?

一、pg.event.get() 返回的是一组事件 pg.event.get() 返回的是一组事件&#xff08;一个包含多个事件对象的列表&#xff09;。这是因为在游戏的“一帧”时间内&#xff08;通常1/60秒左右&#xff09;&#xff0c;用户可能会触发多个事件&#xff08;比如同时按下多个键、快速…

TF - IDF算法面试与工作常见问题全解析

在自然语言处理领域&#xff0c;TF - IDF算法是一个基础且重要的概念。无论是在求职面试还是在实际工作中&#xff0c;都经常会遇到与TF - IDF相关的问题。以下是一些常见的问题及其详细解答&#xff1a; 一、基本概念类问题 1. 什么是TF - IDF算法&#xff1f; TF - IDF&#…

Transformer网络结构解析

博主会经常分享自己在人工智能阶段的学习笔记&#xff0c;欢迎大家访问我滴个人博客&#xff01;&#xff08;都不白来&#xff01;&#xff09; 小牛壮士 - 个人博客https://kukudelin.top/ 前言 Transformer 广泛应用于自然语言处理&#xff08;如机器翻译、文本生成&…