台大林轩田《机器学习基石》:作业一python实现
台大林轩田《机器学习基石》:作业二python实现
台大林轩田《机器学习基石》:作业三python实现
台大林轩田《机器学习基石》:作业四python实现

完整代码:
https://github.com/xjwhhh/LearningML/tree/master/MLFoundation
欢迎follow和star

在学习和总结的过程中参考了不少别的博文,且自己的水平有限,如果有错,希望能指出,共同学习,共同进步

##13

给定target function,我们的工作是在X=[-1,1]x[-1,1]上随机产生1000个点,利用f(x1,x2)计算它的值,然后在基础上添加10%的噪声(二元分类的噪声就是把10%的样本的y值取相反数)。如果不做feacher transform 直接利用数据做线性回归,利用得到的参数做线性分类器,问此时得到的Ein是多少。运行1000次取平均值。

步骤:
1.随机产生训练样本并添加噪声
2.利用训练样本进行线性回归
3.用得到的线性回归参数w作为二元分类器的参数,计算sign(w*x)得到预测值,计算他与y的0/1错误,得到错误率E_in

代码如下:

import random
import numpy as np# target function f(x1, x2) = sign(x1^2 + x2^2 - 0.6)
def target_function(x1, x2):if (x1 * x1 + x2 * x2 - 0.6) >= 0:return 1else:return -1# create train_set
def training_data_with_random_error(num=1000):features = np.zeros((num, 3))labels = np.zeros((num, 1))points_x1 = np.array([round(random.uniform(-1, 1), 2) for i in range(num)])points_x2 = np.array([round(random.uniform(-1, 1), 2) for i in range(num)])for i in range(num):# create random featurefeatures[i, 0] = 1features[i, 1] = points_x1[i]features[i, 2] = points_x2[i]labels[i] = target_function(points_x1[i], points_x2[i])# choose 10% error labelsif i <= num * 0.1:if labels[i] < 0:labels[i] = 1else:labels[i] = -1return features, labelsdef error_rate(features, labels, w):wrong = 0for i in range(len(labels)):if np.dot(features[i], w) * labels[i, 0] < 0:wrong += 1return wrong / (len(labels) * 1.0)def linear_regression_closed_form(X, Y):"""linear regression:model     : g(x) = Wt * Xstrategy  : squared erroralgorithm : close form(matrix)result    : w = (Xt.X)^-1.Xt.Y林老师上课讲的公式"""return np.linalg.inv(np.dot(X.T, X)).dot(X.T).dot(Y)if __name__ == '__main__':# 13error_rate_array = []for i in range(1000):(features, labels) = training_data_with_random_error(1000)w13 = linear_regression_closed_form(features, labels)error_rate_array.append(error_rate(features, labels, w13))# error rate, approximately 0.5avr_err = sum(error_rate_array) / (len(error_rate_array) * 1.0)print("13--Linear regression for classification without feature transform:Average error--", avr_err)

运行结果是0.5079380000000009

##14

在第13题,直接利用逻辑回归做分类是很不理想的,错误率为50%,没有实际意义。但是我们可以先进行特征转换,正确率就会高很多。我们要将特征转换到如题所示

与13题的不同在于多了一个feature_transform(features)方法,在1000次计算中比较得到最好的w

def feature_transform(features):new = np.zeros((len(features), 6))new[:, 0:3] = features[:, :] * 1new[:, 3] = features[:, 1] * features[:, 2]new[:, 4] = features[:, 1] * features[:, 1]new[:, 5] = features[:, 2] * features[:, 2]return new

main方法变为:

# 14
(features, labels) = training_data_with_random_error(1000)
new_features = feature_transform(features)
w14 = linear_regression_closed_form(new_features, labels)
min_error_in = float("inf")
# print(w14)
# plot_dot_pictures(features, labels, w)
error_rate_array = []
for i in range(1000):(features, labels) = training_data_with_random_error(1000)new_features = feature_transform(features)w = linear_regression_closed_form(new_features, labels)error_in = error_rate(new_features, labels, w)if error_in <= min_error_in:w14 = wmin_error_in = error_inerror_rate_array.append(error_in)
print("w14", w14)

运行结果为
w14 [[-0.95043879]
[ 0.02597952]
[ 0.00375311]
[ 0.00370397]
[ 1.54904793]
[ 1.60014614]]

##15

在14题得到的最优w的基础上,我们利用产生训练样本的方法一样产生1000个测试样本,计算误差。重复1000次求平均误差

在14题的main方法里添加:

# 15
error_out = []
for i in range(1000):(features, labels) = training_data_with_random_error(1000)new_features = feature_transform(features)error_out.append(error_rate(new_features, labels, w14))
print("15--Average of E_out is: ", sum(error_out) / (len(error_out) * 1.0))

运行结果为0.1176709999999998

##18

下载训练样本和测试样本,进行逻辑回归。取迭代步长ita = 0.001,迭代次数T=2000,求E_out

梯度下降时注意公式转化为代码

代码如下:

import numpy as npdef data_load(file_path):# open file and read linesf = open(file_path)try:lines = f.readlines()finally:f.close()# create features and labels arrayexample_num = len(lines)feature_dimension = len(lines[0].strip().split())features = np.zeros((example_num, feature_dimension))features[:, 0] = 1labels = np.zeros((example_num, 1))for index, line in enumerate(lines):# items[0:-1]--features   items[-1]--labelitems = line.strip().split(' ')# get featuresfeatures[index, 1:] = [float(str_num) for str_num in items[0:-1]]# get labellabels[index] = float(items[-1])return features, labels# gradient descent
def gradient_descent(X, y, w):# -YnWtXntmp = -y * (np.dot(X, w))# θ(-YnWtXn) = exp(tmp)/1+exp(tmp)# weight_matrix = np.array([math.exp(_)/(1+math.exp(_)) for _ in tmp]).reshape(len(X), 1)weight_matrix = np.exp(tmp) / ((1 + np.exp(tmp)) * 1.0)gradient = 1 / (len(X) * 1.0) * (sum(weight_matrix * -y * X).reshape(len(w), 1))return gradient# gradient descent
def stochastic_gradient_descent(X, y, w):# -YnWtXntmp = -y * (np.dot(X, w))# θ(-YnWtXn) = exp(tmp)/1+exp(tmp)# weight = math.exp(tmp[0])/((1+math.exp(tmp[0]))*1.0)weight = np.exp(tmp) / ((1 + np.exp(tmp)) * 1.0)gradient = weight * -y * Xreturn gradient.reshape(len(gradient), 1)# LinearRegression Class
class LinearRegression:def __init__(self):pass# fit modeldef fit(self, X, y, Eta=0.001, max_iteration=2000, sgd=False):# ∂E/∂w = 1/N * ∑θ(-YnWtXn)(-YnXn)self.__w = np.zeros((len(X[0]), 1))# whether use stochastic gradient descentif not sgd:for i in range(max_iteration):self.__w = self.__w - Eta * gradient_descent(X, y, self.__w)else:index = 0for i in range(max_iteration):if (index >= len(X)):index = 0self.__w = self.__w - Eta * stochastic_gradient_descent(np.array(X[index]), y[index], self.__w)index += 1# predictdef predict(self, X):binary_result = np.dot(X, self.__w) >= 0return np.array([(1 if _ > 0 else -1) for _ in binary_result]).reshape(len(X), 1)# get vector wdef get_w(self):return self.__w# score(error rate)def score(self, X, y):predict_y = self.predict(X)return sum(predict_y != y) / (len(y) * 1.0)if __name__ == '__main__':# 18# training model(X, Y) = data_load("hw3_train.dat")lr = LinearRegression()lr.fit(X, Y, max_iteration=2000)# get 0/1 error in test datatest_X, test_Y = data_load("hw3_test.dat")print("E_out: ", lr.score(test_X, test_Y))

运行结果为0.475

##19

把第18题的步长ita=0.001改为0.01,求E_out

只需要更改main函数里的ita

# 19
# training model
(X, Y) = data_load("hw3_train.dat")
lr_eta = LinearRegression()
lr_eta.fit(X, Y, 0.01, 2000)
# get 0/1 error in test data
test_X, test_Y = data_load("hw3_test.dat")
print("E_out: ", lr_eta.score(test_X, test_Y))

运行结果为0.22

##20

ita取0.001,迭代2000次,利用随机梯度下降法(Stostic Gradieng Descent),求迭代2000次后的Eout

我在18题的代码中给出了随机梯度下降的实现,只要在调用方法时将sgd设为True即可

# 20
(X, Y) = data_load("hw3_train.dat")
lr_sgd = LinearRegression()
lr_sgd.fit(X, Y, sgd=True, max_iteration=2000)
# get 0/1 error in test data
test_X, test_Y = data_load("hw3_test.dat")
print("E_out: ", lr_sgd.score(test_X, test_Y))

运行结果为0.473

