偷懒找了UCI上最小的一个数据集,数据大约是集装箱起重机的转动速度、角度,判断其力量大小(我不懂起重机啊啊啊)

虽然不懂但并不妨碍写代码分类,显然标记就是力量,分为0.3、0.5、0.7三种。具体的模型学习还是使用对率回归,那么数据集如下。

x=np.array([[1,2,6,7,10,8,3,1,6,7,8,9,9,2,6],[-5,5,-2,2,-2,2,-2,2,-5,5,-5,5,0,0,0],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]])
y=np.array([0.3,0.3,0.3,0.3,0.3,0.3,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.7,0.7])

因为是多分类问题所以我们要建立多个分类器,这次使用OvR的方法,建立三个分类器也就是要计算出三组参数的值:

b=np.array([[0],[0],[1]])
b1=np.array([[0],[0],[1]])
b2=np.array([[0],[0],[1]])
b3=np.array([[0],[0],[1]])

b是用于计算的时候暂存参数。既然是十折交叉法,那我们每次就取两个样本作为测试集,为了方便计算,每次的训练集我们赋值到另外两个矩阵上,先在全局初始化它们:

x1=np.zeros(shape=(3,13))
y1=np.arange(0,13)

注意这里的y1不能用zeros初始化,否则编译器认为这个y1的shape是(0,13),会报错,非常要命(躺)。

求参数的主体函数基本不用动,稍微改下参数名以防重复即可:

def fd():
b11 = 0
for i in range(13):
k=np.exp(np.dot(b.T,np.array([x1[:,i]]).T))
b11=b11-np.array([x1[:,i]])*( y1[i]-(k/(1+k)))
return b11 def sd():
b22 = 0
for i in range(13):
k = np.exp(np.dot(b.T,np.array([x1[:,i]]).T))
b22=b22+np.dot(np.array([x1[:,i]]).T,np.array([x1[:,i]])) * (k/(1+k)) * (1-(k/(1+k)))
return b22 def form():
mae=0
ima=0
b = np.array([[0], [0], [1]])
while(1):
ima=0
for i in range(13):
k=np.dot(b.T,np.array([x1[:,i]]).T)
ima=ima+(-y1[i]*k+np.log(1+np.exp(k)))
if(np.abs(ima-mae)<=0.0001):
break
mae=ima
b11=fd()
b22=sd()
b=b-np.dot(linalg.inv(b22),b11.T)
return b

然后每次OvR我们要对y1进行重新赋值,将值按要求修改为1和0:

def sety(tru):
for k in range(13):
if (y1[k] == tru):
y1[k] = 1
else:
y1[k] = 0
return

tru就是该分类器应当分类为真值的y的原值。

而后为了判断每个分类器的正确率,需要另写一个函数,这里写的这个函数只判断对于单个样本(在全集中的序列号为i)的正误,显然的,

只要应当判断其为1的分类器出错就可以直接确定其出错,虽然这种操作还是有一定风险的(如果其他分类器也判断该例为正该怎么算),

但偷懒就这么写了。

def judg(i):
s0=0.0
if (y[i] == 0.3):
z = np.exp(np.dot(b1.T, np.array([x[:, i]]).T))
elif (y[i] == 0.5):
z = np.exp(np.dot(b2.T, np.array([x[:, i]]).T))
else:
z = np.exp(np.dot(b3.T, np.array([x[:, i]]).T))
if (z > 0):
z=1
else:
z=0
return z

然后就是每次抽取训练集的函数,也就是从x、y中删掉指定两列之后赋值给x1、y1的函数:

def delex(i,j):
k=0
for f in range(15):
if(f!=i and f!=j):
x1[:,k]=x[:,f]
k=k+1
return def deley(i,j):
k = 0
for f in range(y.size):
if (f != i and f != j):
y1[k] = y[f]
k = k + 1
return

主函数如下:

