一、线性分类–判断该函数属于哪一类

先上例题,然后我会通过两种方法来判断该函数属于哪一类

1、图解法

定义
对于多类问题:模式有 ω1 ,ω2 , … , ωm 个类别,可分三种情况:
第一种情况:每一模式类与其它模式类间可用单个判别平面把一个类分开。这种情况,M类可有M个判别函数,且具有以下性质:


下图所示,每一类别可用单个判别边界与其它类别相分开 。如果一模式X属于ω1,则由图可清楚看出:这时g1(x) >0而g2(x) <0 , g3(x) <0 。ω1 类与其它类之间的边界由 g1(x)=0确定。
详解

2、python代码

def determine(x1,x2):#x1,x2表示模式x=[7,5]^td1x=d1[0]*x1+d1[1]*x2+d1[1]d2x=d2[0]*x1+d2[1]*x2+d2[1]d3x=d3[0]*x1+d1[1]*x2+d3[1]if d1x>0:print("该判定结果:X∈ω1")elif d2x>0:print("该判定结果:X∈ω2")elif d3x>0:print("该判定结果:X∈ω3")else:print("分类失败")
d1=[-1,1,1]#表示d1的系数和截距
d2=[1,1,-4]#表示d2的系数和截距
d3=[-1,1,0]#表示d3的系数和截距
determine(7,5)

二、Fisher线性分类

1、Fisher的概念和几何意义

Fisher判别法是判别分析的方法之一,它是借助于方差分析的思想,利用已知各总体抽取的样品的p维观察值构造一个或多个线性判别函数y=l′x其中l= (l1,l2…lp)′,x= (x1,x2,…,xp)′,使不同总体之间的离差(记为B)尽可能地大,而同一总体内的离差(记为E)尽可能地小来确定判别系数l=(l1,l2…lp)′。数学上证明判别系数l恰好是|B-λE|=0的特征根,记为λ1≥λ2≥…≥λr>0。所对应的特征向量记为l1,l2,…lr,则可写出多个相应的线性判别函数,在有些问题中,仅用一个λ1对应的特征向量l1所构成线性判别函数y1=l′1x不能很好区分各个总体时,可取λ2对应的特征向量l′2建立第二个线性判别函数y2=l′2x,如还不够,依此类推。有了判别函数,再人为规定一个分类原则(有加权法和不加权法等)就可对新样品x判别所属

python代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
path=r'media/Iris.csv'
df = pd.read_csv(path, header=0)
Iris1=df.values[0:50,0:4]
Iris2=df.values[50:100,0:4]
Iris3=df.values[100:150,0:4]
m1=np.mean(Iris1,axis=0)
m2=np.mean(Iris2,axis=0)
m3=np.mean(Iris3,axis=0)
s1=np.zeros((4,4))
s2=np.zeros((4,4))
s3=np.zeros((4,4))
for i in range(0,30,1):a=Iris1[i,:]-m1a=np.array([a])b=a.Ts1=s1+np.dot(b,a)
for i in range(0,30,1):c=Iris2[i,:]-m2c=np.array([c])d=c.Ts2=s2+np.dot(d,c) #s2=s2+np.dot((Iris2[i,:]-m2).T,(Iris2[i,:]-m2))
for i in range(0,30,1):a=Iris3[i,:]-m3a=np.array([a])b=a.Ts3=s3+np.dot(b,a)
sw12=s1+s2
sw13=s1+s3
sw23=s2+s3
#投影方向
a=np.array([m1-m2])
sw12=np.array(sw12,dtype='float')
sw13=np.array(sw13,dtype='float')
sw23=np.array(sw23,dtype='float')
#判别函数以及T
#需要先将m1-m2转化成矩阵才能进行求其转置矩阵
a=m1-m2
a=np.array([a])
a=a.T
b=m1-m3
b=np.array([b])
b=b.T
c=m2-m3
c=np.array([c])
c=c.T
w12=(np.dot(np.linalg.inv(sw12),a)).T
w13=(np.dot(np.linalg.inv(sw13),b)).T
w23=(np.dot(np.linalg.inv(sw23),c)).T
#print(m1+m2) #1x4维度  invsw12 4x4维度  m1-m2 4x1维度
T12=-0.5*(np.dot(np.dot((m1+m2),np.linalg.inv(sw12)),a))
T13=-0.5*(np.dot(np.dot((m1+m3),np.linalg.inv(sw13)),b))
T23=-0.5*(np.dot(np.dot((m2+m3),np.linalg.inv(sw23)),c))
kind1=0
kind2=0
kind3=0
newiris1=[]
newiris2=[]
newiris3=[]
for i in range(30,49):x=Iris1[i,:]x=np.array([x])g12=np.dot(w12,x.T)+T12g13=np.dot(w13,x.T)+T13g23=np.dot(w23,x.T)+T23if g12>0 and g13>0:newiris1.extend(x)kind1=kind1+1elif g12<0 and g23>0:newiris2.extend(x)elif g13<0 and g23<0 :newiris3.extend(x)
#print(newiris1)
for i in range(30,49):x=Iris2[i,:]x=np.array([x])g12=np.dot(w12,x.T)+T12g13=np.dot(w13,x.T)+T13g23=np.dot(w23,x.T)+T23if g12>0 and g13>0:newiris1.extend(x)elif g12<0 and g23>0:newiris2.extend(x)kind2=kind2+1elif g13<0 and g23<0 :newiris3.extend(x)
for i in range(30,50):x=Iris3[i,:]x=np.array([x])g12=np.dot(w12,x.T)+T12g13=np.dot(w13,x.T)+T13g23=np.dot(w23,x.T)+T23if g12>0 and g13>0:newiris1.extend(x)elif g12<0 and g23>0:     newiris2.extend(x)elif g13<0 and g23<0 :newiris3.extend(x)kind3=kind3+1
correct=(kind1+kind2+kind3)/60
print("样本类内离散度矩阵S1:",s1,'\n')
print("样本类内离散度矩阵S2:",s2,'\n')
print("样本类内离散度矩阵S3:",s3,'\n')
print('-----------------------------------------------------------------------------------------------')
print("总体类内离散度矩阵Sw12:",sw12,'\n')
print("总体类内离散度矩阵Sw13:",sw13,'\n')
print("总体类内离散度矩阵Sw23:",sw23,'\n')
print('-----------------------------------------------------------------------------------------------')
print('判断出来的综合正确率:',correct*100,'%')

