机器学习代码笔记-核SVM

类别:个人机器学习笔记(数学推导见上传的手写PDF)
书籍参考:《机器学习实战》、《统计学习》、《机器学习》

任务:
学习线性SVM和非线性SVM的梯度下降方法。选取合适的参数(e.g. C=10, eta=0.001, sigma=0.1),并利用gaussian核进行上述数据集的非线性svm分类

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons

#数据初始化
m = 200
data, y = make_moons(n_samples=m, random_state=123,noise=0.1)
X = np.array(data)
y = np.array(y)
y=2*y-1

plt.figure()  #原始点集的类别图示
for i in range(len(y)):  
    if y[i]<1:
        plt.scatter(X[i][0],X[i][1],color='purple',marker='s')
    else:   
        plt.scatter(X[i][0],X[i][1],color='gold',marker='s')
plt.show()

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from math import exp

#绘制二维图像
plt.figure()
plt.show()


# 生成数据集(调用moon数据)

#生成高斯核函数
K = np.zeros((len(y),len(y)))             # K 是一个200*200的矩阵
sigma = 0.1
m = len(y)
for i in range(m):
    xi = X[i]
    for j in range(m):
        xj  = X[j]
        k=exp(-np.sum((xi-xj)**2)/(2*sigma**2))
        K[i][j] = k
#梯度下降法求解

C=10
eta=0.001
IterMax=10000
alpha=np.zeros(len(y))

for i in range(IterMax):
    eta=0.001/(i+1)
    index=(1-np.multiply(y,np.dot(K,alpha)))>0  
    alpha=alpha-eta*(-C*np.dot(K[index].T,y[index])+np.dot(K,alpha))
#z1=np.zeros(X[:,1].shape)
#for i in range(len(K)):
   #  z1  = z1+alpha[i]*(1+np.dot(X,X[i].T))**d
z1=np.dot(K,alpha)  #更简单的方法

plt.figure()
plt.plot(X[z1>0,0],X[z1>0,1],'ro')  #通过支持向量机核方法得到的分类数据点
plt.plot(X[z1<0,0],X[z1<0,1],'go')
plt.title("Guassian Kernel SVM")
plt.show()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值