二分矩阵

Poj 3233题意要求矩阵S=A+A^2+A^3+...+A^k mod m,可以用二分的方法
首先矩阵相乘用一次二分,然后求和再用一次二分,两次二分。
其中,矩阵相乘二分: A^2k=A^k*A^k,
A^(2k+1)=A^k*A^k*A.
求和二分: A+A^2+A...+A^(2k+1) = A+A^2+...+A^k+A^(k+1)+A^(k+1)*(A+A^2+...+A^k).
A+A^2+...+A^2k  = A+A^2+...+A^k+A^k*(A+A^2+...+A^k).

我的代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int n,m,k;
struct DATA
{
int a[32][32];
};
DATA point;
DATA mul(DATA a,DATA b)
{
    int i,j,k;
    DATA c;
    memset(c.a,0,sizeof(c.a));
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    {
        if(a.a[i][j])//在这里优化了一下,仔细研究下
        for(k=0;k<n;k++)
        {
            c.a[i][k]+=a.a[i][j]*b.a[j][k];
            c.a[i][k]=c.a[i][k]%m;
            }
 }
     return c;
}
DATA mu(DATA a,int y)
{
    int i,j;
    DATA c;
    memset(c.a,0,sizeof(c.a));
    for(i=0;i<n;i++)
    c.a[i][i]=1;
    while(y>0)
    {
        if(y&1)
        c=mul(c,a);
        a=mul(a,a);
        y>>=1;
    }
    return c;
}
DATA aad(DATA a,DATA b)
{
    int i,j;DATA c;
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    {
        c.a[i][j]=a.a[i][j]+b.a[i][j];
        c.a[i][j]=c.a[i][j]%m;
    }
    return c;
}
DATA work(DATA a,int j)
{
    DATA bb,cc,dd;int i;
   if(j==1)
        return a;
        cc=work(a,j/2);
        if(j&1)
            {
            dd=mu(a,j/2+1);
            bb=mul(cc,dd);
            dd=aad(dd,bb);
            dd=aad(dd,cc);
            return dd;
            }
       else
       {
         dd=mu(a,j/2);
            bb=mul(cc,dd);
            bb=aad(cc,bb);
            return bb;
       }
}
int main()
{int i,j,t;
    scanf("%d%d%d",&n,&k,&m);
        for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        scanf("%d",&point.a[i][j]);
        point=work(point,k);
        for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {if(j==n-1)
            printf("%d\n",point.a[i][j]%m);
            else
            printf("%d ",point.a[i][j]%m);
            }
return 0;
}

### 二分分类中的混淆矩阵定义及用法 #### 定义 混淆矩阵是一种用于评估分类模型性能的工具,尤其适用于有监督学习中的分类问题。在二分类问题中,混淆矩阵表现为一个 \(2 \times 2\) 的矩阵结构[^1]。其每一行列分别对应实际类别和预测类别,具体如下: | | 预测为正类 (Positive) | 预测为负类 (Negative) | |---------------|-----------------------|-----------------------| | **实际为正类** | True Positive (TP) | False Negative (FN) | | **实际为负类** | False Positive (FP) | True Negative (TN) | - **True Positive (TP)**: 实际为正类且被正确预测为正类的数量。 - **False Negative (FN)**: 实际为正类但被错误预测为负类的数量。 - **False Positive (FP)**: 实际为负类但被错误预测为正类的数量。 - **True Negative (TN)**: 实际为负类且被正确预测为负类的数量。 这种矩阵能够清晰展示分类模型的表现情况,尤其是在处理不平衡数据集时更为重要[^3]。 --- #### 使用方法 混淆矩阵不仅提供了基本的分类统计信息,还可以进一步衍生出多种重要的评估指标,帮助全面理解模型性能。以下是几个常用指标及其计算方式: 1. **准确率 (Accuracy):** 表示总体预测正确的比例。 \[ Accuracy = \frac{TP + TN}{TP + FP + FN + TN} \] 2. **精确率 (Precision):** 衡量模型预测为正类的结果中有多少是真正的正类。 \[ Precision = \frac{TP}{TP + FP} \] 3. **召回率 (Recall/Sensitivity):** 反映模型能识别出多少实际为正类的样本。 \[ Recall = \frac{TP}{TP + FN} \] 4. **F1分数 (F1-Score):** 是精确率和召回率的调和平均值,综合衡量两者平衡程度。 \[ F1\text{-}Score = 2 \cdot \frac{\text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}} \] 5. **特异度 (Specificity):** 描述模型对负类样本的区分能力。 \[ Specificity = \frac{TN}{TN + FP} \] 通过以上指标,可以深入分析模型的优势与不足之处,并针对性优化[^2]。 --- #### 示例代码 以下是一个基于 Python 和 `sklearn` 库实现混淆矩阵并计算相关指标的例子: ```python from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score # 假设的真实标签和预测结果 y_true = [0, 1, 0, 1, 1, 0, 1, 0] y_pred = [0, 1, 1, 1, 0, 0, 1, 0] # 计算混淆矩阵 cm = confusion_matrix(y_true, y_pred) # 输出混淆矩阵 print("Confusion Matrix:") print(cm) # 计算各项指标 accuracy = accuracy_score(y_true, y_pred) precision = precision_score(y_true, y_pred) recall = recall_score(y_true, y_pred) f1 = f1_score(y_true, y_pred) print(f"Accuracy: {accuracy}") print(f"Precision: {precision}") print(f"Recall: {recall}") print(f"F1 Score: {f1}") ``` 运行此代码后,可以获得具体的混淆矩阵以及各类评估指标数值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值