首页 > 编程语言 >机器学习(七):梯度下降解决分类问题——perceptron感知机算法与SVM支持向量机算法进行二维点分类

机器学习(七):梯度下降解决分类问题——perceptron感知机算法与SVM支持向量机算法进行二维点分类

时间:2023-04-26 11:23:33浏览次数:43  
标签:clf 分类 感知机 算法 np x0 x1 self

实验2 感知机算法与支持向量机算法

一、预备知识

1.感知机算法

二、实验目的

  1. 掌握感知机算法的原理及设计;

  2. 掌握利用感知机算法解决分类问题。

三、实验内容

  1. 设计感知机算法求解,
  1. 设计SVM算法求解(可调用函数库),请找出支持向量和决策超平面。

四、操作方法和实验步骤

1.感知机算法求解

采用while循环判断当前权重w和截距b是否会产生误分类点,如果不产生误分类则直接返回w和b.

import numpy as np
def percep_classify_array(data_arr,label_arr,eta=0.1):
    w=np.array([0,0])
    b=0
    m=len(data_arr)
    error_data = True
    while error_data:               #利用收敛特性不采用迭代方式进行,采用while循环
        error_data = False
        for i in range(m):
            judge = label_arr[i]*(np.dot(w,data_arr[i])+b)
            if judge <=0:
                error_data=True
                w=w+eta*(label_arr[i]*data_arr[i])
                b=b+eta*label_arr[i]
                print('w=',w,'b=',b,'误分类点:x_'+str(i+1))

    return w,b
input_vecs = [[-3,3],[-5,2],[2,4],[3,2]]
input_labels = [[1],[1],[-1],[-1]]
input_vecs = np.array(input_vecs)
input_labels = np.array(input_labels)
weight,bias = percep_classify_array(input_vecs,input_labels)
print('weight=',weight,'bias=',bias,'没有误分类点了')

结果:

w= [-0.3  0.3] b= [0.1] 误分类点:x_1
w= [-0.5 -0.1] b= [0.] 误分类点:x_3
weight= [-0.5 -0.1] bias= [0.] 没有误分类点了

2.SVM算法求解

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

class SVM:
    def __init__(self, learning_rate=0.001,lambda_param=0.0001,n_iters=10000):
        self.a=learning_rate
        self.lambda_param=lambda_param
        self.epoch=n_iters
        self.w=None
        self.b=None

    def fit(self,X,y):
        n_samples,n_features=X.shape
        y_=np.where(y<=0,-1,1)

        self.w=np.zeros(n_features)
        self.b=0
        for epoch in range(self.epoch):
            for idx,x_i in enumerate(X):
                condition=y_[idx]*(np.dot(x_i,self.w)-self.b)>=1
                if condition:
                    self.w=self.w-self.a*(2*self.lambda_param*self.w)
                else:
                    self.w=self.w-self.a*(2*self.lambda_param*self.w-np.dot(x_i,y_[idx]))
                    self.b=self.b-self.a*y_[idx]

    def predict(self,X):
        linear_output=np.dot(X,self.w)-self.b
        return np.sign(linear_output)
#模拟数据
# X,y=datasets.make_blobs(n_samples=50,n_features=2,centers=2,cluster_std=1.05,random_state=40)
# y=np.where(y==0,-1,1)
#题目数据
X = np.array([[-3, 3], [-5, 2], [2, 4], [3, 2]])
y = np.array([1, 1, -1, -1])
clf=SVM()
clf.fit(X,y)
print(clf.w,clf.b)

def visualize_svm():
    def get_hyperplane_value(x,w,b,v):
        return (-w[0]*x-b+v)/w[1]
    fig=plt.figure()
    ax=fig.add_subplot(1,1,1)
    plt.scatter(X[:,0],X[:,1],marker='o',c=y)
    # x0_1=np.amin(X[:,0])
    # x0_2=np.amax(X[:,0])
    x0_1=-6
    x0_2=6
    x1_1=get_hyperplane_value(x0_1,clf.w,clf.b,0)
    x1_2=get_hyperplane_value(x0_2,clf.w,clf.b,0)
    x1_1_m=get_hyperplane_value(x0_1,clf.w,clf.b,-1)
    x1_2_m=get_hyperplane_value(x0_2,clf.w,clf.b,-1)
    x1_1_p=get_hyperplane_value(x0_1,clf.w,clf.b,1)
    x1_2_p=get_hyperplane_value(x0_2,clf.w,clf.b,1)
    ax.plot([x0_1,x0_2],[x1_1,x1_2],'r--')
    ax.plot([x0_1,x0_2],[x1_1_m,x1_2_m],'b')
    ax.plot([x0_1,x0_2],[x1_1_p,x1_2_p],'b')
    plt.axhline(y=0, color='gray', linestyle='--')
    plt.axvline(x=0, color='gray', linestyle='--')
    # x1_min=np.amin(X[:,1])
    # x1_max=np.amax(X[:,1])
    # ax.set_ylim([x1_min-3,x1_max+3])
    plt.xlim(-6, 6)
    plt.ylim(-6, 6)
    plt.show()

