前端机器学习——逻辑回归传送门 哈,如今咱们再跳回机器学习的入门模型——线性回归,上一波咱们使用逻辑回归完成了一个用户喜好颜色预测的功能,那么咱们此次就用线性回归完成一个将好多点拟合在一条线上的功能,嘿嘿,仍是蛮实用,echarts.js自己是自带这个功能的。javascript
咱们的目的就是求出这一系列的w。那么接下来就说怎么找到合适的w。html
function MyGetline(x, y) {
//咱们使用梯度降低法,因此要求梯度方向
const gradient = function(x, h, y) {
let g = []
for(let j = 0; j < x[0].length; j++) {
let c = 0
for(let i = 0; i < y.length; i++) {
c = c + x[i][j] * (h[i] - y[i])
}
c = c / y.length
g.push(c)
}
return g
}
//线性回归过程x,y是入参和输出数组,lr是学习率(沿梯度方向降低距离),count是重复次数
function Line_Regression(x, y, lr=0.000001, count=50000) {
let w = []
x.map(item => {
item.push(1)
})
for(let i = 0; i < x[0].length; i++) {
w.push(0)
}
for(let m = 0; m < count; m++) {
let z = []
for(let i = 0; i < x.length; i++) {
let item = 0
for(let j = 0; j < w.length; j++) {
item = item + x[i][j] * w[j]
}
z.push(item)
}
let g = gradient(x, z, y)
for(let i = 0; i < w.length; i++) {
w[i] = w[i] - lr * g[i]
}
}
return w
}
let w = Line_Regression(x,y)
//返回w系数
return w
}
复制代码
把下面的代码复制到echart.js的在线编辑器上去,就能够直接看效果而且随心修修改改了 (注:在3D散点图的实例提供的那个编辑界面有效,随便找个折线图实例进入编辑器是不行的哦 )前端
$.get(ROOT_PATH + 'data/asset/data/life-expectancy-table.json', function (data) {
let symbolSize = 2.5;
let mydata = []
let x = []
let y = []
for(let i=0; i<500; i++) {
let a = i * Math.random() * 10
let b = i * Math.random() * 10
let c = 9 * a + 14 * b + (Math.random() - 0.5) * i * 30
let item = []
item.push(a)
item.push(b)
item.push(c)
let xitem = []
xitem.push(a)
xitem.push(b)
x.push(xitem)
y.push(c)
mydata.push(item)
}
console.log(mydata)
option = {
grid3D: {},
xAxis3D: {},
yAxis3D: {},
zAxis3D: {},
dataset: {
source: mydata
},
series: [
{
type: 'scatter3D',
symbolSize: symbolSize
}
]
};
myChart.setOption(option);
//入参x是输入因变量数组,入参y是输出数组
function MyGetline(x, y) {
//梯度方向
const gradient = function(x, h, y) {
let g = []
for(let j = 0; j < x[0].length; j++) {
let c = 0
for(let i = 0; i < y.length; i++) {
c = c + x[i][j] * (h[i] - y[i])
}
c = c / y.length
g.push(c)
}
return g
}
//逻辑回归过程
function Line_Regression(x, y, lr=0.0000001, count=50000) {
let w = []
x.map(item => {
item.push(1)
})
for(let i = 0; i < x[0].length; i++) {
w.push(0)
}
for(let m = 0; m < count; m++) {
let z = []
for(let i = 0; i < x.length; i++) {
let item = 0
for(let j = 0; j < w.length; j++) {
item = item + x[i][j] * w[j]
}
z.push(item)
}
let g = gradient(x, z, y)
for(let i = 0; i < w.length; i++) {
w[i] = w[i] - lr * g[i]
}
// l = loss(h, y)
}
return w
}
let w = Line_Regression(x,y)
//使用求出的权重系数进行选择
console.log(w)
}
MyGetline(x,y)
});
复制代码