ml-疑惑之处

1.

尝试使用线性回归和岭回归来耍耍,但效果不咋地
特别是正则项c的取法,奇怪的一批
我觉得可以再那边的y上面动文章,可是不知咋弄
还有,岭回归的函数究竟是什么(不是损失函数 J 那个),和原本的线性函数没区别是吗

import numpy as np
import matplotlib.pyplot as plt
x = np.array([
    [3, 1],
    [2, 5],
    [1, 8],
    [6, 4],
    [5, 2],
    [3, 5],
    [5, 7],
    [4, -1]])
y = np.array([0, 1, 1, 0, 0, 1, 1, 0])
l, r = x[:, 0].min() - 1, x[:, 0].max() + 1
b, t = x[:, 1].min() - 1, x[:, 1].max() + 1
n = 500
grid_x, grid_y = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n))
grid_z = np.piecewise(grid_x, [grid_x>grid_y, grid_x<grid_y], [1, 0])

plt.figure('Simple Classification', facecolor='lightgray')
plt.title('Simple Classification', fontsize=20)
plt.xlabel('x', fontsize=14)
plt.ylabel('y', fontsize=14)
plt.tick_params(labelsize=10)
plt.pcolormesh(grid_x, grid_y, grid_z, cmap='gray')
plt.scatter(x[:, 0], x[:, 1], c=y, cmap='brg', s=80)


#下面尝试用线性回归的方法来试试
#没啥就是觉得好玩
#我再确认一下这个y要么0要么1是干什么用的
#只是一个代表,表示x1>x2->0,x1<x2->1
#y=kx+b, distance=|kx0+b-y0|/(k**2+1)**1/2
#loss=(kx0+b-y0)**2/(k**2+1)
#原始的好像不大行,要不考虑下加入c*y来判定,类似岭回归?
#玩不了,这个不知道怎么把y=-1+1加进去
lr=0.001
times=1000
w=2
b=2
x1=x[:,0]
x2=x[:,1]
c=-5
z=y
y=x2
x=x1
size=int(len(x))
# w=argmin(J(w)=(x.T+c*i).(-1)*x.T*y
#J=(y-w*x)**2+c*w*w
for i in range(times):
    loss=0
    loss=((y-w*x)**2+c*w*w).sum()
    d_k=((-2)*x*(y-w*x)+2*c*w).sum()
    d_b=(2*(y-w*x+b)).sum()
    w=w-d_k*lr
    b=b-d_b*lr
print(loss)
print(w,b)
x1=x
x2=y
x1_max=x1.max()
x1_min=x1.min()
test_x=np.linspace(x1_min,x1_max,100)
x1=test_x
pred_test_y=w*test_x+b
plt.title('try')
plt.plot(test_x, pred_test_y, '--', c='limegreen', label='Regression', linewidth=1)
plt.legend()
plt.show()

在这里插入图片描述

2.关于正向激励和特征重要性排序的实现

真的是这样弄吗
在这里插入图片描述

3.这是逻辑分类失败的结果

这里的奇怪之处在于结果
https://zhuanlan.zhihu.com/p/74874291

loss function采用的是这个
我的理解是y=w0+w1x1+w2x2
然后用的梯度下降法
但结果差异很大
在这里插入图片描述

import numpy as np
import math
import matplotlib.pyplot as mp


def loss_func(w0,w1,w2,x,y):
    x1 = x[:, 0]
    x2 = x[:, 1]
   # print('hello!!!!!!')
   # print('x1',x1)
   # print('x2',x2)
   # print('y',y)
    size_x=int(len(x))
   # print('size_x',size_x)
    fina=0
    e_y=0
    #sum
    for i in range(size_x):
        e_y=0
        p_y_1=0
       # print('i', i)
       # print('w0',w0,'w1',w1,'w2',w2)
       # print('x1[i]', x1[i])
        e_y = w0 + w1 * x1[i] + w2 * x2[i]
        e_y=(-1)*e_y
        #print('e_y:',e_y)

        p_y_1 = 1 / (1 + np.math.exp(e_y))
      #  print('p_y_1',p_y_1)
       # print('YYYYY'*50)


        times_1=math.log(p_y_1)
        temp=1-p_y_1
       # print('times1', times_1)
       # print('temp',temp)
        times_2=math.log(temp)


      #  print('times1',times_1)
       # print('times2',times_2)
        fina = y[i] * times_1 + (1 - y[i]) * times_2+fina
       # print('fina',fina)
       # print('_' * 50)
   # print('*'*50)
    return fina

