numpy里面的mean(x==y),python

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了numpy里面的mean(x==y),python相关的知识,希望对你有一定的参考价值。

train_accuracy = np.mean(y_train == y_train_pred)
源代码如上所示,我想问这个==是取对应相等的地方之后再做均值嘛?还是我根本就理解错了,这行代码到底是什么意思啊?为什么可以这么用为什么百度不到。。。。

参考技术A 这段代码:是计算自己训练出来的模型的准确率的
那就是看实际的和预测的是不是相等(用==判断),本回答被提问者采纳
参考技术B y=±x中,y和x是函数关系
y=x的绝对值,y和x不是函数关系
参考技术C mean是求平均值的意思,y_train == y_train_pred意思就是判断训练的值和预测的值是否相同,相等返回1,将相等的全部加起来/总训练数,就是训练集的准确率了,mean这里就是统计相等的做除法算出准确率的作用。所以 np.mean(y_train == y_train_pred)就是算训练集准确率的意思,如果改成np.mean(y_test == y_test_pred)就是算测试集的准确率,一般训练集和测试集准确率都要算,这样可以看出是否出现,训练集准确率很高,而测试集准确率却比较低,那么就会出现过拟合,我们需要两个都比较高

使用带有纹理分析和 (x,y) 坐标的 K-means 进行图像分割

【中文标题】使用带有纹理分析和 (x,y) 坐标的 K-means 进行图像分割【英文标题】:Image segmentation using K-means with texture analysis and (x,y)-coordinates 【发布时间】:2019-09-17 05:39:17 【问题描述】:

我正在尝试基于 MathWorks 的示例在 Python 中使用 K-means 实现颜色/图像分割:

https://nl.mathworks.com/help/images/ref/imsegkmeans.html

使用 (R,G,B) 值作为特征集,我得到以下结果:

但是,如果我们将纹理信息(使用 Gabor 过滤器)和像素位置信息 (x,y) 添加到特征集中,这可以得到改善。

结果:

对于这个结果,我没有使用 (R,G,B) 值,因为狗的颜色与瓷砖大致相同。我使用的是灰度图像,24 个 Gabor 过滤器扩展了像素坐标。

很遗憾,结果不如 Mathworks 中的这些:

目标是使用颜色/纹理分割将背景与对象分开。

您有改进的想法吗?非常感谢!

# Based on https://www.mathworks.com/help/images/ref/imsegkmeans.html

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

from sklearn.cluster import KMeans
from sklearn import preprocessing

# Building some gabor kernels to filter image
orientations = [0.0, np.pi / 2, np.pi, 3 * np.pi / 2]
wavelengths = [3, 6, 12, 24, 48, 96]

def build_gabor_kernels():
    filters = []
    ksize = 40
    for rotation in orientations:
        for wavelength in wavelengths:
            kernel = cv.getGaborKernel((ksize, ksize), 4.25, rotation, wavelength, 0.5, 0, ktype=cv.CV_32F)
            filters.append(kernel)

    return filters

image = cv.imread('./kobi.png')
rows, cols, channels = image.shape

# Resizing the image. 
# Full image is taking to much time to process
image = cv.resize(image, (int(cols * 0.5), int(rows * 0.5)))
rows, cols, channels = image.shape

gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

gaborKernels = build_gabor_kernels()

gaborFilters = []

for (i, kernel) in enumerate(gaborKernels):
    filteredImage = cv.filter2D(gray, cv.CV_8UC1, kernel)

    # Blurring the image
    sigma = int(3*0.5*wavelengths[i % len(wavelengths)])

    # Sigma needs to be odd
    if sigma % 2 == 0:
        sigma = sigma + 1

    blurredImage = cv.GaussianBlur(filteredImage,(int(sigma),int(sigma)),0)
    gaborFilters.append(blurredImage)


# numberOfFeatures = 1 (gray color) + number of gabor filters + 2 (x and y)
numberOfFeatures = 1  + len(gaborKernels) + 2

# Empty array that will contain all feature vectors
featureVectors = []

for i in range(0, rows, 1):
    for j in range(0, cols, 1):
        vector = [gray[i][j]]

        for k in range(0, len(gaborKernels)):
            vector.append(gaborFilters[k][i][j])

        vector.extend([i+1, j+1])

        featureVectors.append(vector)

# Some example results:
# featureVectors[0] = [164, 3, 10, 255, 249, 253, 249, 2, 43, 255, 249, 253, 249, 3, 10, 255, 249, 253, 249, 2, 43, 255, 249, 253, 249, 1, 1]
# featureVectors[1] = [163, 3, 17, 255, 249, 253, 249, 2, 43, 255, 249, 253, 249, 3, 17, 255, 249, 253, 249, 2, 43, 255, 249, 253, 249, 1, 2]

# Normalizing the feature vectors
scaler = preprocessing.StandardScaler()

scaler.fit(featureVectors)
featureVectors = scaler.transform(featureVectors)

kmeans = KMeans(n_clusters=2, random_state=170)
kmeans.fit(featureVectors)

centers = kmeans.cluster_centers_
labels = kmeans.labels_

result = centers[labels]

# Only keep first 3 columns to make it easy to plot as an RGB image
result = np.delete(result, range(3, numberOfFeatures), 1)

plt.figure(figsize = (15,8))
plt.imsave('test.jpg', result.reshape(rows, cols, 3) * 100)

【问题讨论】:

嗨,克里斯,不完全是。我正在尝试在没有 Matlab 函数的情况下在 Python 中实现 Matlab 示例,而是使用 OpenCV。他们的示例运行正常。 在评论之前我没有注意标签或您的代码。 :// 【参考方案1】:

Mathworks 上的方法包含一些临时步骤。有更好的算法可以解决这个问题。首先,Gabor 滤波器响应本身并不能给出在同一纹理区域上一致的特征。更好的方法是添加另一个步骤——计算滤波器响应上的局部直方图。使用多个过滤器并将直方图连接在一起。通过选择适当的过滤器,这些特征可以区分各种纹理外观并在同一纹理区域上保持一致。它被称为光谱直方图。

为了捕捉有意义的纹理外观,需要从相对较大的局部窗口计算局部直方图。但是当本地窗口跨越区域边界时,这些特征是不可靠的。应用具有此类特征的简单分组方法(如 k-means)会导致区域边界附近的不良结果。这个approach 给出了一个简单有效的解决方案。它使用局部光谱直方图作为特征,并使用矩阵分解来获得片段标签,其中边界可以很好地定位。它主要使用矩阵运算,因此速度很快。 matlab 和 python 代码都可用。

【讨论】:

以上是关于numpy里面的mean(x==y),python的主要内容,如果未能解决你的问题,请参考以下文章

What does axis/axes mean in Numpy

如何使用 Numpy 与原始 Python 计算 0≤y≤10 和 20000 点的 sin(x) 之间的执行时间差异? [复制]

使用带有纹理分析和 (x,y) 坐标的 K-means 进行图像分割

Python去除异常数据——利用numpy求箱线图特征值

Python - 尝试使用numpy.mean时“无法使用灵活类型执行reduce”

python3.6怎么安装numpy库