分享

是时候该好好理解下核函数的作用及思想了【核函数 pyspark svm】

1.对于现行可分的数据集,我们又很多种划分超平面的方法将不同类别的数据区分开。当然对于线性不可分的数据集,可以通过核函数把低维的数据转换到更高的维度,这样就可以用超平面来划分了。先来看下线性可分的情形。
1.png
实际上对于线性可分的数据集,超平面有很多不同的方法,但是那种更好呢?对于前面的两幅图,可以看到支持向量到超平面的距离都很小,而对于这种情况很可能会送到异常数据的影响而影响分类的精度,例如在红色区域靠近蓝色的地方出现一个点,这个时候前面两种分类器自然会把这个点分到红色,而从经验来讲这个点更靠近蓝色点这边。因此我们要找到一个办法去既能实现对类别的划分,还能做到分类性能要好,SVM算法的思想就是找到离分离超平面最近的点使得这些最近的点到分离超平面的距离最远的参数W和b。
2.png
这个地方的
3.png
表示的核函数,利用这个核函数可以把低维的数据映射到更高的维度,常见的核函数有线性核、高斯核、径向基核函数等。不要被核函数这个恐怖的概念吓着了,其实他就是一个方法将低维数据映射到高维。例如[a,b]通过如下的映射[a^2,b^2,a,b ,ab]从2维就变成了5维了这样就把线性不可分的变成了线性可分的了。
4.png
其实对于高斯核函数它的作用也是类似的,使用高斯分布增大类间距离。
5.png
使用核函数还有很多好处,例如可以在低纬度完成高纬度中向量內积的计算。
6.png
要求就这样一个支持向量的问题,首先要找到优化的目标函数。
7.png
通过拉格朗日乘子法转换为min-max对偶问题既可以求解出w和b。

2.下面就来看下pyspark中使用SVM支持向量机来完成二分类。
from pyspark.ml.classification import LinearSVC
from pyspark.ml.evaluation import MulticlassClassificationEvaluatordata= spark.read.format("libsvm").load("/datas/lib_svm.txt")lsvc = LinearSVC(maxIter=10, regParam=0.1)
splits = data.randomSplit([0.6, 0.4], 1234)train = splits[0]test = splits[1]lsvcModel = lsvc.fit(train)
result = lsvcModel .transform(test)predictionAndLabels = result.select("prediction", "label")evaluator = MulticlassClassificationEvaluator(metricName="accuracy")print("Test set accuracy = " + str(evaluator.evaluate(predictionAndLabels)))
8.png
测试精度很高,到达了100%!


没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条