#y=w0+w1*x1+w2*x2
def model_lr(x,y,times,lr=0.001,w0=1,w1=1,w2=1):
    size_x=int(len(x))
    #p(xi)表示什么
    x1=x[:,0]
    x2=x[:,1]
    loss_last=0
    loss_now=0
    for i in range(times):
       # print('round##########'*50)
       # print('round',i)
        loss_pre = loss_func(w0=w0,w1=w1,w2=w2,x=x,y=y)
       # print('loss_ready&&&&&&'*10)
        loss_last = (-1) * loss_pre / size_x
        # p_x表示x对应的y=1的概率

        d_w_0 = 0
        d_w_1 = 0
        d_w_2 = 0
        for j in range(size_x):
            e_x=0
            e_x = w0 + w1 * x1[j] + w2 * x2[j]
            e_x = (-1) * e_x
            e_x = math.exp(e_x)
            print('times:{:} size:{:} e_x'.format(i,j),e_x)
            d_w_0 = d_w_0+(y[j] * e_x / (1 + e_x))+ (1-y[j]) * e_x / (((e_x +1)**2) + (e_x +1))
            d_w_1 = d_w_1+d_w_0 * x1[j]
            d_w_2 = d_w_2+d_w_0 * x2[j]
        print('d_w_0',d_w_0)
        print('d_w_1',d_w_1)
        print('d_w_2',d_w_2)
        w0=w0-lr*d_w_0
        w1=w1-lr*d_w_1
        w2=w2-lr*d_w_2

        loss_now=loss_func(w0,w1,w2,x,y)
        loss_gap=abs(loss_now-loss_last)
        print('loss_now',loss_now)
        print('times:{:} size:{:} loss_gap'.format(i,j),loss_gap)
        if loss_gap>50:
            break


    print('w0',w0)
    print('w1', w1)
    print('w2', w2)
    return w0,w1,w2


def model_pred(w0,w1,w2,x):
    x1=x[:,0]
    x2=x[:,1]
    e_x = w0 + w1 * x1 + w2 * x2
    e_x = (-1) * e_x
    e_x = math.exp(e_x)

    sigmoid_result=1/(1+e_x)

    return sigmoid_result

#return  z
def jug(samples,size_x, num,model_w_list,y_list):
    jug_array=np.arange(size_x*num).reshape(size_x,num)
    for j in range(size_x):
        for i in range(num):
            #model = model_list[i]
            w0,w1,w2=model_w_list[i][0],model_w_list[i][1],model_w_list[i][2]
            t=[[]]
            t[0]=samples[j]
            sample_in=np.array(t)
            jug_array[j][i]=model_pred(w0=w0,w1=w1,w2=w2,x=sample_in)

    fin_array=np.arange(size_x*1).reshape(size_x,1)
    #y_list中的顺序以及确切数字
    z_pre=[]
    z=[]
    for k in range(size_x):
        a=jug_array[k,:]
        a_f=a.argsort()[::-1]
        #顺序数字
        z_pre.append(a_f[0])
        #得到对应数字
    for i in range(int(len(z_pre))):
        pos=z_pre[i]
        z.append(y_list[pos])
    return z


x = np.array([
    [3, 1],
    [2, 5],
    [1, 8],
    [6, 4],
    [5, 2],
    [3, 5],
    [4, 7],
    [4, -1]])
y = np.array([0, 1, 1, 0, 0, 1, 1, 0])
#print(y)
y_list=list(set(y))
#print(y_list)
num=int(len(set(y)))
#print(num)
size_x=int(len(x))
#print(size_x)
model_list=[]
# 逻辑分类器
# 每一个分类器都得到训练

#train
#w0 w1 w2
model_w_list=np.arange(num*3).reshape(num,3)
for i in range(num):
    print('round',i)
    #exec(f'model_{i} = lm.LogisticRegression(solver=\'liblinear\')')
    chara = y_list[i]
    #print('y',y)
    #y_new = np.where(y ==chara,1,0)
    #y_new=np.array(y_new).ravel()
    #print('y_new',y_new)
    model_w_list[i][0],model_w_list[i][1],model_w_list[i][2]=model_lr(x,y,times=300)
    #print('/'*50)
#print(len(set(list)))
#y=w0+w1*x1+w2*x2
#分类器的话,是不是相符的给1,不相符的给0这样


l, r = x[:, 0].min() - 1, x[:, 0].max() + 1
b, t = x[:, 1].min() - 1, x[:, 1].max() + 1
n = 500

grid_x, grid_y = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n))
samples = np.column_stack((grid_x.ravel(), grid_y.ravel()))

size_x=int(len(grid_x))
grid_z=jug(samples,size_x,num,model_w_list=model_w_list,y_list=y_list)
print('grid_z',grid_z)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值