手写机器学习常见算法--支持向量机(二分类)

本文介绍了手写支持向量机(SVM)算法,使用了SMO优化算法,实现二分类任务。通过简化计算过程并进行向量化,提升效率。实验数据集为Iris的一部分,结果显示良好,适用于近似线性可分的数据集。
摘要由CSDN通过智能技术生成

借鉴了一些网上的资源,把一些计算过程向量化加快速度。
算法方面用的smo算法,内外层循环完整版,编程渣渣各位大佬勿喷
数据集用的iris数据集的一部分,结果看起来还可以,实际上这个数据应该是近似线性可分的,所以结果还行。

Backend TkAgg is interactive backend. Turning interactive mode on.
----训练集准确率:1.000000----
----测试集准确率:1.000000----

上代码

from pandas import DataFrame, Series
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import math
from sklearn.model_selection import train_test_split
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题


def load_data():
    from sklearn.datasets import load_iris
    iris = load_iris()
    train_X = DataFrame(iris['data']).loc[:99]
    train_Y = DataFrame(iris['target']).loc[:99]
    train_X.columns = ['x1', 'x2', 'x3', 'x4']
    train_Y.columns = ['y']
    train_Y[train_Y == 0] = -1
    # train_X = train_X.drop(['x3', 'x4'], axis=1)
    return train_X, train_Y
    # return pd.concat([train_X.iloc[:30, :], train_X.iloc[70:, :]]), pd.concat([train_Y.iloc[:30, :], train_Y.iloc[70:, :]])


class svm():
    def __init__(self, trainX, trainY, epison,C, maxiter, kernal):
        self.trainX = trainX
        self.trainY = trainY
        self.epison = epison
        self.C = C
        self.maxiter = maxiter
        self.kernal = kernal
        self.alpha = [0 for _ in range(trainX.shape[0])]
        self.b = 0.
        self.w = None


    def kernal_whole(self, x, y):
        x = x.values
        y = y.values
        if self.kernal == 'gauss':
            return np.exp(-0.5 * np
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值