W=(Sw^(-1))*(m1-m2)') 警告: 矩阵为奇异工作精度。怎么解决
时间: 2024-06-03 16:11:38 浏览: 175
这个警告是由于矩阵的行列式为0,导致矩阵无法求逆。如果你需要使用矩阵求逆的结果,可以考虑以下几种方法:
1. 检查矩阵的数据是否正确,是否存在数据错误或者缺失,如果有则需要修正或者进行填充。
2. 尝试使用其他的求逆方法,比如伴随矩阵法或者QR分解法等。
3. 如果你的矩阵是近似奇异的,可以使用奇异值分解来处理。奇异值分解可以得到矩阵的伪逆,从而避免了求逆带来的数值问题。
4. 考虑使用其他的算法或者方法来避免求逆。比如说,可以使用迭代法等方法求解线性方程组。
需要注意的是,根据你的具体情况,选择合适的方法是非常重要的。如果你不确定如何选择,可以咨询专业人士或者进行深入研究。
相关问题
import numpy as np import math import matplotlib.pyplot as plt x1=[0.23,1.52,0.65,0.77,1.05,1.19,0.29,0.25,0.66,0.56,0.90,0.13,-0.54,0.94,-0.21,0.05,-0.08,0.73,0.33,1.06,-0.02,0.11,0.31,0.66] y1=[2.34,2.19,1.67,1.63,1.78,2.01,2.06,2.12,2.47,1.51,1.96,1.83,1.87,2.29,1.77,2.39,1.56,1.93,2.20,2.45,1.75,1.69,2.48,1.72] x2=[1.40,1.23,2.08,1.16,1.37,1.18,1.76,1.97,2.41,2.58,2.84,1.95,1.25,1.28,1.26,2.01,2.18,1.79,1.33,1.15,1.70,1.59,2.93,1.46] y2=[1.02,0.96,0.91,1.49,0.82,0.93,1.14,1.06,0.81,1.28,1.46,1.43,0.71,1.29,1.37,0.93,1.22,1.18,0.87,0.55,0.51,0.99,0.91,0.71] w1=[[0 for i in range(2)]for i in range(24)] w2=[[0 for i in range(2)]for i in range(24)] for i in range(24): w1[i][0]=x1[i] w1[i][1]=y1[i] w2[i][0]=x2[i] w2[i][1]=y2[i] print('整合矩阵w1 w2') print(w1) print(w2) m1=np.mean(w1,0) m2=np.mean(w2,0) print('计算两类均值向量') print(m1) print(m2) s10=[0,0] s20=[0,0] s1=[[0 for i in range(2)]for j in range(2)] s2=[[0 for i in range(2)]for j in range(2)] for i in range(24): s10[0]=(w1[i][0]-m1[0]) s10[1]=(w1[i][1]-m1[1]) s11=np.mat(s10) s1+=np.mat((s11.T)*s11) s20[0]=(w2[i][0]-m2[0]) s20[1]=(w2[i][1]-m2[1]) s22=np.mat(s20) s2+=np.mat((s22.T)*s22) print('s1') print(s1) print('s2') print(s2) sw=s1+s2 print('sw') print(sw) w_new=(np.mat(sw)).I*(np.mat((m1-m2)).T) print('w_new') print(w_new) m1_new=m1*w_new m2_new=m2*w_new pw1=0.6 pw2=0.4 w0=(m1_new+m2_new)/2-math.log(pw1/pw2)/(24+24-2) print('w0') print(w0) 这是python的代码,请给每行代码注释
import numpy as np // 导入numpy模块,用于科学计算
import math // 导入math模块,用于数学计算
import matplotlib.pyplot as plt // 导入matplotlib模块,用于数据可视化
x1=[0.23,1.52,0.65,0.77,1.05,1.19,0.29,0.25,0.66,0.56,0.90,0.13,-0.54,0.94,-0.21,0.05,-0.08,0.73,0.33,1.06,-0.02,0.11,0.31,0.66] // 输入第一类数据的x值
y1=[2.34,2.19,1.67,1.63,1.78,2.01,2.06,2.12,2.47,1.51,1.96,1.83,1.87,2.29,1.77,2.39,1.56,1.93,2.20,2.45,1.75,1.69,2.48,1.72] // 输入第一类数据的y值
x2=[1.40,1.23,2.08,1.16,1.37,1.18,1.76,1.97,2.41,2.58,2.84,1.95,1.25,1.28,1.26,2.01,2.18,1.79,1.33,1.15,1.70,1.59,2.93,1.46] // 输入第二类数据的x值
y2=[1.02,0.96,0.91,1.49,0.82,0.93,1.14,1.06,0.81,1.28,1.46,1.43,0.71,1.29,1.37,0.93,1.22,1.18,0.87,0.55,0.51,0.99,0.91,0.71] // 输入第二类数据的y值
w1=[[0 for i in range(2)]for i in range(24)] // 创建一个2*24的全零数组,用于存储第一类数据
w2=[[0 for i in range(2)]for i in range(24)] // 创建一个2*24的全零数组,用于存储第二类数据
for i in range(24): // 循环遍历24个数据点
w1[i][0]=x1[i] // 将第一类数据的x值存入w1中
w1[i][1]=y1[i] // 将第一类数据的y值存入w1中
w2[i][0]=x2[i] // 将第二类数据的x值存入w2中
w2[i][1]=y2[i] // 将第二类数据的y值存入w2中
print('整合矩阵w1 w2') // 输出字符串“整合矩阵w1 w2”
print(w1) // 输出第一类数据(w1)
print(w2) // 输出第二类数据(w2)
m1=np.mean(w1,0) // 计算第一类数据的平均值向量
m2=np.mean(w2,0) // 计算第二类数据的平均值向量
print('计算两类均值向量') // 输出字符串“计算两类均值向量”
print(m1) // 输出第一类数据的平均值向量
print(m2) // 输出第二类数据的平均值向量
s10=[0,0] // 创建一个长度为2的全零数组,用于存放计算差值后的数据
s20=[0,0] // 创建一个长度为2的全零数组,用于存放计算差值后的数据
s1=[[0 for i in range(2)]for j in range(2)] // 创建一个2*2的全零数组,用于存放第一类数据的协方差矩阵
s2=[[0 for i in range(2)]for j in range(2)] // 创建一个2*2的全零数组,用于存放第二类数据的协方差矩阵
for i in range(24): // 循环遍历24个数据点
s10[0]=(w1[i][0]-m1[0]) // 计算第一类数据的x值与平均值向量的差值
s10[1]=(w1[i][1]-m1[1]) // 计算第一类数据的y值与平均值向量的差值
s11=np.mat(s10) // 将差值转换成矩阵类型
s1 =np.mat((s11.T)*s11) // 计算第一类数据的协方差矩阵
s20[0]=(w2[i][0]-m2[0]) // 计算第二类数据的x值与平均值向量的差值
s20[1]=(w2[i][1]-m2[1]) // 计算第二类数据的y值与平均值向量的差值
s22=np.mat(s20) // 将差值转换成矩阵类型
s2 =np.mat((s22.T)*s22) // 计算第二类数据的协方差矩阵
print('s1') // 输出字符串“s1”
print(s1) // 输出第一类数据的协方差矩阵
print('s2') // 输出字符串“s2”
print(s2) // 输出第二类数据的协方差矩阵
sw=s1+s2 // 计算总协方差矩阵
print('sw') // 输出字符串“sw”
print(sw) // 输出总协方差矩阵
w_new=(np.mat(sw)).I*(np.mat((m1-m2)).T) // 计算Fisher分类器的权向量
print('w_new') // 输出字符串“w_new”
print(w_new) // 输出Fisher分类器的权向量
m1_new=m1*w_new // 计算第一类数据在新坐标系下的投影
m2_new=m2*w_new // 计算第二类数据在新坐标系下的投影
pw1=0.6 // 设置先验概率1的权重
pw2=0.4 // 设置先验概率2的权重
w0=(m1_new+m2_new)/2-math.log(pw1/pw2)/(24+24-2) // 计算阈值
print('w0') // 输出字符串“w0”
print(w0) // 输出阈值
阅读全文