一、数据来源

  1. 数据来源:UCI

  1. 数据样式

最后一列数据为判断是否为物体,其他列为参数数值。

二、使用方法

感知机(perception)

感知机是一个线性分类器,它是最简单的神经网络,只有一个神经元,通过结果的正负来做二分类。

通过梯度下降,对系数不断优化,寻找最优系数:

三、代码实现

从数据读取开始,不调取三方库,纯手工推。

  1. 导入基础库

from random import seed,randrange
from csv import reader
  1. 读取csv文件和转换字符串为浮点型

def csv_loader(file):dataset=list()with open(file,'r') as f:csv_reader =reader(f)for row in csv_reader:if not row:continuedataset.append(row)return datasetdef str_to_float_converter(dataset):for i in range(len(dataset[0])-1):for row in dataset:row[i]=float(row[i].strip())
  1. 原数据集最后一列转为0或1

def last_column_to_int(dataset):col_value=[row[-1] for row in dataset]uni_value=set(col_value)search_tool=dict()for i,value in enumerate(uni_value):search_tool[value]=ifor row in dataset:row[-1]= search_tool[row[-1]]
  1. 使用k-fold cross validation拆分数据

def k_folds_cross_validation(dataset,n_folds):dataset_split =list()dataset_copy=list(dataset)fold_size=int(len(dataset)/n_folds)for i in range(n_folds):fold = list()while len(fold) < fold_size:index = randrange(len(dataset_copy))fold.append(dataset_copy.pop(index))dataset_split.append(fold)return dataset_split
  1. 计算准确性

def calculate_accuracy(actual,predicted):correct =0for i in range(len(actual)):if actual[i] == predicted[i]:correct+=1return correct/float(len(actual)) * 100.0
  1. 模型测试

使用K折交叉验证,评估每一次折叠的模型准确性。

其中:algo为算法占位,具体算法写好后,在运行时迭代即可。

def model_test(dataset,algo,n_folds,*args):folds=k_folds_cross_validation(dataset,n_folds)scores =list()for fold in folds:train=list(folds)train.remove(fold)train=sum(train,[])test=list()for row in fold:row_copy=list(row)test.append(row_copy)row_copy[-1]=Nonepredicted = algo(train,test,*args)actual =[row[-1] for row in fold]accuracy = calculate_accuracy(actual,predicted)scores.append(accuracy)return scores
  1. 预测数据的基础模型

感知机本质上是一个线性模型,通过结果的正负来做二分类

def predict(row,weights):activation = weights[0]for i in range(len(row)-1):activation += weights[i+1] *row[i]return 1.0 if activation >= 0.0 else 0
  1. 使用随机梯度下降法预估系数

def estimats_weights(train,learning_rate,n_epochs):weights=[0.0 for i in range(len(train[0]))]for epoch in range(n_epochs):sse=0for row in train:prediction = predict(row,weights)error = prediction - row[-1]sse = error **2weights[0] = weights[0] - learning_rate * errorfor i in range(len(row)-1):weights[i+1] = weights[i+1] - learning_rate * error * row[i]print('This is epoch < %s >, sum_error is < %.4f >' %(epoch,sse))return weights
  1. 感知机函数,用来预测测试数据

def perception(train,test,learning_rate,n_epochs):predictions = list()weights = estimats_weights(train,learning_rate,n_epochs)for row in test:prediction = predict(row,weights)predictions.append(prediction)return predictions
  1. 运行和参数调整

seed(1)
file='./download_datas/sonar.all-data.csv'
dataset=csv_loader(file)
str_to_float_converter(dataset)
last_column_to_int(dataset)n_folds=5
learning_rate=0.0001
n_epochs=12
algo=perceptionscores=model_test(dataset,algo,n_folds,learning_rate,n_epochs)
print('The score of my model are : %s ' %scores)
print('The average accuracy is : %.3f%% ' %(sum(scores)/float(len(scores))))

运行结果:

The score of my model are : [80.48780487804879, 82.92682926829268, 73.17073170731707, 82.92682926829268, 70.73170731707317]
The average accuracy is : 78.049% 

