检测点13

13 篇文章 4 订阅 ¥29.90 ¥99.00

assume cs:code

code segment
start:  
 mov ax,cs
 mov ds,ax
 mov si,offset do7
 mov ax,0
 mov es,ax
 mov di,200h

 mov cx,offset do7end-offset do7
 cld
 rep movsb
 
 mov ax,0
 mov es,ax
 mov word ptr es:[4*7ch],200h
 mov word ptr es:[4*7ch+2],0

 mov ax,4c00h
 int 21h


do7:  push bp

 mov bp,sp
 add [bp+2],bx

 pop bp
 
 iret
do7end:nop

code ends
end start

 

1-a

assume cs:code

data segment
 db 'conversation',0
data ends

code segment
start: mov ax,data
 mov ds,ax
 mov si,0
 mov ax,0b800h
 mov es,ax 
 mov di,12*160+38*2
 
s: cmp byte ptr [si],0
 je ok
 mov al,[si]
 mov es:[di],al
 inc si
 add di,2
 mov bx,offset s-offset ok
 int 7ch
ok: mov ax,4c00h
 int 21h

code ends
end start

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
聚类是一种常用于数据分析和挖掘的技术,它可以将数据集中相似的数据点归为一类。离群点检测是在数据集中寻找与其他数据点不同的数据点的过程,因此可以使用聚类技术来实现离群点检测。 以下是一个基于聚类的离群点检测的C++代码示例: ```c++ #include <iostream> #include <vector> #include <algorithm> #include <cmath> using namespace std; // 计算两个向量之间的欧几里得距离 double euclideanDistance(const vector<double>& v1, const vector<double>& v2) { double sum = 0; for (int i = 0; i < v1.size(); i++) { sum += pow(v1[i] - v2[i], 2); } return sqrt(sum); } // 计算数据集中所有数据点的中心点 vector<double> computeCentroid(const vector<vector<double>>& dataset) { int n = dataset[0].size(); vector<double> centroid(n, 0); for (const auto& vec : dataset) { for (int i = 0; i < n; i++) { centroid[i] += vec[i]; } } for (int i = 0; i < n; i++) { centroid[i] /= dataset.size(); } return centroid; } // 计算数据集中距离中心点最远的数据点 int findFurthestPoint(const vector<vector<double>>& dataset, const vector<double>& centroid) { double maxDistance = -1; int index = -1; for (int i = 0; i < dataset.size(); i++) { double distance = euclideanDistance(dataset[i], centroid); if (distance > maxDistance) { maxDistance = distance; index = i; } } return index; } // 对数据集进行聚类,返回每个数据点所属的类别 vector<int> kmeans(const vector<vector<double>>& dataset, int k) { // 随机选择k个数据点作为初始聚类中心 vector<int> centers(k, -1); for (int i = 0; i < k; i++) { int index = rand() % dataset.size(); while (find(centers.begin(), centers.end(), index) != centers.end()) { index = rand() % dataset.size(); } centers[i] = index; } vector<int> labels(dataset.size(), -1); while (true) { // 分配每个数据点到最近的聚类中心 bool changed = false; for (int i = 0; i < dataset.size(); i++) { double minDistance = INFINITY; int minIndex = -1; for (int j = 0; j < k; j++) { double distance = euclideanDistance(dataset[i], dataset[centers[j]]); if (distance < minDistance) { minDistance = distance; minIndex = j; } } if (labels[i] != minIndex) { labels[i] = minIndex; changed = true; } } // 如果没有数据点的标签发生变化,则聚类结束 if (!changed) { break; } // 更新聚类中心 for (int j = 0; j < k; j++) { vector<vector<double>> cluster; for (int i = 0; i < dataset.size(); i++) { if (labels[i] == j) { cluster.push_back(dataset[i]); } } if (cluster.empty()) { continue; } centers[j] = findFurthestPoint(cluster, computeCentroid(cluster)); } } return labels; } // 计算数据集中每个数据点到最近的聚类中心的距离的平均值 double computeAverageDistance(const vector<vector<double>>& dataset, const vector<int>& labels) { double sum = 0; for (int i = 0; i < dataset.size(); i++) { double minDistance = INFINITY; for (int j = 0; j < labels.size(); j++) { if (labels[j] == labels[i]) { continue; } double distance = euclideanDistance(dataset[i], dataset[j]); if (distance < minDistance) { minDistance = distance; } } sum += minDistance; } return sum / dataset.size(); } // 检测离群点,返回离群点的下标 vector<int> detectOutliers(const vector<vector<double>>& dataset, int k) { vector<int> labels = kmeans(dataset, k); double avgDistance = computeAverageDistance(dataset, labels); vector<int> outliers; for (int i = 0; i < dataset.size(); i++) { double minDistance = INFINITY; for (int j = 0; j < labels.size(); j++) { if (labels[j] == labels[i]) { continue; } double distance = euclideanDistance(dataset[i], dataset[j]); if (distance < minDistance) { minDistance = distance; } } if (minDistance > avgDistance) { outliers.push_back(i); } } return outliers; } int main() { // 生成测试数据集 vector<vector<double>> dataset = { {1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {100, 200}, {300, 400}, {500, 600}, {700, 800}, }; // 检测离群点 vector<int> outliers = detectOutliers(dataset, 3); // 输出离群点的下标 cout << "Outliers:" << endl; for (int i = 0; i < outliers.size(); i++) { cout << outliers[i] << " "; } cout << endl; return 0; } ``` 在上面的示例代码中,我们使用了KMeans算法对数据集进行聚类,然后计算每个数据点到最近的聚类中心的距离的平均值,将距离大于平均值的数据点作为离群点输出。你可以根据自己的需要调整参数,例如KMeans算法的聚类数k、离群点的距离阈值等,来得到更符合需求的结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dujiahei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值