文章目录
摘要
项目: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 基本使用”三步“
-
创建路由
r := gin.Default() //创建使用带有Logger和 Recovery中间件的路由 r := gin.new() //创建没有带中间件的路由
-
定义请求方式
下面代码若向本地端口/get
发送get请求,则会返回JSON格式的数据"response": "hello"
r.GET("/get", func(c *gin.Context) { c.JSON(200, gin.H{ "response": "hello", }) })
-
开启端口监听
监听本地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/get
或127.0.0.1:8000/post
;
- get请求
- post请求
2、进阶
2.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 ax−y+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 ax1−x2+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 [a−1][x1x2]+b=0
用 w w w替代 [ a − 1 ] \left[ \begin{matrix} a& -1\\ \end{matrix} \right ] [a−1], 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 w∗w∗=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=∣∣w∣∣∣wx+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∗(w∗x+b)<0;如此得到损失函数为: