机器学习基石笔记:Homework #3 LinReg&LogReg相关习题
原文地址:http://www.jianshu.com/p/311141f2047d
问题描述




程序实现
13-15
# coding: utf-8
import numpy as np
import numpy.random as random
import matplotlib.pyplot as plt
def sign(x):
if(x>=0):
return 1
else:
return -1
def gen_data():
x1=random.uniform(-1,1,1000)
x2=random.uniform(-1,1,1000)
id_array=random.permutation([i for i in range(1000)])
dataY=np.zeros((1000,1))
for i in range(1000):
if(i<1000*0.1):
i = id_array[i]
dataY[i][0]=-sign(x1[i]**2+x2[i]**2-0.6)
else:
i = id_array[i]
dataY[i][0]=sign(x1[i]**2+x2[i]**2-0.6)
dataX=np.concatenate((np.ones((1000,1)),np.array(x1).reshape((1000,1)),np.array(x2).reshape((1000,1))),axis=1)
return dataX,dataY
def w_lin(dataX,dataY):
dataX_T=np.transpose(dataX)
tmp=np.dot(np.linalg.inv(np.dot(dataX_T,dataX)),dataX_T)
return np.dot(tmp,dataY)
def pred(dataX,wLIN):
pred=np.dot(dataX,wLIN)
num_data=dataX.shape[0]
for i in range(num_data):
pred[i][0]=sign(pred[i][0])
return pred
def zero_one_cost(pred,dataY):
return np.sum(pred!=dataY)/dataY.shape[0]
def feat_transform(dataX):
num_data=dataX.shape[0]
tmp1=dataX[:,1]*dataX[:,2]
tmp2=dataX[:,1]**2
tmp3=dataX[:,2]**2
new_dataX=np.concatenate(
(dataX,tmp1.reshape((num_data,1)),tmp2.reshape((num_data,1)),tmp3.reshape((num_data,1))),axis=1)
return new_dataX
if __name__=="__main__":
cost_list=[]
for i in range(1000):
dataX,dataY=gen_data()
wLIN=w_lin(dataX,dataY)
cost_list.append(zero_one_cost(pred(dataX,wLIN),dataY))
# show results
print("the average Ein over 1000 experiments: ",sum(cost_list)/len(cost_list))
plt.figure()
plt.hist(cost_list)
plt.xlabel("zero_one Ein")
plt.ylabel("frequency")
plt.title("13")
plt.savefig("13.png")
W=[]
cost_list=[]
for i in range(1000):
# train
dataX,dataY=gen_data()
dataX=feat_transform(dataX)
wLIN=w_lin(dataX,dataY)
W.append(wLIN[:,0].tolist())
# test
testX, testY = gen_data()
testX = feat_transform(testX)
cost_list.append(zero_one_cost(pred(testX, wLIN), testY))
min_cost=min(cost_list)
min_id=cost_list.index(min_cost)
print(W[min_id])
W=np.array(W)
# show w3
print("the average w3 over 1000 experiments: ",np.average(W,axis=0)[3])
plt.figure()
plt.hist(W[:,3].tolist())
plt.xlabel("w3")
plt.ylabel("frequency")
plt.title("14")
plt.savefig("14.png")
# show Eout
print("the average Eout over 1000 experiments: ",sum(cost_list)/len(cost_list))
plt.figure()
plt.hist(cost_list)
plt.xlabel("Eout")
plt.ylabel("frequency")
plt.title("15")
plt.savefig("15.png")
18-20
# coding: utf-8
import numpy as np
def sigmoid(x):
return 1/(1+np.e**(-x))
def read_data(dataFile):
with open(dataFile,'r') as f:
lines=f.readlines()
data_list=[]
for line in lines:
line=line.strip().split()
data_list.append([1.0] + [float(l) for l in line])
dataArray=np.array(data_list)
num_data=dataArray.shape[0]
num_dim=dataArray.shape[1]-1
dataX=dataArray[:,:-1].reshape((num_data,num_dim))
dataY=dataArray[:,-1].reshape((num_data,1))
return dataX,dataY
def gradient_descent(w,dataX,dataY,eta):
assert w.shape[0]==dataX.shape[1],"wrong shape!"
assert w.shape[1]==1,"wrong shape of w!"
num_data=dataX.shape[0]
num_dim=dataX.shape[1]
tmp1=-dataY*dataX
tmp2=-dataY*np.dot(dataX,w)
for i in range(num_data):
tmp2[i][0]=sigmoid(tmp2[i][0])
tmp3=np.average(tmp1 * tmp2, axis=0)
new_w=w-eta*tmp3.reshape((num_dim,1))
return new_w
def s_gradient_descent(w,dataX,dataY,eta):
assert w.shape[0]==dataX.shape[1],"wrong shape!"
assert w.shape[1]==1,"wrong shape of w!"
assert dataX.shape[0]==1,"wrong shape of x!"
assert dataY.shape[0]==1,"wrong shape of y!"
num_dim=dataX.shape[1]
tmp1=-dataY*dataX
tmp2=-dataY*np.dot(dataX,w)
tmp2[0][0]=sigmoid(tmp2[0][0])
tmp3=np.average(tmp1 * tmp2, axis=0)
new_w=w-eta*tmp3.reshape((num_dim,1))
return new_w
def pred(wLOG,dataX):
pred=np.dot(dataX,wLOG)
num_data=dataX.shape[0]
for i in range(num_data):
pred[i][0]=sigmoid(pred[i][0])
if(pred[i][0]>=0.5):
pred[i][0]=1
else:
pred[i][0]=-1
return pred
def zero_one_cost(pred,dataY):
return np.sum(pred!=dataY)/dataY.shape[0]
if __name__=="__main__":
# train
dataX,dataY=read_data("hw3_train.dat")
num_dim=dataX.shape[1]
w=np.zeros((num_dim,1))
print("\n18")
for i in range(2000):
w=gradient_descent(w,dataX,dataY,eta=0.001)
print("the weight vector within g: ",w[:,0])
# test
testX,testY=read_data("hw3_test.dat")
Eout=zero_one_cost(pred(w,testX),testY)
print("the Eout(g) on the test set: ",Eout)
print("\n18.1")
w = np.zeros((num_dim, 1))
for i in range(20000):
w = gradient_descent(w, dataX, dataY, eta=0.001)
print("the weight vector within g: ", w[:, 0])
# test
Eout = zero_one_cost(pred(w, testX), testY)
print("the Eout(g) on the test set: ", Eout)
print("\n19")
w=np.zeros((num_dim,1))
for i in range(2000):
w = gradient_descent(w, dataX, dataY, eta=0.01)
print("the weight vector within g: ", w[:, 0])
# test
Eout = zero_one_cost(pred(w, testX), testY)
print("the Eout(g) on the test set: ", Eout)
print("\n20")
w=np.zeros((num_dim,1))
num_data=dataX.shape[0]
for i in range(2000):
i%=num_data
x=dataX[i,:].reshape((1,num_dim))
y=dataY[i,:].reshape((1,1))
w=s_gradient_descent(w,x,y,eta=0.001)
print("the weight vector within g: ", w[:, 0])
# test
Eout = zero_one_cost(pred(w, testX), testY)
print("the Eout(g) on the test set: ", Eout)
运行结果及分析
13-15




