类别:个人机器学习笔记(数学推导见上传的手写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()