台大林轩田《机器学习基石》:作业三python实现相关推荐

  1. 台大林轩田·机器学习基石记要

    台大林轩田·机器学习基石记要 昨天开始看林轩田的机器学习基石,从今天起开始去粗取精 第一讲比较基础,一些概念自己早已经理解了,所以不再做笔记,有点印象的是讲到了ML.DL.AI的一些联系与区别,ML主 ...

  2. 台大·林轩田·机器学习基石·第二讲

    第二讲···感知机学习算法 2-1 Perceptron hypothesis set 对于银行是否决定要给申请者信用卡问题,对于输入数据(例如申请者的个人信息,年龄,性别,收入,工作情况等)可用一组 ...

  3. 台大林轩田机器学习基石学习笔记(一):The Learning Problem

    这里写自定义目录标题 写在前面 一.What is Machine Learning 二.Applications of Machine Learning 三.Components of Machin ...

  4. 机器学习 | 台大林轩田机器学习基石课程笔记3 --- Types of Learning

    课程主页 课程视频和PPT 上节课我们主要介绍了解决线性分类问题的一个简单的方法:PLA.PLA能够在平面中选择一条直线将样本数据完全正确分类(前提数据是线性可分的,在高维空间中,可以用一个超平面完全 ...

  5. 机器学习 | 台大林轩田机器学习基石课程笔记12 --- Nonlinear Transformation

    课程主页 课程视频和PPT 上一节课,我们介绍了分类问题的三种线性模型,可以用来解决binary classification和multiclass classification问题.本节课主要介绍非 ...

  6. 台大林轩田·机器学习技法记要

    台大林轩田·机器学习技法 记要 6/1/2016 7:42:34 PM 第一讲 线性SVM 广义的SVM,其实就是二次规划问题 把SVM问题对应到二次规划的系数 这就是线性SVM,如果想变成非线性,只 ...

  7. 台大林轩田机器学习技法完全解读

    支持向量机(SVM)完全解读 集成学习完全解读 神经网络深度学习完全解读 感谢林轩田老师!

  8. [机器学习基础][台大林轩田]机器学习概念

    什么是机器学习 什么是"学习"?学习就是人类通过观察.积累经验,掌握某项技能或能力.就好像我 们从小学习识别字母.认识汉字,就是学习的过程.而机器学习(Machine Learni ...

  9. ccc-台大林轩田机器学习基石-hw1

    文章目录 Question1-14 Question15-PLA Question16-PLA平均迭代次数 Question17-不同迭代系数的PLA Question18-Pocket_PLA Qu ...

  10. 【本站原创】台大林轩田《机器学习基石》系列课程教材的习题解答和实现

    台湾大学林轩田老师的<机器学习基石>.<机器学习技法>课程由浅入深.内容全面,基本涵盖了机器学习领域的很多方面.其作为机器学习的入门和进阶资料非常适合.本站实现了课程教材的绝大 ...

最新文章

  1. 如何知道刚刚插入数据库那条数据的id
  2. A Tutorial on Clustering Algorithms-聚类小知识
  3. Linux shell脚本附带选项(参数传递及接收)
  4. 均值差异大但是t检验不显著_T检验原理及介绍
  5. SQLServer 合并ID相同行,同ID的列值累加。
  6. 使用电脑时,眼睛离电脑多远才合适
  7. [知识竞赛策划方案] 【图】关于知识竞赛抢答器的问题
  8. Python 算法交易实验30 退而结网7-交易策略思考
  9. hdu 5455 Fang Fang 坑题
  10. 文件夹被隐藏生成同名.exe文件的文件夹图标病毒你还不会解决?
  11. 恋爱计时:只要时间在走,我们的爱就在继续
  12. 蓝桥杯, 38线译码器74Hc138
  13. 反编译class文件
  14. 数据库 SQL Server 修改 表结构 脚本 sql语句
  15. 计算机教学得意之处,看不懂没关系,知道厉害就行了:中科大俩教授11年解了两道数学难题...
  16. Golang学习(二十四)家庭记账项目
  17. Solr--Solr 使用SolrJ 完成添加,删除,查询
  18. 51单片机模拟电梯控制(含完整代码)
  19. pfam基本介绍,以及蛋白质序列下载
  20. 029-Web前端-JS-对象和函数

热门文章

  1. 如何在WPS2000中插入AutoCad图形文件(转)
  2. network location awareness 错误
  3. html 透明玻璃效果图,CSS3教程实现模糊透明玻璃效果
  4. msdtc.exe dll劫持
  5. 用条码软件来制作证书
  6. 朗文当代英英词典(LDOCE5)Mac端
  7. 混淆的艺术-(苍井空变凤姐)Proguard源码分析(一)前言和计划
  8. 推荐3个免费开源的加密软件,知乎高赞
  9. 印象笔记html预览,超级笔记使用指南 | 印象笔记
  10. LoadRunner执行压力测试