四、完整代码

#1.导入基础库
from random import seed,randrange
from csv import reader#2.读取csv文件和转换字符串为浮点型
def csv_loader(file):dataset=list()with open(file,'r') as f:csv_reader =reader(f)for row in csv_reader:if not row:continuedataset.append(row)return datasetdef str_to_float_converter(dataset):for i in range(len(dataset[0])-1):for row in dataset:row[i]=float(row[i].strip())#3.原数据集最后一列转为0或1
def last_column_to_int(dataset):col_value=[row[-1] for row in dataset]uni_value=set(col_value)search_tool=dict()for i,value in enumerate(uni_value):search_tool[value]=ifor row in dataset:row[-1]= search_tool[row[-1]]#4.使用k_folds cross validation(交叉确认)
def k_folds_cross_validation(dataset,n_folds):dataset_split =list()dataset_copy=list(dataset)fold_size=int(len(dataset)/n_folds)for i in range(n_folds):fold = list()while len(fold) < fold_size:index = randrange(len(dataset_copy))fold.append(dataset_copy.pop(index))dataset_split.append(fold)return dataset_split#5.计算准确性
def calculate_accuracy(actual,predicted):correct =0for i in range(len(actual)):if actual[i] == predicted[i]:correct+=1return correct/float(len(actual)) * 100.0#6.whether the algo is good or not?
def model_test(dataset,algo,n_folds,*args):folds=k_folds_cross_validation(dataset,n_folds)scores =list()for fold in folds:train=list(folds)train.remove(fold)train=sum(train,[])test=list()for row in fold:row_copy=list(row)test.append(row_copy)row_copy[-1]=Nonepredicted = algo(train,test,*args)actual =[row[-1] for row in fold]accuracy = calculate_accuracy(actual,predicted)scores.append(accuracy)return scores#7.预测的模型
def predict(row,weights):activation = weights[0]for i in range(len(row)-1):activation += weights[i+1] *row[i]return 1.0 if activation >= 0.0 else 0#8.使用随机梯度下降法预估系数
def estimats_weights(train,learning_rate,n_epochs):weights=[0.0 for i in range(len(train[0]))]for epoch in range(n_epochs):sse=0for row in train:prediction = predict(row,weights)error = prediction - row[-1]sse = error **2weights[0] = weights[0] - learning_rate * errorfor i in range(len(row)-1):weights[i+1] = weights[i+1] - learning_rate * error * row[i]print('This is epoch < %s >, sum_error is < %.4f >' %(epoch,sse))return weights#9.感知机函数,用来预测测试数据
def perception(train,test,learning_rate,n_epochs):predictions = list()weights = estimats_weights(train,learning_rate,n_epochs)for row in test:prediction = predict(row,weights)predictions.append(prediction)return predictions#10.运行和参数调整
seed(1)
file='./download_datas/sonar.all-data.csv'
dataset=csv_loader(file)
str_to_float_converter(dataset)
last_column_to_int(dataset)n_folds=5
learning_rate=0.0001
n_epochs=12
algo=perceptionscores=model_test(dataset,algo,n_folds,learning_rate,n_epochs)
print('The score of my model are : %s ' %scores)
print('The average accuracy is : %.3f%% ' %(sum(scores)/float(len(scores))))

