偷懒找了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. webpack和source map

    当 webpack 打包源代码时,可能会很难追踪到 error(错误) 和 warning(警告) 在源代码中的原始位置. 如果打包后代码有一处错误,特别是使用的vue.react这些前端框架.打包后 ...

  2. Treetop Lights使用条款与免责协议

    Treetop Lights (以下简称"我们")在此特别提醒您务必认真阅读.充分理解本<使用条款与免责协议>(以下简称"本协议")中各条款并选择是 ...

  3. https原理(七)其他

    1 fiddler原理+fiddler为什么抓chrome而不能抓curl和httpclient?fiddler为什么能篡改报文? 中的ssl pinning 本质即是双向ssl https://zh ...

  4. R7-7 调查电视节目受欢迎程度

    R7-7 调查电视节目受欢迎程度 分数 15 全屏浏览题目 切换布局 作者 颜晖 单位 浙大城市学院 某电视台要调查观众对该台8个栏目(设相应栏目编号为1~8)的受欢迎情况,共调查了n位观众(1≤n≤ ...

  5. 慢SQL

    慢SQL 目录 慢SQL 一.慢SQL概念 2.参数 3.配置 3.1.slow_query_log 3.2.slow_query_log_file 3.3.long_query_time 3.4.l ...

  6. HDLbits——Shift18

    // Build a 64-bit arithmetic shift register, // with synchronous load. The shifter can shift both le ...

  7. [AGC013B] Hamiltonish Path

    个人思路: 随便从一个节点开始搜索,只要当前节点不满足条件,随便找一个与它有边相连,不在序列里的节点加入序列.因为要么中途停止,要么把所有节点遍历一遍,一定能找到一个端点. 我们直接从节点 \(1\) ...

  8. 781. 森林中的兔子 (Medium)

    问题描述 781. 森林中的兔子 (Medium) 森林中有未知数量的兔子.提问其中若干只兔子 "还有多少只兔子与你(指被提问的兔子)颜色相同?" ,将答案收集到一个整数数组 an ...

  9. 第八章:diff

    1.git  diff命令的格式 1]可以使用git  diff命令的来源,(任意树对象.工作目录.索引) 2]git  diff命令进行树比较时,可以通过(提交名.分支名.标签名) 3]git  d ...

  10. eclipse 提示错误The method of type must override a superclass method 的解决办法

    java1.5中继承接口是不需要@Override的,而在1.6以上版本中是需要添加@Override注解的,如果项目的编译器是1.5版本的就可能报错The method *** of type mu ...