python感知机分类乳腺癌数据集

一、感知机介绍

感知器(英语:Perceptron)是Frank Rosenblatt在1957年就职于康奈尔航空实验室(Cornell Aeronautical Laboratory)时所发明的一种人工神经网络。它可以被视为一种最简单形式的前馈神经网络,是一种二元线性分类器。Frank Rosenblatt给出了相应的感知机学习算法,常用的有感知机学习、最小二乘法和梯度下降法。譬如,感知机利用梯度下降法对损失函数进行极小化,求出可将训练数据进行线性划分的分离超平面,从而求得感知机模型。感知机是生物神经细胞的简单抽象。神经细胞结构大致可分为:树突突触细胞体轴突。单个神经细胞可被视为一种只有两种状态的机器——激动时为‘是’,而未激动时为‘否’。神经细胞的状态取决于从其它的神经细胞收到的输入信号量,及突触的强度(抑制或加强)。当信号量总和超过了某个阈值时,细胞体就会激动,产生电脉冲。电脉冲沿着轴突并通过突触传递到其它神经元。为了模拟神经细胞行为,与之对应的感知机基础概念被提出,如权量(突触)、偏置(阈值)及激活函数(细胞体)。

在人工神经网络领域中,感知机也被指为单层的人工神经网络,以区别于较复杂的多层感知机(Multilayer Perceptron)。作为一种线性分类器,(单层)感知机可说是最简单的前向人工神经网络形式。尽管结构简单,感知机能够学习并解决相当复杂的问题。感知机主要的本质缺陷是它不能处理线性不可分问题。

二、感知机原理

感知机算法的原理和线性回归算法的步骤大致相同,只是预测函数H和权值更新规则不同,这里将感知机算法应用于二分类。

三、数据集介绍

乳腺癌数据集,其实例数量是569,实例中包括诊断类和属性,帮助预测的属性是30,各属性包括为radius 半径(从中心到边缘上点的距离的平均值),texture 纹理(灰度值的标准偏差)等等,类包括:WDBC-Malignant 恶性和WDBC-Benign 良性。用数据集的70%作为训练集,数据集的30%作为测试集,训练集和测试集中都包括特征和诊断类。

四、感知机算法的代码实现与结果分析

代码实现:

import pandas as pd#用pandas读取数据import matplotlib.pyplot as pltimport numpy as npfrom sklearn import preprocessing

from matplotlib.colors import ListedColormapfrom perceptron import Perceptronfrom scipy.special import expit#这是sign()函数from sklearn.model_selection import train_test_split

def loadDataSet():    # df=pd.read_csv("Breast_ Cancer_ Data.csv")    # # print(df.head())    # # print(df.tail())    # label=df.ix[:,1]    # data=df.ix[:,2:32]#数据类型没有转换,比如31.48,是str类型,需要将其转换为float    #    # m=data.shape[0]    # data=np.array(data,dtype=float)    #    # for i in range(m):    #     if label[i]==‘B‘:    #         label[i]=0    #     else :    #         label[i]=1    # train_x, test_x, train_y, test_y = train_test_split(data, label, test_size=0.30, random_state=0)  # 划分数据集和测试集

df = pd.read_csv("Breast_ Cancer_ Data.csv")    dataArray=np.array(df)    testRatio=0.3    dataSize=dataArray.shape[0]    testNum=int(testRatio*dataSize)    trainNum=dataSize-testNum

train_x=np.array(dataArray[0:trainNum,2:],dtype=np.float)    test_x=np.array(dataArray[trainNum:,2:],dtype=np.float)    train_y=dataArray[0:trainNum,1]    test_y = dataArray[trainNum:, 1]    for i in range(trainNum):        if train_y[i]==‘B‘:            train_y[i]=1        else:            train_y[i]=0    for i in range(testNum):        if test_y[i] == ‘B‘:            test_y[i] = 1        else:            test_y[i] = 0

return train_x,test_x,train_y,test_y

# def sign(inner_product):#     if inner_product >= 0:#         return 1#     else:#         return 0

#学习模型,学的参数thetadef train_model(train_x,train_y,theta,learning_rate,iteration):    m=train_x.shape[0]    n=train_x.shape[1]

J_theta=np.zeros((iteration,1))#列向量    train_x=np.insert(train_x,0,values=1,axis=1)#相当于x0,加在第一列上    for i in range(iteration):#迭代        # temp=theta #暂存        # J_theta[i]=sum(sum((train_y-expit(np.dot(train_x,theta)))**2)/2.0)#dot是内积,sum函数是将减掉后的列向量求和成一个数        J_theta[i]=sum((train_y[:,np.newaxis]-expit(np.dot(train_x,theta)))**2)/2.0#dot是内积,sum函数是将减掉后的列向量求和成一个数