结果显示:

2、鸢尾花数据集的分类

数据集准备
首先先从网上下载鸢尾花数据集,读者可以通过下列网址直接下载:
添加链接描述

python代码
首先导入要用到的库

import numpy as np
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn import preprocessing
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

对各个变量进行赋值,取出数据集(注意这里我是将数据集放到D盘下的,请更改自己数据集具体地址或复制粘贴到D盘下)

import numpy as np
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn import preprocessing
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipelinedf = pd.read_csv("D:\iris.data", header=0)
x = df.values[:, :-1]
y = df.values[:, -1]
print('x = \n', x)
print('y = \n', y)
le = preprocessing.LabelEncoder()
le.fit(['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'])
print(le.classes_)
y = le.transform(y)
print('Last Version, y = \n', y)

构建线性模型

x = x[:, :2]
x = StandardScaler().fit_transform(x)
lr = LogisticRegression()   # Logistic回归模型
lr.fit(x, y.ravel())        # 根据数据[x,y],计算回归参数

鸢尾花数据集的分类可视化

N, M = 500, 500     # 横纵各采样多少个值
x1_min, x1_max = x[:, 0].min(), x[:, 0].max()   # 第0列的范围
x2_min, x2_max = x[:, 1].min(), x[:, 1].max()   # 第1列的范围
t1 = np.linspace(x1_min, x1_max, N)
t2 = np.linspace(x2_min, x2_max, M)
x1, x2 = np.meshgrid(t1, t2)                    # 生成网格采样点
x_test = np.stack((x1.flat, x2.flat), axis=1)   # 测试点
cm_light = mpl.colors.ListedColormap(['#77E0A0', '#FF8080', '#A0A0FF'])
cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])
y_hat = lr.predict(x_test)       # 预测值
y_hat = y_hat.reshape(x1.shape)                 # 使之与输入的形状相同
plt.pcolormesh(x1, x2, y_hat, cmap=cm_light)     # 预测值的显示
plt.scatter(x[:, 0], x[:, 1], c=y.ravel(), edgecolors='k', s=50, cmap=cm_dark)
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.xlim(x1_min, x1_max)
plt.ylim(x2_min, x2_max)
plt.grid()
plt.savefig('2.png')
plt.show()

计算该线性分类器模型的准确率

y_hat = lr.predict(x)
y = y.reshape(-1)
result = y_hat == y
acc = np.mean(result)
print('准确度: %.2f%%' % (100 * acc))

结果显示