s=0.0
for i in range(15):
for j in range(i+1,15):
s0=0.0
delex(i,j)
deley(i,j)
sety(0.3)
b1=form()
deley(i,j)
sety(0.5)
b2=form()
deley(i,j)
sety(0.7)
b3=form()
s=s+(judg(i)+judg(j))/2
print('第',i,'个与第',j,'个作为测试集时的正确率暂时总和为',s)
s=s/105
print('正确率为:',s)

运行结果:

第 0 个与第 1 个作为测试集时的正确率暂时总和为 1.0...(略)
第 13 个与第 14 个作为测试集时的正确率暂时总和为 105.0
正确率为: 1.0

留一法同理,修改一下参数数量和一些数字就行,编译器作怪的话可以加一些跳出条件。

补充另一个数据集的读取文件然后进行计算的代码,虽然没有error但是跑了一顿午饭也没跑出什么结果,卡无限循环了,改了个条件终于跑出结果,姑且摆在这里看看。

import numpy as np
from numpy import linalg
import math
import scipy x=np.ones(shape=(14,178))
y=np.arange(0,178)
x1=np.ones(shape=(14,176))
y1=np.arange(0,176)
b=np.array([[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[1]])
b1=np.array([[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[1]])
b2=np.array([[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[1]])
b3=np.array([[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[1]]) def readdata():
k=0
file=open('C:\\Users\\33298\\Desktop\\data\\2\\winedata.txt','r')
for line in file.readlines():
clas,alcohol,malic,ash,alcalin,magne,t_phenols,flava,nonfla,proantho,color,hue,od,proli=line.split(',')
#print(clas,alcohol,malic,ash,alcalin,magne,t_phenols,flava,nonfla,proantho,color,hue,od,proli)
x[:,k]=np.array([alcohol,malic,ash,alcalin,magne,t_phenols,flava,nonfla,proantho,color,hue,od,proli,1]).T
y[k]=clas
k=k+1
return def fd():
b11 = 0
for i in range(176):
k = np.exp(np.dot(b.T, np.array([x1[:, i]]).T))
b11 = b11 - np.array([x1[:, i]]) * (y1[i] - (k / (1 + k)))
return b11 def sd():
b22 = 0
for i in range(176):
k = np.exp(np.dot(b.T, np.array([x1[:, i]]).T))
b22 = b22 + np.dot(np.array([x1[:, i]]).T, np.array([x1[:, i]])) * (k / (1 + k)) * (1 - (k / (1 + k)))
return b22 def form():
mae = 0
ima = 0
b=np.array([[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[1]])
num=10
while (num):
ima = 0
for i in range(176):
k = np.dot(b.T, np.array([x1[:, i]]).T)
if(k>1):
ima=ima+np.log(1+np.exp(-k))
else:
ima = ima + (-y1[i] * k + np.log(1 + np.exp(k)))
if (np.abs(ima - mae) <= 0.000001):
break
mae = ima
b11 = fd()
b22 = sd()
b = b - np.dot(linalg.inv(b22), b11.T)
num-=1
return b def sety(tru):
for k in range(13):
if (y1[k] == tru):
y1[k] = 1
else:
y1[k] = 0
return def judg(i):
s0 = 0.0
if (y[i] == 1):
z = np.exp(np.dot(b1.T, np.array([x[:, i]]).T))
elif (y[i] == 2):
z = np.exp(np.dot(b2.T, np.array([x[:, i]]).T))
else:
z = np.exp(np.dot(b3.T, np.array([x[:, i]]).T))
if (z > 0):
z = 1
else:
z = 0
return z def delex(i, j):
k = 0
for f in range(178):
if (f != i and f != j):
x1[:, k] = x[:, f]
k = k + 1
return def deley(i, j):
k = 0
for f in range(y.size):
if (f != i and f != j):
y1[k] = y[f]
k = k + 1
return readdata()
s = 0.0
for i in range(178):
for j in range(i + 1, 178):
s0 = 0.0
delex(i, j)
deley(i, j)
sety(1)
b1 = form()
deley(i, j)
sety(2)
b2 = form()
deley(i, j)
sety(3)
b3 = form()
s = s + (judg(i) + judg(j)) / 2
print('第', i, '个与第', j, '个作为测试集时的正确率暂时总和为', s)
s = s / 15753
print('正确率为:', s)

西瓜书3.4 解题报告(python 多分类学习 十折交叉法)的更多相关文章

  1. 【LeetCode】面试题62. 圆圈中最后剩下的数字 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 约瑟夫环 日期 题目地址:https://leetco ...

  2. 【LeetCode】107. Binary Tree Level Order Traversal II 解题报告 (Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:DFS 方法二:迭代 日期 [LeetCode ...

  3. 【LeetCode】206. Reverse Linked List 解题报告(Python&C++&java)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 迭代 递归 日期 [LeetCode] 题目地址:h ...

  4. 【LeetCode】26. Remove Duplicates from Sorted Array 解题报告(Python&C++&Java)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双指针 日期 [LeetCode] https:// ...

  5. 【LeetCode】1019. Next Greater Node In Linked List 解题报告 (Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调递减栈 日期 题目地址:https://leetc ...

  6. 【剑指Offer】05. 替换空格 解题报告 (Python & C++ & Java)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 方法一:新建可变长度的容器 方法二:原 ...

  7. 【LeetCode】94. Binary Tree Inorder Traversal 解题报告(Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 递归 迭代 日期 题目地址:https://leetcode.c ...

  8. 【LeetCode】654. Maximum Binary Tree 解题报告 (Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcode ...

  9. 【LeetCode】784. Letter Case Permutation 解题报告 (Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 回溯法 循环 日期 题目地址:https://leet ...

  10. 【LeetCode】341. Flatten Nested List Iterator 解题报告(Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归+队列 栈 日期 题目地址:https://lee ...

随机推荐

  1. iOS 过滤字符串

    //表示去掉字符串中的/符号 sysdate:[[self Gettime:strbegindate] stringByReplacingOccurrencesOfString:@"/&qu ...

  2. pull request 猜想

    先从某个地方 fork 一个项目, 我上传一个 git commit, 然后自动显示是否要 pull request, 点 是, 然后就发送到 charger 那里去了.1, git fork,2, ...

  3. Double NaN

    import java.math.BigDecimal; import java.math.RoundingMode; public class Test { public static void m ...

  4. SQL Server【提高】事务

    事务 事务是作为单个逻辑单元执行的一系列操作,它是一个不可分割的工作逻辑单元.它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行. 特性 原子性Atomicity 事务是一个完整的操作, ...

  5. kotlin inline的缺点

    inline关键字修饰的方法,可以在运行时将代码复制到使用处 用来控制打印好用 但有两个缺点: 一.修饰的方法不能太大,行数也不能太多,不然会造成很多重复代码 2.控制打印时,方法的行数最好与使用的行 ...

  6. CSS之小知识

    1.居中 a.文字水平居中 text-align:center; b.文字垂直居中 /* 如果有n行文字,那么将行高设为容器高度的n分之一 */ height: 35px; line-height: ...

  7. IDEA中已配置阿里镜像,但maven无法下载jar包的问题

    然后我还出现了一个问题,由于使用了HTTPS,存在着SSL证书验证的问题,因此我在IDEA中添加了一行配置: 配置如下: -Dmaven.wagon.http.ssl.insecure=true -D ...

  8. Access denied You do not have access to chat.openai.com. The site owner may have set restrictions that prevent you from accessing the site.解决办法

    报错 Access denied You do not have access to chat.openai.com. The site owner may have set restrictions ...

  9. linux安装IB驱动

    一.准备 1.Linux操作系统7.6(根据实际情况变更,此处用redhat7.6系统举例) 2.驱动:MLNX_OFED_LINUX-4.6-1.0.1.1-rhel7.6-x86_64.tgz(根 ...

  10. 计算2-expr命令举例

    一.expr命令 1.语法和功能 只能用于整数运算和字符串长度.匹配等运算处理 expr 2 + 2 expr 2 - 2 expr 2 \* 2 expr 2 / 2 i=5;i=`expr $1 ...