18-20

对比18和18.1,可知迭代步长较小时,需要较多迭代次数才能达到较优效果。
机器学习基石笔记:Homework #3 LinReg&LogReg相关习题的更多相关文章
- 机器学习基石笔记:Homework #1 PLA&PA相关习题
原文地址:http://www.jianshu.com/p/5b4a64874650 问题描述 程序实现 # coding: utf-8 import numpy as np import matpl ...
- 机器学习基石笔记:Homework #2 decision stump相关习题
原文地址:http://www.jianshu.com/p/4bc01760ac20 问题描述 程序实现 17-18 # coding: utf-8 import numpy as np import ...
- 机器学习基石笔记:11 Linear Models for Classification、LC vs LinReg vs LogReg、OVA、OVO
原文地址:https://www.jianshu.com/p/6f86290e70f9 一.二元分类的线性模型 线性回归后的参数值常用于PLA/PA/Logistic Regression的参数初始化 ...
- 机器学习基石笔记:Homework #4 Regularization&Validation相关习题
原文地址:https://www.jianshu.com/p/3f7d4aa6a7cf 问题描述 程序实现 # coding: utf-8 import numpy as np import math ...
- 机器学习基石:Homework #0 SVD相关&常用矩阵求导公式
- 林轩田机器学习基石笔记1—The Learning Problem
机器学习分为四步: When Can Machine Learn? Why Can Machine Learn? How Can Machine Learn? How Can Machine Lear ...
- 机器学习基石笔记:01 The Learning Problem
原文地址:https://www.jianshu.com/p/bd7cb6c78e5e 什么时候适合用机器学习算法? 存在某种规则/模式,能够使性能提升,比如准确率: 这种规则难以程序化定义,人难以给 ...
- 机器学习基石笔记:04 Feasibility of Learning
原文地址:https://www.jianshu.com/p/f2f4d509060e 机器学习是设计算法\(A\),在假设集合\(H\)里,根据给定数据集\(D\),选出与实际模式\(f\)最为相近 ...
- 机器学习基石笔记:03 Types of Learning
原文地址:https://www.jianshu.com/p/86b2a9cef742 一.学习的分类 根据输出空间\(Y\):分类(二分类.多分类).回归.结构化(监督学习+输出空间有结构): 根据 ...
随机推荐
- 如何在android studio中cordova的混合开发
基于Android Studio 中Cordova的开发 cordova简介 Cordova的前身是PhoneGap 官网: (http://cordova.io) Cordova应是运行在客户端本地 ...
- ng -v 不是内部或外部命令
输入 npm install -g @angular/cli ng new my-app 提示ng -v 不是内部或外部命令 解决方法 1.安装过程中是否出错 原因可能是npm install -g ...
- 运维 07 Linux系统基础优化及常用命令
Linux系统基础优化及常用命令 Linux基础系统优化 引言没有,只有一张图. Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令 ...
- J. The Volcano Eruption(圆相交+并查集)
题目链接:https://codeforces.com/gym/101915/problem/J 思路:将所有相交的圆用并查集维护看做一个整体,然后枚举每个整体的左边界和右边界,判断能不能同时覆盖整个 ...
- 浅析Draw Call
Draw Call是CPU对GPU的一种命令,仅仅指向一个需要被渲染的图元列表,在OpenGL和DirectX中分别体现为glDrawElements和DrawIndexedPrimitive图像编程 ...
- 数据库全表扫描的SQL种类
1.所查询的表的条件列没有索引: 2.需要返回所有的行: 3.对索引主列有条件限制,但是使用了函数,则Oracle 使用全表扫描,如: where upper(city)=’TOKYO’; 这样的语 ...
- Linux下JDK1.6升级1.8版本
先不管是否已安装JDK1.6还是JDK1.7,先下载 jdk-8u45-linux-x64.rpm 然后上传到 /usr/local/src 去.当然其他目录也可以.这里是默认位置 给所有用户 ...
- c# 陈景润 15 子问题
初学编程时在 csdn 上写过一个陈景润 15 子问题的项目,https://blog.csdn.net/weixin_41628344/article/details/79171846 当时的主要精 ...
- css图片文字
1.浏览器是把 html 和 css 一起下载并执行的,计算机里把两件事情同时做 异步加载.计算机中的同步异步和我们生活中的正好是相反的. 补充: 同步,是所有的操作都做完,才返回给用户结果.即写完 ...
- sysprep
今天做虚拟机模板,以及克隆.单纯的克隆会造成很多冲突问题的产生,所以在这里,windows自带的sysprep功能很好的解决了这一点. 路径位于:C:\Windows\System32\Sysprep ...