python实现线性判别函数

数据

在这里插入图片描述
将数据保存到txt文件中,如下图所示,最后一列代表类别
在这里插入图片描述

批更新 感知机 算法实现

import numpy as np
import matplotlib.pyplot as plt

def batch_perception(data,yt,w1,w2):

    a = np.array([[0, 0, 0]])
    w1 = str(w1)
    w2 = str(w2)
    #散点图绘制
    plt.scatter(data[0:10, 0], data[0:10, 1], c='r', label='w'+w1)
    plt.scatter(data[10:20, 0], data[10:20, 1], c='y', label='w'+w2)
    plt.xlabel('x1')
    plt.ylabel('x2')
    plt.title('w'+w1+' and '+'w'+w2+' scatter')
    plt.legend()
    plt.grid(True)
    plt.show()
    y = np.ones(data.shape)
    y[:, 0:2] = data[:, 0:2]
    #规范化
    y[10:20, :] = -y[10:20, :]
    f = 1
    c = 0
    while f != 0:
        g = np.dot(a, y.T)
        fn = y[np.argwhere(g[0] <= 0)]
        for i in range (fn.shape[0]):
            a = a+yt*fn[i, :]
        f = fn.shape[0]
        # 记录收敛次数
        c += 1
    #绘制决策面
    plt.scatter(data[0:10, 0], data[0:10, 1], c='r', label='w'+w1)
    plt.scatter(data[10:20, 0], data[10:20, 1], c='y', label='w'+w2)
    plt.plot(data[:, 0], -(a[0][0]*data[:, 0]+a[0][2]*1)/a[0][1], label='decision boundary')
    plt.xlabel('x1')
    plt.ylabel('x2')
    plt.title('w'+w1+' and '+'w'+w2+' decision boundary')
    plt.legend()
    plt.grid(True)
    plt.show()
    return a, c


if __name__ == '__main__':
    data = np.loadtxt('data.txt')
    [a1, c1] = batch_perception(data[0:20, :],0.01,1,2)
    [a2, c2] = batch_perception(data[10:30, :],0.01,2,3)
    print(c1)
    print(c2)

运行结果

收敛步数:24
在这里插入图片描述
在这里插入图片描述
收敛次数 17
在这里插入图片描述
在这里插入图片描述

Ho-Kashyap algorithm

import numpy as np
import matplotlib.pyplot as plt



def isBreak(x, y):
    for i in range(x.shape[1]):
        if x[0][i] > y:
            return False
    return True


def Ho_Kashyap(data, yt,w1,w2):
    w1 = str(w1)
    w2 = str(w2)
    plt.scatter(data[0:10, 0], data[0:10, 1], c='r', label='w'+w1)
    plt.scatter(data[10:20, 0], data[10:20, 1], c='y', label='w'+w2)
    plt.xlabel('x1')
    plt.ylabel('x2')
    plt.title('w' + w1 + ' and ' + 'w' + w2 + ' scatter')
    plt.legend()
    plt.grid(True)
    plt.show()
    y = np.ones(data.shape)
    y[:, 0:2] = data[:, 0:2]
    y[10:20, :] = -y[10:20, :]
    a = np.zeros([1, 3])
    n = data.shape[0]
    b = np.ones([1, n])*0.5
    bmin = 0.1
    kmax = 20000
    k = 0
    while k < kmax:
        e = np.dot(a, y.T)-b
        e1 = 1/2*(e+np.abs(e))
        b = b+2*yt*e1
        a = np.dot(b, np.linalg.pinv(y.T))
        if isBreak(np.abs(e), bmin):
            return [a, b, e]
        k = k+1
    print("未找到")
    return None

def pic(data, a, b, w1,w2):

    w1 = str(w1)
    w2 = str(w2)
    plt.scatter(data[0:10, 0], data[0:10, 1], c='r', label='w' + w1)
    plt.scatter(data[10:20, 0], data[10:20, 1], c='y', label='w' + w2)
    plt.legend()
    plt.plot(data[:, 0], -(a[0][0] * data[:, 0] + a[0][2] * 1) / a[0][1], label='decision boundary')
    plt.xlabel('x1')
    plt.ylabel('x2')
    plt.title('ho kashyap '+'w' + w1 + ' and ' + 'w' + w2 + ' decision boundary')
    plt.legend()
    plt.grid(True)
    plt.show()


def as_num(x):
    y='{:.12f}'.format(x)
    return(y)


if __name__ == '__main__':
    data = np.loadtxt('data.txt')
    data1 = np.vstack((data[0:10, :], data[20:30, :]))
    data2 = np.vstack((data[10:20, :], data[30:40, :]))
    x1 = Ho_Kashyap(data1, 0.01, 1, 3)
    x2 = Ho_Kashyap(data2, 0.01, 2, 4)
    if x1 != None:
        pic(data1, x1[0], x1[1], 1, 3)
        print(x1[2])
    if x2 != None:
        pic(data2, x2[0], x2[1], 2, 4)
        print(x2[2])


运行结果

在这里插入图片描述在这里插入图片描述

MSE

import numpy as np
import matplotlib.pyplot as plt