感知机之UCI声呐数据判断物体相关推荐

  1. 【Unity3D自学记录】判断物体是否在镜头内

    判断物体是否在镜头内. 其实很简单的方法 代码如下: [csharp] view plaincopy using UnityEngine; using System.Collections; publ ...

  2. Python使用逻辑回归算法根据三围数据判断用户性别

    逻辑回归算法是一种经典的分类算法,使用时应注意: 1)样本需要足够多. 2)样本的多个特征之间尽量不要存在线性相关性. 问题描述: 根据三围数据判断用户性别.假设男性和女性的三围和身高的计算公式如下: ...

  3. 浮点型数据判断相等不能直接使用==

    浮点型数据判断相等不能直接使用== 算术判等 与0.0d或0.0f作算术比较时允许的,考虑使用Float或者Double的compare(f1,f2)方法,或者BigDecimal 浮点数判等 由于浮 ...

  4. EasyUI/TopJUI可编辑表格的列根据返回数据判断是使用 combobox 还是 numberbox

    这两天研究了一下topjui的可编辑表格edatagrid,想在每一列的后面根据返回的数据判断是使用 combobox 还是 numberbox,期间遇到了一些坑,下面实现代码,需要的朋友可以参考一下 ...

  5. datagridview中读取数据判断+考勤每月上班天数判断

    数据判断: 从datagridview中读取,有些数据是NULL,有些是空字符串" " int a = 0;int.TryParse(row.Cells["LateNum ...

  6. 《UCD火花集2:有效的互联网产品设计 交互/信息设计 用户研究讨论》一1.3 数据—判断淘宝店铺页面设计优劣的显微镜...

    本节书摘来自异步社区<UCD火花集2:有效的互联网产品设计 交互/信息设计 用户研究讨论>一书中的第1章,第1.3节,作者 UCDChina,更多章节内容可以访问云栖社区"异步社 ...

  7. combobox 远程url java返回参数_TopJUI可编辑表格的列根据返回数据判断是使用 combobox 还是 numberbox...

    这两天研究了一下topjui的可编辑表格edatagrid,想在每一列的后面根据返回的数据判断是使用 combobox 还是 numberbox,期间遇到了一些坑,下面实现代码,需要的朋友可以参考一下 ...

  8. UCI和数据复用在pusch上传输(第六部分)---ldpc编码

    ldpc编码针对的是上下行数据的编码,也是5G最重要的一种编码. 1 TB块添加CRC 这个是和UCI POLAR区别的一个地方,UCI是对每个cb块添加crc. % Get transport bl ...

  9. 【判断语句If】一、键盘录入一个数据,判断该月份的季节。二、李雷买新手机

    键盘录入一个数据,判断该月份的季节 (if语句) 3,4,5月---->春季 6,7,8月---->夏季 9,10,11月->秋季 12,1,2---->冬季 /* *键盘录入 ...

最新文章

  1. apache集成tomcat,并根据域名进行分发 屏蔽端口显示
  2. python图片批量处理器_用python给图片批量打水印
  3. 秒半价,限三天。戴尔i7高配电脑低至2750元
  4. 我的第一个python web开发框架(2)——一个简单的小外包
  5. 使用jquery ajax代替iframe
  6. be my friend
  7. wifi协议_图解 802.11wifi协议
  8. python数字排序_python按照列表元素中的数字大小排序
  9. 史上最详细MySQL5.5复制配置步骤,与以前版本的有所不同
  10. 201709020工作日记--synchronized、ReentrantLock、读写锁
  11. java实现堆栈排序_Java代码为例讲解堆的性质和基本操作以及排序方法
  12. 写一个加密程序对文件加密
  13. 动态图snapshot构建
  14. 折叠屏市场起风,华为、OPPO“你追我赶”
  15. ASP.NET CORE WebAPI 中 Route 属性配置
  16. LVGL8学习之Background Styles
  17. 使用DirectPlay进行网络互联(2)
  18. Eplan P8 窗口宏/符号宏、页宏、宏值集的创建与插入 <四>
  19. 刘强东事件真相?牵牛队长看到一场狂欢
  20. 阿里巴巴中国站按关键字搜索新品数据 API

热门文章

  1. linux 大文件编辑sed,Linux高级文本处理工具之sed(一)
  2. COI实验室技能:MATLAB控制PCO相机
  3. 设计中的手写识别(输入法)思路 -- 上篇
  4. C++基础:[enter] Ctrl+Z [enter] 问题及\n输入输出问题
  5. assert利用蚁剑登录
  6. LocalSend - 无需联网,开源跨平台的局域网文件互传工具(AirDrop 替代品)
  7. SpringBoot 场景开发多面手成长手册
  8. 【CSS练习】IT修真院--练习3-简单界面
  9. python高级绘图师_matplotlib库-python中的绘图师
  10. 戴尔 Vostro 3470 成就商务台式机(i3-8100) 安装Win7系统