前端实现机器学习
机器学习越来越火,而作为一个不务正业的前端程序员!我当然要看一下这个机器学习,是个什么东西。
先说做什么
我们用机器学习可以做什么呢,他和我们前端有什么关系呢?
比方说我们做一个数据管理平台,老板要看数据情况,得到一些规律或者信息(几月赚钱多啊,卖啥赚钱多啊,下个月销售量估计怎样啊),这个时候后段给了你以前每一天的各种数据,某某日,啥啥啥,咋咋地买的好不好。我们不可能就给老板看这些点,像个芝麻烧饼一样。所以我们就需要用到机器学习,将这些点拟合成一条合适的线(最简单的线性回归),就显得很好。(别问为啥不是后端返回来线的截距和斜率,问就是自食其力),下面的我就举一个小栗子,写一个小demo,通过你不断选择色块,分析你喜欢的颜色特征,来预测在下一个色块的选择中你的选择是?
再说怎么做
我是照着python代码手撸的js版本,其实没有什么难度,js与python相比,由于没有矩阵,我使用的是二维数组遍历进行运算的,其他也没什么,下面话不多说,直接贴代码。
python代码
// python代码
import numpy as np
def sigmoid(z):
sigmoid = 1.0 / (1.0 + np.exp(-z))
return sigmoid
# 梯度方向
def gradient(X, h, y):
gradient = np.dot(X.T, (h - y)) / y.shape[0]
return gradient
# 逻辑回归过程
def Logistic_Regression(x, y, lr=0.05, count=200):
intercept = np.ones((x.shape[0], 1)) # 初始化截距为 1
x = np.concatenate((intercept, x), axis=1)
w = np.zeros(x.shape[1]) # 初始化参数为 0
for i in range(count): # 梯度下降迭代
z = np.dot(x, w) # 线性函数
h = sigmoid(z)
g = gradient(x, h, y) # 计算梯度
w -= lr * g # 通过学习率 lr 计算步长并执行梯度下降
return w # 返回迭代后的梯度和参数
//这是我手动选择色块得到的假数据,为什么是三维呢?因为我只存了两个色块三原色的差值
x = np.array([
[-255, -255, -255],
[-12, 43, -89],
[-42, -25, 102],
[7, 202, 81],
[142, -67, -120],
[100, 52, -6],
[-19, -41, -24],
[-108, 179, 78],
[-192, 166, 27],
[80, -30, -47],
[53, 38, 140]
])
y = np.array([1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0])
w = Logistic_Regression(x, y)
javascript代码
// js代码
// 这个是假数据,注释掉了,因为把它整体封装成了一个方法
// const x = [
// [-255, -255, -255],
// [-12, 43, -89],
// [-42, -25, 102],
// [7, 202, 81],
// [142, -67, -120],
// [100, 52, -6],
// [-19, -41, -24],
// [-108, 179, 78],
// [-192, 166, 27],
// [80, -30, -47],
// [53, 38, 140]
// ]
// const y = [1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0]
// const z = [-30, 100, -66]
// 入参x是之前色块的数据矩阵(条件),y是选择矩阵(结果),z是最后选择时色块的色差(最新条件)
export const MySigmod = function(x, y, z) {
//sigmod函数