原文地址:https://www.jianshu.com/p/1db700f866ee

问题描述





程序实现

# kNN_RBFN.py
# coding:utf-8 import numpy as np
import matplotlib.pyplot as plt def ReadData(dataFile): with open(dataFile, 'r') as f:
lines = f.readlines()
data_list = []
for line in lines:
line = line.strip().split()
data_list.append([float(l) for l in line])
dataArray = np.array(data_list)
return dataArray def sign(n): if(n>=0):
return 1
else:
return -1 def kNN(k,trainArray,dataX):
num_data=dataX.shape[0]
predY=np.zeros((num_data,))
for n in range(num_data):
distArray=np.sum((trainArray[:,:-1]-dataX[n,:])**2,axis=1)
id_list=np.argsort(distArray,axis=0).tolist()[:k]
for i in id_list:
predY[n]+=trainArray[i,-1]
predY[n]=sign(predY[n])
return predY def GetZeroOneError(predY,dataY):
return (predY!=dataY).sum()/dataY.shape[0] def plot_bar_chart(X,Y,nameX,nameY,saveName):
plt.figure(figsize=(10,6))
plt.bar(left=X,height=Y,width=0.8,align="center",yerr=0.000001)
for (c,w) in zip(X,Y):
plt.text(c,w*1.03,str(round(w,4)))
plt.xlabel(nameX)
plt.ylabel(nameY)
plt.xlim(X[0]-1,X[-1]+1)
plt.xticks(X)
plt.ylim(0,1)
plt.title(nameY+" versus "+nameX)
plt.savefig(saveName)
return def RBFNetwork(k,gamma,trainArray,dataX):
num_data=dataX.shape[0]
predY=np.zeros((num_data,))
for n in range(num_data):
gaussianDistArray=np.exp(-gamma*np.sum((trainArray[:,:-1]-dataX[n,:])**2,axis=1))
id_list=np.argsort(gaussianDistArray,axis=0).tolist()[:k]
for i in id_list:
predY[n]+=trainArray[i,-1]
predY[n]=sign(predY[n])
return predY if __name__=="__main__": dataArray=ReadData("hw8_train.dat")
testArray=ReadData("hw8_test.dat")
k_list=[1,3,5,7,9]
ein_list=[]
eout_list=[]
for k in k_list:
predY=kNN(k,dataArray,dataArray[:,:-1])
ein_list.append(GetZeroOneError(predY,dataArray[:,-1]))
predY=kNN(k,dataArray,testArray[:,:-1])
eout_list.append(GetZeroOneError(predY,testArray[:,-1])) # 12
plot_bar_chart(k_list,ein_list,nameX="k",nameY="Ein(gk-nbor)",saveName="12.png") # 14
plot_bar_chart(k_list,eout_list,nameX='k',nameY="Eout(gk-bor)",saveName="14.png") gamma_list=[-3,-1,0,1,2]
ein_list=[]
eout_list=[]
for gamma in gamma_list:
predY=RBFNetwork(dataArray.shape[0],10**gamma,dataArray,dataArray[:,:-1])
ein_list.append(GetZeroOneError(predY,dataArray[:,-1]))
predY=RBFNetwork(dataArray.shape[0],10**gamma,dataArray,testArray[:,:-1])
eout_list.append(GetZeroOneError(predY,testArray[:,-1])) # 16
plot_bar_chart(X=gamma_list,Y=ein_list,nameX="log10(gamma)",nameY="Ein(guniform)",saveName="16.png") # 18
plot_bar_chart(X=gamma_list,Y=eout_list,nameX="log10(gamma)",nameY="Eout(guniform)",saveName="18.png")
# kMeans.py
# coding:utf-8 from numpy import random
from kNN_RBFN import * def kMeans(t,k,dataArray):
num_data=dataArray.shape[0]
random.seed(t)
centreIDList=random.randint(0,num_data,k).tolist()
nowCentreArray=dataArray[centreIDList,:]
tmpCentreArray=np.array(nowCentreArray)
ein=1000000
nowEin=ein-1
dict={}
while(nowEin<ein):
ein=nowEin
dict = {}
for n in range(num_data):
distArray=np.sum((nowCentreArray-dataArray[n,:])**2,axis=1)
minID=np.argmin(distArray)
tmpCentreArray[minID]=(tmpCentreArray[minID]+dataArray[n,:])/2
try:
dict[minID].append(dataArray[n,:])
except:
dict[minID]=[]
dict[minID].append(dataArray[n,:])
nowCentreArray=np.array(tmpCentreArray)
nowEin=GetEin(nowCentreArray,dict)
return nowCentreArray,dict def GetEin(nowCentreArray,dict):
k=nowCentreArray.shape[0]
ein=0
for i in range(k):
if i not in dict.keys():
continue
data=np.array(dict[i])
ein+=np.average(np.sum((data-nowCentreArray[i])**2,axis=1))
return ein def plot_bar_chart(X,Y,nameX,nameY,saveName):
plt.figure(figsize=(10,6))
plt.bar(left=X,height=Y,width=0.8,align="center",yerr=0.000001)
for (c,w) in zip(X,Y):
plt.text(c,w*1.03,str(round(w,4)))
plt.xlabel(nameX)
plt.ylabel(nameY)
plt.xlim(X[0]-1,X[-1]+1)
plt.xticks(X)
plt.title(nameY+" versus "+nameX)
plt.savefig(saveName)
return if __name__=="__main__": dataArray=ReadData("hw8_nolabel_train.dat")
k_list=[2,4,6,8,10]
ein_list=[]
for k in k_list:
ein=0
for t in range(500):
nowCentreArray,dict=kMeans(t,k,dataArray)
ein+=GetEin(nowCentreArray,dict)
ein_list.append(ein/500) plot_bar_chart(k_list,ein_list,nameX="k",nameY="the average Ein over 500 experiments",saveName="20.png")