class MSE():

    def process(self,data,c):
        n = data.shape[0]
        c1 = c.shape[0]
        y_label = np.zeros([n, c1])
        index = data[:, 2]-1
        for i in range(data.shape[0]):
            y_label[i, int(index[i])] = 1
        x = np.ones((n, 3))
        x[:, 0:2] = data[:, 0:2]
        return x, y_label

    def MSE_train(self, data_train, c):
        x, y_label = self.process(data_train, c)
        w = np.ones_like(x.T)
        w = np.matmul(np.linalg.pinv(x), y_label)
        self.w = w

    def MSE_test(self, data_test, c):
        x, y_label = self.process(data_test,c)
        y_test = np.matmul(self.w.T, x.T)
        correct = np.sum(np.argmax(y_test.T, axis=1)==np.argmax(y_label,axis=1))/len(y_label)
        return correct


if __name__ == '__main__':
    data = np.loadtxt("data.txt")
    for i in range(4):
        if i == 0:
            data_train = data[i*10:i*10+8, :]
            data_test = data[i*10+8:i*10+10, :]
        if i != 0:
            data_train = np.append(data_train, data[i*10:i*10+8, :], axis=0)
            data_test = np.append(data_test, data[i*10+8:i*10+10, :], axis=0)
    c = np.array([1,2,3,4])
    M = MSE()
    M.MSE_train(data_train,c)
    correct = M.MSE_test(data_test,c)
    print('测试样本正确率:',correct)


运行结果

在这里插入图片描述

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Fisher判别是一种经典的统计学习方法,常用于二分类问题。在Python中,可以使用Scikit-learn库中的Fisher判别分析函数实现。具体步骤如下: 1. 导入库和数据集 ``` from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.datasets import load_iris iris = load_iris() X = iris.data y = iris.target ``` 2. 创建Fisher判别分析模型 ``` lda = LinearDiscriminantAnalysis(n_components=2) ``` n_components参数指定了降维后的特征数,这里设置为2。 3. 拟合模型并进行降维 ``` X_lda = lda.fit_transform(X, y) ``` 4. 可视化降维后的数据 ``` import matplotlib.pyplot as plt plt.scatter(X_lda[:, 0], X_lda[:, 1], c=y) plt.show() ``` 这里使用散点图将数据可视化,不同颜色的点代表不同的类别。 以上就是使用Python实现Fisher判别分析的基本步骤。 ### 回答2: fisher判别是一种常用的模式分类算法,其基本思想是找到能够最好地区分不同类别的特征组合。它通过计算特征的差异性来选择最佳的特征子集,并通过建立分类模型将样本分为不同的类别。 使用python进行fisher判别实现步骤如下: 1. 读取输入数据,并将其分为两个或多个类别。 2. 计算每个特征的均值和方差,以及类别之间的差异性。 3. 使用计算的统计量,计算fisher判别的评分指标,用于选择最佳的特征子集。 4. 根据选定的特征子集,构建fisher判别模型,用于分类新的未知样本。 5. 使用模型对测试数据进行预测,并评估模型的性能。 在python中,可以使用scikit-learn等机器学习库来实现fisher判别算法。以下是一个简单的示例代码: ```python from sklearn.discriminant_analysis import LinearDiscriminantAnalysis # 读取输入数据和标签 X = ... # 输入数据 y = ... # 标签 # 创建fisher判别模型对象 lda = LinearDiscriminantAnalysis() # 训练fisher判别模型 lda.fit(X, y) # 对新样本进行分类预测 new_samples = ... # 新样本输入数据 predictions = lda.predict(new_samples) # 输出预测结果 print(predictions) ``` 通过以上步骤,我们可以使用python实现fisher判别算法,并对新的未知样本进行分类预测。通过这种方法,我们可以利用fisher判别来进行模式分类任务,使得我们能够更好地区分不同类别的样本。 ### 回答3: Fisher判别是一种经典的统计学习方法,用于解决二分类问题。它通过找到具有最佳分类能力的投影方向,将样本映射到一维空间中,然后根据映射后的样本值进行分类。 在Python中,我们可以使用scikit-learn库中的`LinearDiscriminantAnalysis`类实现Fisher判别。首先,我们需要导入相关的库: ``` from sklearn.discriminant_analysis import LinearDiscriminantAnalysis ``` 然后,根据数据的特征和标签,创建一个`LinearDiscriminantAnalysis`对象: ``` lda = LinearDiscriminantAnalysis() ``` 接下来,使用`fit`方法将数据拟合到模型中: ``` lda.fit(X, y) ``` 其中,`X`表示特征矩阵,`y`表示标签向量。拟合完成后,模型就会根据Fisher准则找到最佳的投影方向。 最后,我们可以使用训练好的模型进行预测。对于新的样本数据,可以使用`predict`方法返回其预测结果: ``` y_pred = lda.predict(X_new) ``` 其中,`X_new`表示新的样本数据。 除了进行分类预测外,我们还可以使用`transform`方法将原始数据映射到一维空间: ``` X_lda = lda.transform(X) ``` 这样,我们可以通过绘制映射后的数据来观察它们在一维空间中的分布情况。 总之,使用Python中的`LinearDiscriminantAnalysis`类可以方便地实现Fisher判别算法,并进行分类预测或数据映射。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值