for j in range(n):#j是第j个属性,但是所有属性对应的的theta都要更新,故要循环            # temp[j]=temp[j]+learning_rate*np.dot((train_x[:,j].T)[np.newaxis],(train_y[:,np.newaxis]-expit(np.dot(train_x,theta))))#T是转置            # temp[j]=temp[j]+learning_rate*np.dot(train_x[:,j].T,(train_y-expit(np.dot(train_x,theta))))#T是转置            theta[j]=theta[j]+learning_rate*np.dot((train_x[:,j].T)[np.newaxis],(train_y[:,np.newaxis]-expit(np.dot(train_x,theta))))#T是转置

# theta=temp

x_iteration=np.linspace(0,iteration,num=iteration)    plt.plot(x_iteration,J_theta)    plt.show()    return theta

def predict(test_x,test_y,theta):#假设theta是已经学习好的参数传递进来    errorCount=0    m=test_x.shape[0]    test_x=np.insert(test_x,0,values=1,axis=1)#相当于x0    h_theta = expit(np.dot(test_x, theta))

for i in range(m):        if h_theta[i]>0.5:            h_theta[i]=1        else:            h_theta[i]=0        if h_theta[i]!=test_y[i]:#test_y[i]需要是0或者1才能比较,因为h_theta[i]就是0或者1            errorCount+=1    error_rate=float(errorCount)/m    print("error_rate ",error_rate)

#特征缩放中的标准化方法,注意:numpy中的矩阵运算要多运用def Standardization(x):#x是data    m=x.shape[0]    n=x.shape[1]    x_average=np.zeros((1,n))#x_average是1*n矩阵    sigma = np.zeros((1, n))  # sigma是1*n矩阵    x_result=np.zeros((m, n))  # x_result是m*n矩阵

x_average=sum(x)/m    # x_average = x.mean(axis=0)#用np的mean函数也可以求得每一列的平均值

# for i in range(n):    #     for j in range(m):    #         x_average[0][i] +=(float(x[j][i]))    #     x_average[0][i]/=m

# sigma=(sum((x-x_average)**2)/m)**0.5#m*n的矩阵减去1*n的矩阵的话,会广播,1*n的矩阵会复制成m*n的矩阵    sigma = x.var(axis=0)  # 用np的var函数来求每一列的方差    # for i in range(n):    #     for j in range(m):    #         sigma[0][i]+=((x[j][i]-x_average[0][i])**2.0)    #     sigma[0][i]=(sigma[0][i]/m)**0.5

x_result=(x-x_average)/sigma#对应的元素相除    # for i in range(n):    #     for j in range(m):    #         x_result[j][i]=(x[j][i]-x_average[0][i])/sigma[0][i]

return x_result

#特征缩放中的调节比例方法def Rescaling(x):    m = x.shape[0]    n = x.shape[1]    x_min=np.zeros((1,n))#x_min是1*n矩阵    x_max=np.zeros((1,n))#x_max是1*n矩阵    x_result = np.zeros((m, n))  # x_result是m*n矩阵    # for i in range(n):    #     x_min[0][i]=x[0][i]    #     x_max[0][i]=x[0][i]    #     for j in range(1,m):    #         if x_min[0][i]>x[j][i]:    #             x_min[0][i]=x[j][i]    #         if x_max[0][i]<x[j][i]:    #             x_max[0][i]=x[j][i]    # for i in range(n):    #     for j in range(m):    #         x_result[j][i]=(x[j][i]-x_min[0][i])/(x_max[0][i]-x_min[0][i])

x_min=x.min(axis=0)#获得每个列的最小值    x_max=x.max(axis=0)#获得每个列的最大值    x_result = (x - x_min) / (x_max - x_min)

return x_result

if __name__==‘__main__‘:    train_x, test_x, train_y, test_y=loadDataSet()    # scaler=preprocessing.MinMaxScaler()    # train_x=scaler.fit_transform(train_x)    # test_x=scaler.fit_transform(test_x)

# train_x=Standardization(train_x)    # test_x=Standardization(test_x)

# train_x=Rescaling(train_x)    # test_x=Rescaling(test_x)

n=test_x.shape[1]+1    theta=np.zeros((n,1))    # theta=np.random.rand(n,1)#随机构造1*n的矩阵    theta_new=train_model(train_x,train_y,theta,learning_rate=0.001,iteration=1000)#用rescaling的时候错误率0.017

predict(test_x, test_y, theta_new)

结果展示和分析:

感知机分类乳腺癌数据集的实验

实验的迭代次数1000,学习率0.001,对特征缩放的方法效果进行比较,如表3所示。

表3 分类错误率和特征缩放的方法的关系


特征缩放


Standardization


Rescaling


分类错误率


0.182


0.017

Standardization标准化方法的J随着迭代次数的变化图如图1所示:

图1 标准化方法的效果图

Rescaling调节比例方法的J随着迭代次数的变化图如图2所示:

图2 调节比例方法的效果图

图1 说明迭代次数和学习率等参数未调节到使效果较好的值;图2的效果比较好,损失函数逐渐降低并且趋于平缓;比较两种方法,相对来说调节比例的方法优于标准化方法。



原文地址:https://www.cnblogs.com/BlueBlue-Sky/p/9383097.html