visualize_svm()

结果:

[-0.38987422 -0.05357053] 0.007

标签:clf,分类,感知机,算法,np,x0,x1,self
From: https://www.cnblogs.com/ranxi169/p/17355066.html

相关文章

  • pid算法函数实现,c语言版
     #include<stdio.h>floatpid(floatsetpoint,floatprocess_variable,floatkp,floatki,floatkd,floatdt,float*integral,float*last_error){//Calculateerrorfloaterror=setpoint-process_variable;//Calculateintegral......
  • 滑动窗口算法实现分布式第三方请求限频
    一.业务背景 第三方服务接口存在频率调用限制(例如,1s5次,超过5次返回超出频率),己方服务存在并发处理的情况,为了保证服务的成功率,且达到第三方限制的最大吞吐量,故需要一个限频调用的算法二.实现思路常见限频算法一般有五种,漏桶算法、令牌桶算法、固定窗口算法,滑动窗口算法,漏斗算......
  • 基于ICP配准算法的三维点云数据的匹配仿真
    1.算法仿真效果matlab2022a仿真结果如下:       2.算法涉及理论知识概要       ICP算法能够使不同的坐标下的点云数据合并到同一个坐标系统中,首先是找到一个可用的变换,配准操作实际是要找到从坐标系1到坐标系2的一个刚性变换。ICP算法本质上是基于最小......
  • m基于LOC-PCA算法的人脸重建算法matlab仿真,给定人物侧脸实现正脸重建
    1.算法仿真效果matlab2022a仿真结果如下:       2.算法涉及理论知识概要      提出了一种有效的图像姿态合成方法。姿势合成用于预测在给定姿势的期望姿势处具有最小误差的面部图像。在许多情况下,这是经常需要的例如动画电影的制作、法医学和3D人脸几......
  • ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测|附代码数据
    全文下载链接:http://tecdat.cn/?p=12174最近我们被客户要求撰写关于ARMA-EGARCH的研究报告,包括一些图形和统计输出。本文比较了几个时间序列模型,以预测SP500指数的每日实际波动率。基准是SPX日收益序列的ARMA-EGARCH模型。将其与GARCH模型进行比较 。最后,提出了集合预测算法......
  • 【优化指派】基于禁忌搜索算法求解指派优化问题(耗时最短)附Matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 【LSSVM时序预测】基于被囊群算法优化最小支持向量机TSA-LSSVM实现交通流数据预测附Ma
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 基于Haar分类和五官验证的人脸识别
    访问【WRITE-BUG数字空间】_[内附完整源码和文档]AdaBoost算法是1995年提出的一种快速人脸检测算法,是人脸检测领域里程碑式的进步,这种算法根据弱学习的反馈,适应性地调整假设的错误率,使在效率不降低的情况下,检测正确率得到了很大的提高。摘要:人脸检测是人脸分析的首要环节,其处理......
  • 决策树算法总结
    决策树(DecisionTree)决策树是一种树形结构,以信息熵为度量构造一棵熵值下降最快的树,它每个内部节点表示在某个特征上的分割使得分割前后熵值下降最快,到叶子结点处的熵值为零,此时每个叶结点中的样本都被归为同一类(训练时叶结点中数据的真实类别未必为同一类)。决策树算法递归的选择......
  • 算法学习day07哈希表part02-454、383、15、18
    packageLeetCode.hashpart02;importjava.util.HashMap;importjava.util.Map;/***454.四数相加II*给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:*0<=i,j,k,l<n*nums1[i]+nums2[j]+nums......