WDK学习笔记—Gin框架_感知机

摘要

项目:Gin框架是Go语言中的框架,该框架是用来做后端服务器的一个高性能框架,可用该框架编写服务器的路由组,编写前后端分离项目的后端服务器;
机器学习:学习的是感知机的数学原理;感知机是用于分类任务的,目标是找到一个最好的面将数据分类,目前看的是二分类的,多分类下如何构造感知机的损失函数还未知;
毕业设计:学弟已掌握fabric网络的搭建,熟悉了go语言,掌握了编写简单的链码,写好了论文目录框架;


一、项目:

1、 Gin框架的基本使用

1.1 下载框架

go get -u github.com/gin-gonic/gin

1.2 导入框架

import "github.com/gin-gonic/gin"

1.3 基本使用”三步“

  1. 创建路由

    r := gin.Default()	//创建使用带有Logger和 Recovery中间件的路由
    r := gin.new()  //创建没有带中间件的路由
    
  2. 定义请求方式
    下面代码若向本地端口/get发送get请求,则会返回JSON格式的数据"response": "hello"

    r.GET("/get", func(c *gin.Context) {
          
          
    		c.JSON(200, gin.H{
          
          
    			"response": "hello",
    		})
    	})
    
  3. 开启端口监听
    监听本地127.0.0.1:8000端口(默认8080)

    r.Run(":8000")
    

1.4 一个小例子

定义GET、POST的请求方式,监听127.0.0.1:8000端口;

package main

import "github.com/gin-gonic/gin"

func main() {
    
    
	r := gin.Default()
	r.GET("/get", func(c *gin.Context) {
    
    
		c.JSON(200, gin.H{
    
    
			"response": "hello Get",
		})
	})

	r.POST("/post", func(c *gin.Context) {
    
    
		c.JSON(200, gin.H{
    
    
			"response": "hello Post",
		})
	})
	r.Run(":8000")
}

结果测试(测试用的是Postman软件,也可浏览器直接访问127.0.0.1:8000/get127.0.0.1:8000/post;

  1. get请求
    在这里插入图片描述
  2. post请求
    在这里插入图片描述

2、进阶

2.1 使用中间件

中间件是夹在响应中间的函数,在执行每个响应前,首先会执行中间间函数。

  1. 全局中间件
    r.Use(gin.Logger())
    

2.2 定义路由组

以下代码定义了一个路由组,v1/得到了复用,例如:
访问本地端口/v1/get1_2会返回"response":"get1_2"
访问本地端口/v1/post会返回"response":"post"

v := r.Group("v1/")
{
    
    
	v.Get("/get1_1", func(c *gin.Context){
    
    
		c.JSON(http.StatusOK, gin.H{
    
    
			"response":"get1_1",
		})
	})
	v.Get("/get1_2", func(c *gin.Context){
    
    
		c.JSON(http.StatusOK, gin.H{
    
    
			"response":"get1_2",
		})
	})
	v.post("/post", func(c *gin.Context){
    
    
		c.JSON(http.StatusOK, gin.H{
    
    
			"response":"post",
		})
	})
}

二、机器学习:

1. 感知机原理解析

1.1 将方程矩阵化

我们的目标是:找到一条最好的直线,将如下红蓝两类点分类。
在这里插入图片描述
如何找?设直线方程为:
y = a x + b y = ax + b y=ax+b
将其转换为:
a x − y + b = 0 ax - y + b = 0 axy+b=0
为了方便后面描述用符号 x 1 x_1 x1替换 x x x x 2 x_2 x2替换 y y y,得到:
a x 1 − x 2 + b = 0 ax_1 -x_2+b=0 ax1x2+b=0
转换为矩阵形式:
[ a − 1 ] [ x 1 x 2 ] + b = 0 \left[ \begin{matrix} a& -1\\ \end{matrix} \right ] \left[ \begin{matrix} x_1\\ x_2\\ \end{matrix} \right ] +b =0 [a1][x1x2]+b=0
w w w替代 [ a − 1 ] \left[ \begin{matrix} a& -1\\ \end{matrix} \right ] [a1] x T x^T xT代替 [ x 1 x 2 ] \left[ \begin{matrix} x_1\\ x_2\\ \end{matrix} \right ] [x1x2] r r r代替 b b b,得到:
w x + r = 0 wx+r=0 wx+r=0
此时的矩阵 w w w和直线有什么关系呢?直线斜率为 a a a,可以得到一个与原直线平行的向量 w ∗ = [ 1 a ] w^*=\left[ \begin{matrix} 1& a\\ \end{matrix} \right ] w=[1a],那么向量 w w w w ∗ w^* w的内积 w ∗ w ∗ = 0 w*w^*=0 ww=0,故向量 w w w w ∗ w^* w垂直,即向量 w w w与直线垂直,所以 w w w控制直线的斜率。而 r r r显然是截距,控制直线平移。

1.2 找最大的间隔 d d d

在这里插入图片描述
从高中数学知识中可以知道点到直线的距离公式为:
d = ∣ A x 0 + B y 0 + C ∣ A 2 + B 2 d=\frac{|Ax_0+By_0+C|}{\sqrt{A^2+B^2}} d=A2+B2 Ax0+By0+C
在我们构造的矩阵方程 w x + r = 0 wx+r=0 wx+r=0中, w w w中包含了A,B的信息,故此时点到直线方程可写为:
d = ∣ w x + r ∣ ∣ ∣ w ∣ ∣ d=\frac{|wx+r|}{||w||} d=wwx+r

1.3 定义损失函数

以二分类为例, x ( R n ) x(R^n) x(Rn) y ( − 1 , 1 ) y({-1, 1}) y(1,1),那么对于误分类的点有 y ∗ ( w ∗ x + b ) < 0 y*(w*x+b)<0 y(wx+b)<0;如此得到损失函数为:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sunningzhzh/article/details/122275374