【问题标题】:Get diagonal squares coordinates in numpy distance symmetric matrix在numpy距离对称矩阵中获取对角正方形坐标
【发布时间】:2020-11-15 02:15:42
【问题描述】:

如何获取对角线上的大矩形的坐标。

例如黄色 [0,615]、[615,1438]、[1438,1526]

import numpy as np; 
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity

df = pd.DataFrame(array) # array is image numpy
df.shape #(1526, 360)
s = cosine_similarity(df) #(1526, 1526)
plt.matshow(s)

我尝试在第一行获取峰值,但有噪声信息

speak = 1-s[0]

peaks, _ = find_peaks(speak, distance=160, height=0.1)
print(peaks, len(peaks))
np.diff(peaks)

plt.plot(speak)
plt.plot(peaks, speak[peaks], "x")
plt.show()

更新,添加另一个例子 并上传到colab完整脚本https://colab.research.google.com/drive/1hyDIDs-QjLjD2mVIX4nNOXOcvCZY4O2c?usp=sharing

【问题讨论】:

  • s的形状是什么?
  • @RahulVishwakarma (1526,1526)
  • 提供一个 s 样本来处理。或提供代码来生成它
  • @RahulVishwakarma 将数据帧上传到 csv dropmefiles.com/CxWey

标签: python pandas numpy cosine-similarity distance-matrix


【解决方案1】:

使用DBSCAN 聚类解决(在同一问题中找到DBSCAN for clustering of geographic location data

from sklearn.cluster import DBSCAN

clustering = DBSCAN(eps=.5, min_samples=10).fit_predict(s)

peaks = np.where(clustering[:-1] != clustering[1:])[0]

【讨论】:

    【解决方案2】:

    cosine_similarity 的所有对角元素都是相同的。所以你应该寻找附近值的变化。

    你可以试试这个:

    factor = 1.01
    look_nearby = 1
    
    changes = []
    for i in range(look_nearby, s.shape[0]-look_nearby):
        if s[i, i+look_nearby] > factor*s[i, i-look_nearby] or factor*s[i, i+look_nearby] < s[i, i-look_nearby]:
            changes.append(i)
            
    print(changes)
    

    根据您的偏好设置factor 值(因为您不希望在第一张图像的输出中出现 (1200, 1200))并根据 s 的值。

    【讨论】:

    • [607, 608, 612, 613, 614, 615, 616, 617, 618, 1380, 1381, 1382, 1383, 1385, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437, 1440, 1441, 1442, 1443, 1444, 1445, 1447, 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1473, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, 1488.......1519, 1520, 1521, 1522, 1524] 非常感谢,但也许我不能正确地提出问题......我需要大的间隔,尽可能明亮而不是全部
    • 是的,要获得较大的间隔,您应该更改因子值,尝试将其增加到 2 或 1.5 或其他值,或者将其减少到 0.5 或其他。如果没有看到 s 的实际数据,我无法判断因子值
    • 上传到colad完整示例colab.research.google.com/drive/…
    • 此 Colab 笔记本运行良好,请问错误是什么?您期望图像的输出是什么
    • Colab link 我已经添加了,您如何使用答案中给出的代码来获取各种因子值。既然我不明白,你想用那个做什么或者你想要什么输出(提供一些适当的范围,这个矩形很大而这个很小),我帮不上什么忙。
    【解决方案3】:

    使用np.diag(df) 获取对角元素列表。如果屏幕截图中的颜色代表低于/高于某个值(可能为零),请检查值何时超过阈值。

    【讨论】:

    • 需要 's = cosine_similarity(df)' 的对角线,那么结果总会有等于 1 的值
    • 然后循环遍历np.diag(s)。没有你的价值观,我不知道你情节中的颜色是什么意思。
    • @Aramkus 是的,你是对的,但是在距离矩阵上,对角线值总是对应于元素本身,那里没有有用的信息。有必要准确地查看位于对角线上的大正方形的面积。我将数据框上传到 csv dropmefiles.com/CxWey
    • 如果 matplotlib 将这些区域绘制成相同的颜色,则它们中的值非常相似,因此对角线应该包含所有信息。您可以尝试找到对角线数组与自身滚动平均值相交的点。在这些地方,s 中的值会迅速变化。
    • @Aramkus 我只举了一个例子,颜色并不重要,正方形可以不同......我正在寻找一种算法,可能是分类或聚类之类的算法
    猜你喜欢
    • 1970-01-01
    • 2021-12-12
    • 2017-02-20
    • 2013-06-20
    • 2022-09-23
    • 1970-01-01
    • 2020-02-21
    • 2017-01-07
    • 1970-01-01
    相关资源
    最近更新 更多