机器学习--python代码实现基于Fisher的线性判别(鸢尾花数据集的分类)相关推荐

  1. python代码:基于强化学习的智能电网的动态定价方法 摘要:提出了一种考虑服务提供商(SP)利润和用户(CUs)成本的分级电力市场中能量管理的动态定价DR算法

    python代码:基于强化学习的智能电网的动态定价方法 摘要:提出了一种考虑服务提供商(SP)利润和用户(CUs)成本的分级电力市场中能量管理的动态定价DR算法. 使用强化学习(RL)描述分层决策框架 ...

  2. 基于逻辑回归模型对鸢尾花数据集进行分类

    基于逻辑回归模型对鸢尾花数据集进行分类 理论知识 不做过多赘述,相关知识有:指数分布族.GLM建模(分布函数+连接函数,对于本例来说是二项分布+sigmoid函数).最大似然函数.交叉熵函数(评估逻辑 ...

  3. 机器学习算法(九): 基于线性判别LDA模型的分类(基于LDA手写数字分类实践)

    机器学习算法(九): 基于线性判别模型的分类 1.前言:LDA算法简介和应用 1.1.算法简介 线性判别模型(LDA)在模式识别领域(比如人脸识别等图形图像识别领域)中有非常广泛的应用.LDA是一种监 ...

  4. Python——两类二维数据线性判别fisher

    题目: 说明:下述问题在 Python 中编程求解. 1.已知两类二维数据, (1)第一类共 4 个样本:[6,6],[4,5],[5,5],[5,4],第二类共 4 个样本: [0,1],[1,2] ...

  5. python机器学习之门之sklearn的使用(使用鸢尾花数据集)

    sklearn全称为scikit learn 专门提供了python机器学习的模块 是一个高效的数据分析算法工具 建议在numpy scipy matplotlib上 对于大多数机器学习 通常有以下四 ...

  6. Python-线性判别分析(Fisher判别分析)使用鸢尾花数据集 Iris

    本博客运行环境为Jupyter Notebook.Python3.使用的数据集是鸢尾花数据集. 目录 线性判别分析 代码实现 缺少一组数据的问题已解决!代码已更新! 线性判别分析 线性判别分析(Lin ...

  7. 机器学习之有监督学习实例_01 —— 鸢尾花数据集的分类

    Iris 数据集简介 : Iris Data Set(鸢尾属植物数据集)首次出现在著名的英国统计学家和生物学家Ronald Fisher 1936年的论文<The use of multiple ...

  8. 【机器学习】决策树案例二:利用决策树进行鸢尾花数据集分类预测

    利用决策树进行鸢尾花数据集分类预测 2 利用决策树进行鸢尾花数据集分类预测 2.1 导入模块与加载数据 2.2 划分数据 2.3 模型创建与应用 2.4 模型可视化 手动反爬虫,禁止转载: 原博地址 ...

  9. slope one 推荐算法python 代码_基于协同的SlopeOne推荐算法原理介绍和实现

    Slope One 算法是由 Daniel Lemire 教授在 2005 年提出的一个 Item-Based 的协同过滤推荐算法. --文章概要 该篇文章主要介绍Slope One算法.Slope ...

最新文章

  1. JAVA命令行编译及运行
  2. Linux二十年产权官司告终:IBM赔偿近亿元,期间“熬死”一位起诉方
  3. 【转】OpenCV里IplImage数据结构极易出错的问题,IplImage和单字节char*的相互转换
  4. python特征递归消除
  5. Lnmp环境安装禅道项目管理软件
  6. 成功解决“ValueError: Unknown metric function:sensitivity”
  7. 2018想要薪资翻倍?你需要掌握这个技能
  8. 在server 2008R2组策略所有域计算机防火墙都处于更关闭状态
  9. tcs标准编写软件_tcs2010下载-tcs2010(中国标准编写模板) 免费版 - 河东下载站
  10. discuz源代码分析
  11. python贴吧爬虫-python贴吧爬虫
  12. python系列之supervisor进程管理
  13. Excel 函数 自定义规则 VBA 实现 实时 语音 声音 提示 功能 股票 数据 资料 获取 盯盘 助手 K线图 模板
  14. 华为机试---Word Maze迷宫游戏
  15. R语言 cor与lm
  16. 03.07:BT下载&区块链技术
  17. HTML5前端开发入门之H系列标签,P标签和Hr标签
  18. 【C++算法模板】日期类型题目:节假日
  19. Python基于Flask框架实现视频直播,电脑桌面录屏web端展示,远程控制电脑
  20. comsol-超导线1

热门文章

  1. 计算机专业马来西亚,去马来西亚读计算机专业如何
  2. 织梦支持html5吗,自动更新HTML FOR DedeCMS V5.3(支持首页,列表页,文章页)
  3. 超全面整理,Selenium 八大元素定位方式,(建议收藏反复使用)
  4. 公交/地铁出行测试点
  5. 文献阅读软件_推荐一款阅读英文文献的神器,效率高不少,理解深不少!
  6. Selenium与Cypress的比较
  7. 同样是点工,凭什么他拿月薪20k,你却只有10k?
  8. 迪士尼小哥转行测试,月薪翻倍:成年人的童话世界, 需要自己创造
  9. python sys模块 argv用法_python中sys模块的argv
  10. DID会固定年份吗_倍分法DID详解 (二):多时点 DID (渐进DID)