运行结果









机器学习技法笔记:Homework #8 kNN&RBF&k-Means相关习题的更多相关文章

  1. 机器学习技法笔记(2)-Linear SVM

    从这一节开始学习机器学习技法课程中的SVM, 这一节主要介绍标准形式的SVM: Linear SVM 引入SVM 首先回顾Percentron Learning Algrithm(感知器算法PLA)是 ...

  2. 机器学习十大算法之KNN(K最近邻,k-NearestNeighbor)算法

    机器学习十大算法之KNN算法 前段时间一直在搞tkinter,机器学习荒废了一阵子.如今想重新写一个,发现遇到不少问题,不过最终还是解决了.希望与大家共同进步. 闲话少说,进入正题. KNN算法也称最 ...

  3. 机器学习技法笔记:Homework #6 AdaBoost&Kernel Ridge Regression相关习题

    原文地址:http://www.jianshu.com/p/9bf9e2add795 AdaBoost 问题描述 程序实现 # coding:utf-8 import math import nump ...

  4. 机器学习技法笔记:Homework #5 特征变换&Soft-Margin SVM相关习题

    原文地址:https://www.jianshu.com/p/6bf801bdc644 特征变换 问题描述 程序实现 # coding: utf-8 import numpy as np from c ...

  5. 机器学习技法笔记:Homework #7 Decision Tree&Random Forest相关习题

    原文地址:https://www.jianshu.com/p/7ff6fd6fc99f 问题描述 程序实现 13-15 # coding:utf-8 # decision_tree.py import ...

  6. 机器学习技法笔记:14 Radial Basis Function Network

    Roadmap RBF Network Hypothesis RBF Network Learning k-Means Algorithm k-Means and RBF Network in Act ...

  7. 机器学习技法笔记:08 Adaptive Boosting

    Roadmap Motivation of Boosting Diversity by Re-weighting Adaptive Boosting Algorithm Adaptive Boosti ...

  8. 机器学习技法笔记:15 Matrix Factorization

    Roadmap Linear Network Hypothesis Basic Matrix Factorization Stochastic Gradient Descent Summary of ...

  9. 机器学习技法笔记:16 Finale

    Roadmap Feature Exploitation Techniques Error Optimization Techniques Overfitting Elimination Techni ...

随机推荐

  1. CPU、内存、磁盘三者的关系

    参考:https://blog.csdn.net/weini1111/article/details/70849332 cpu是大脑,计算数据用的. 内存是草稿纸,开着电脑一直都在用里边的数据,如果断 ...

  2. 爬取猎聘大数据岗位相关信息--Python

    猎聘网站搜索大数据关键字,只能显示100页,爬取这一百页的相关信息,以便做分析. __author__ = 'Fred Zhao' import requests from bs4 import Be ...

  3. 【C++第一个Demo】---控制台RPG游戏1【游戏简介】

       经过1个月的制作和多次修改,终于有了基本雏形(此篇仅用于纪念历时3个多月C/C++学习所付出努力,也给和我一样苦恼于不能快速理解面向对象的同学们一点灵感) 在制作这个Demo过程中也受到了很多大 ...

  4. redis的一些特性

    Redis内存回收 Redis复制原理 Redis提供的高可用方案 Redis提供的分片算法 Redis迁移

  5. UltraEdit常用快捷键

    UltraEdit是一套功能强大的文本编辑器,可以编辑文本.十六进制.ASCII码,可以取代记事本,内建英文单字检查.C++及VB指令突显,可同时编辑多个文件,而且即使开启很大的文件速度也不会慢. 说 ...

  6. ubuntu安装goland

    安装goland 首先下载goland https://www.jetbrains.com/zh/go/specials/go/go.html?utm_source=baidu&utm_med ...

  7. 创建GitHub(注册、创建仓库)

    说明: 首先,你需要注册一个 github 账号,最好取一个有意义的名字,比如姓名全拼,昵称全拼,如果被占用,可以加上有意义的数字. 本文中假设用户名为 chenqiufei 1. 注册账号 地址: ...

  8. imagepicker插件的使用方法和选择按钮汉化

    1,使用cordova-plugin-image-picker插件. cordova plugin add https://github.com/wymsee/cordova-imagePicker. ...

  9. 【记录】uni-app Chrome跨域解决方案插件 has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is...

    博主最近在用Hbuilder X开发前端网页时, 出现了has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header ...

  10. JNI 在Android Studio利用NDK编译运行一个简单的c库

    NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西:另外就是为了效率更加高些.如果你在Eclipse+ADT下开发过NDK就能体会到要么是配置NDK还要下载Cygwin,配置Cygwin ...