时间: 2024-10-10 16:11:27

python感知机分类乳腺癌数据集的相关文章

python逻辑回归分类MNIST数据集

一.逻辑回归的介绍 logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域.例如,探讨引发疾病的危险因素,并根据危险因素预测疾病发生的概率等.以胃癌病情分析为例,选择两组人群,一组是胃癌组,一组是非胃癌组,两组人群必定具有不同的体征与生活方式等.因此因变量就为是否胃癌,值为"是"或"否",自变量就可以包括很多了,如年龄.性别.饮食习惯.幽门螺杆菌感染等.自变量既可以是连续的,也可以是分类的.然后通

13、Selenium+python+API分类总结

Selenium+python+API分类总结 http://selenium-python.readthedocs.org/index.html 分类 方法 方法描述 客户端操作 __init__(self, host, port, browserStartCommand, browserURL) 构造函数.host:selenium server的ip:port:elenium server的port,默认为4444:browserStartCommand:浏览器类型,iexplore,fi

机器学习经典分类算法 —— k-均值算法(附python实现代码及数据集)

目录 工作原理 python实现 算法实战 对mnist数据集进行聚类 小结 附录 工作原理 聚类是一种无监督的学习,它将相似的对象归到同一个簇中.类似于全自动分类(自动的意思是连类别都是自动构建的).K-均值算法可以发现k个不同的簇,且每个簇的中心采用簇中所含值的均值计算而成.它的工作流程的伪代码表示如下: 创建k个点作为起始质心 当任意一个点的簇分配结果发生改变时 对数据集中的每个数据点 对每个质心 计算质心与数据点之间的距离 将数据点分配到距其最近的簇 对每一个簇,计算簇中所有点的均值并将

spark机器学习笔记:(五)用Spark Python构建分类模型(下)

声明:版权所有,转载请联系作者并注明出处  http://blog.csdn.net/u013719780?viewmode=contents 博主简介:风雪夜归子(英文名:Allen),机器学习算法攻城狮,喜爱钻研Meachine Learning的黑科技,对Deep Learning和Artificial Intelligence充满兴趣,经常关注Kaggle数据挖掘竞赛平台,对数据.Machine Learning和Artificial Intelligence有兴趣的童鞋可以一起探讨哦,

【机器学习实验】学习Python来分类现实世界的数据

引入 一个机器能够依据照片来辨别鲜花的品种吗?在机器学习角度,这事实上是一个分类问题.即机器依据不同品种鲜花的数据进行学习.使其能够对未标记的測试图片数据进行分类. 这一小节.我们还是从scikit-learn出发,理解主要的分类原则,多动手实践. Iris数据集 Iris flower数据集是1936年由Sir Ronald Fisher引入的经典多维数据集.能够作为判别分析(discriminant analysis)的样本.该数据集包括Iris花的三个品种(Iris setosa, Iri

【scikit-learn】学习Python来分类现实世界的数据

引入 一个机器可以根据照片来辨别鲜花的品种吗?在机器学习角度,这其实是一个分类问题,即机器根据不同品种鲜花的数据进行学习,使其可以对未标记的测试图片数据进行分类. 这一小节,我们还是从scikit-learn出发,理解基本的分类原则,多动手实践. Iris数据集 Iris flower数据集是1936年由Sir Ronald Fisher引入的经典多维数据集,可以作为判别分析(discriminant analysis)的样本.该数据集包含Iris花的三个品种(Iris setosa, Iris

python入门-分类和回归各种初级算法

引自:http://www.cnblogs.com/taichu/p/5251332.html ########################### #说明: # 撰写本文的原因是,笔者在研究博文"http://python.jobbole.com/83563/"中发现 # 原内容有少量笔误,并且对入门学友缺少一些信息.于是笔者做了增补,主要有: # 1.查询并简述了涉及的大部分算法: # 2.添加了连接或资源供进一步查询: # 3.增加了一些lib库的基本操作及说明: # 4.增加

gabor变换人脸识别的python实现,att_faces数据集平均识别率99%

大家都说gabor做人脸识别是传统方法中效果最好的,这几天就折腾实现了下,网上的python实现实在太少,github上的某个版本还误导了我好几天,后来采用将C++代码封装成dll供python调用的方式,成功解决. 图像经多尺度多方向的gabor变换后,gabor系数的数目成倍上升,所以对gabor系数必须进行降维才能送至后续的SVM分类器.测试图像使用att_faces数据集(40种类型,每种随机选5张训练,5张识别),降维方式我测试了DCT.PCA两种变换方式,说实话,dct不怎么靠谱,居

机器学习之路: python 决策树分类 预测泰坦尼克号乘客是否幸存

使用python3 学习了决策树分类器的api 涉及到 特征的提取,数据类型保留,分类类型抽取出来新的类型 需要网上下载数据集,我把他们下载到了本地, 可以到我的git下载代码和数据集: https://github.com/linyi0604/MachineLearning 1 import pandas as pd 2 from sklearn.cross_validation import train_test_split 3 from sklearn.feature_extraction