尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

机械学习-SVM

机械学习-SVM SVM 支持向量机原理 算法步骤 代码 Sklearn API定义SVMSupport Vector Machine支持向量机在高维空间中寻找最优超平面划分两类样本使两类样本到超平面的最小距离间隔 Margin最大化原理1.落在间隔边界上的样本点称为支持向量决定超平面位置2.通过核函数解决线性不可分问题把低维非线性数据映射到高维空间实现线性可分。核心思想1.硬间隔线性完全可分严格无错分2.软间隔允许少量样本错分引入惩罚系数 C 平衡间隔大小与错分代价3.核技巧不用显式计算高维映射通过核函数内积运算降低计算量。数学公式分离超平面与几何间隔wTxb0 \boldsymbol{w}^T \boldsymbol{x} b 0wTxb0γiyi(wTxib)∥w∥ \gamma_i \frac{y_i(\boldsymbol{w}^T \boldsymbol{x}_i b)}{\|\boldsymbol{w}\|}γi​∥w∥yi​(wTxi​b)​硬间隔SVM原始优化问题min⁡w,b12∥w∥2s.t.yi(wTxib)≥1,i1,2,…,N \begin{aligned} \min_{\boldsymbol{w},b}\quad \frac12 \|\boldsymbol{w}\|^2 \\ \text{s.t.}\quad y_i(\boldsymbol{w}^T \boldsymbol{x}_i b) \ge 1,\quad i1,2,\dots,N \end{aligned}w,bmin​s.t.​21​∥w∥2yi​(wTxi​b)≥1,i1,2,…,N​软间隔SVM带惩罚系数Cmin⁡w,b,ξ12∥w∥2C∑i1Nξis.t.yi(wTxib)≥1−ξiξi≥0 \begin{aligned} \min_{\boldsymbol{w},b,\xi}\quad \frac12 \|\boldsymbol{w}\|^2 C\sum_{i1}^N \xi_i \\ \text{s.t.}\quad y_i(\boldsymbol{w}^T \boldsymbol{x}_i b) \ge 1-\xi_i \\ \xi_i \ge 0 \end{aligned}w,b,ξmin​s.t.​21​∥w∥2Ci1∑N​ξi​yi​(wTxi​b)≥1−ξi​ξi​≥0​对偶求解目标核函数形式max⁡α∑i1Nαi−12∑i1N∑j1NαiαjyiyjK(xi,xj) \max_{\alpha}\quad \sum_{i1}^N \alpha_i - \frac12\sum_{i1}^N\sum_{j1}^N \alpha_i\alpha_j y_i y_j K(\boldsymbol{x}_i,\boldsymbol{x}_j)αmax​i1∑N​αi​−21​i1∑N​j1∑N​αi​αj​yi​yj​K(xi​,xj​)常用核函数线性核K(xi,xj)xiTxj K(\boldsymbol{x}_i,\boldsymbol{x}_j) \boldsymbol{x}_i^T \boldsymbol{x}_jK(xi​,xj​)xiT​xj​高斯RBF核默认K(xi,xj)exp⁡(−γ∥xi−xj∥2) K(\boldsymbol{x}_i,\boldsymbol{x}_j) \exp\big(-\gamma \|\boldsymbol{x}_i - \boldsymbol{x}_j\|^2\big)K(xi​,xj​)exp(−γ∥xi​−xj​∥2)最终分类决策函数f(x)sign(∑i∈SVαiyiK(xi,x)b) f(\boldsymbol{x}) \text{sign}\left( \sum_{i\in SV} \alpha_i y_i K(\boldsymbol{x}_i,\boldsymbol{x}) b \right)f(x)sign(i∈SV∑​αi​yi​K(xi​,x)b)**注意**SVM 对特征尺度极度敏感使用前必须做 StandardScaler 标准化否则距离计算失效效果极差。代码演示importnumpyasnpimportpandasaspd# 绘制可视化混淆矩阵defcm_plot(y,yp):fromsklearn.metricsimportconfusion_matriximportmatplotlib.pyplotasplt cmconfusion_matrix(y,yp)plt.matshow(cm,cmapplt.cm.Blues)plt.colorbar()forxinrange(len(cm)):foryinrange(len(cm)):plt.annotate(cm[x,y],(x,y),horizontalalignmentcenter,verticalalignmentcenter)plt.ylabel(True label)plt.xlabel(Predicted label)returnplt数据标准化Z标准化#导入数据datapd.read_csv(C:\\Users\\futingjian\\PycharmProjects\\futingjian\\AI\\学生宿舍\\datingTestSet2.txt,sep\t,headerNone,names[x1,x2,x3,y])fromsklearn.preprocessingimportStandardScaler#分离数据并作标准化scalerStandardScaler()adata[[x1,x2,x3]]data[[x1,x2,x3]]scaler.fit_transform(data[[x1,x2,x3]])fromsklearn.model_selectionimporttrain_test_split xdata.drop(y,axis1)ydata.y x_train,x_test,y_train,y_testtrain_test_split(x,y,test_size0.2,random_state0)#交叉验证fromsklearn.svmimportSVCfromsklearn.model_selectionimportcross_val_score#交叉验证函数#交叉验证选择较优惩罚因子scores[]param_pairs[]c_param_range[0.01,0.1,1,10,100]c_param_range1[0.001,0.01,0.1,1]c_param_range2[rbf,linear]foriinc_param_range:forjinc_param_range1:forkinc_param_range2:lrSVC(Ci,gammaj,kernelk)scorecross_val_score(lr,x_train,y_train,cv8,scoringaccuracy)score_meansum(score)/len(score)scores.append(score_mean)print(score_mean)param_pairs.append([i,j,k])max_idxnp.argmax(scores)best_a,best_b,best_kparam_pairs[max_idx]print(..........最优惩罚因子{},{},{}.format(best_a,best_b,best_k))#导入模型lrSVC(Cbest_a,gammabest_b,kernelbest_k)#训练模型lr.fit(x_train,y_train)#自测fromsklearnimportmetrics train_predictedlr.predict(x_train)print(metrics.classification_report(y_train,train_predicted))cm_plot(y_train,train_predicted).show()# 使用测试集测试test_predictedlr.predict(x_test)print(metrics.classification_report(y_test,test_predicted,digits6))cm_plot(y_test,test_predicted).show()APISVM Sklearn API 汇总表格SVC 分类 与 SVR 回归对比| 项目 | SVC 支持向量分类器 | SVR 支持向量回归器 || ---- | ---- | ---- || 导入语句 |from sklearn.svm import SVC|from sklearn.svm import SVR|| 任务类型 | 离散类别分类 | 连续数值回归 || score 返回值 | 分类准确率 | R²拟合优度 || 预处理要求 | 特征标准化 | 特征标签均需标准化 |核心通用超参数| 参数名 | 参数作用 | 使用说明 || ---- | ---- | ---- || kernel | 选择核函数 | rbf(高斯默认)、linear、poly、sigmoid || C | 惩罚系数 | C越大越不允许错分易过拟合 || gamma | RBF核系数 | 控制高维映射复杂度 || random_state | 随机种子 | 固定实验结果可复现 |通用API方法| 方法 | 功能 | 示例 || ---- | ---- | ---- || fit() | 训练模型 | model.fit(X_train, y_train) || predict() | 执行预测 | model.predict(X_test) || score() | 评估指标 | model.score(X_test, y_test) || n_support_ | 查看支持向量数量 | model.n_support_ |
返回列表