<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[啊哦的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/ETF6996</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ETF6996]]></copyright><item><title><![CDATA[sklearn-鸢尾花分类]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/115957558</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/115957558</guid><author>ETF6996</author><pubDate>Wed, 21 Apr 2021 15:56:38 +0800</pubDate><description><![CDATA[1、获取数据
# 1.获取数据
iris = datasets.load_iris()
x = iris.data
y = iris.target
print(x)
print(y)

鸢尾花数据共150个，每个样本有4个特征如下：

其标签有3种类型，分别是0，1，2：

2、数据预处理

特征缩放：我们可以观察到X的值之间相差比较大，为了能够得到更好的分类效果，我们采用特征缩放对数据进行处理。这里用到的是MinMaxScaler。还有其他特征缩放方法参见：其他特征缩放方法

# 2.数据预处理(特征缩放]]></description><category></category></item><item><title><![CDATA[动态规划：回文串系列]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/114522445</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/114522445</guid><author>ETF6996</author><pubDate>Mon, 08 Mar 2021 11:04:44 +0800</pubDate><description><![CDATA[1、最长回文子串


寻找回文串的问题核心思想是：从中间开始向两边扩散来判断回文串

for 0 &lt;= i &lt; len(s):
   	找到以 s[i] 为中心的回文串；（奇数）
    找到以 s[i] 和 s[i+1] 为中心的回文串 （偶数）
    更新答案

class Solution {
    public String longestPalindrome(String s) {
        String result="";
        for(int i=0;i&lt]]></description><category></category></item><item><title><![CDATA[动态规划：KMP字符串匹配]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/114487278</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/114487278</guid><author>ETF6996</author><pubDate>Sun, 07 Mar 2021 16:05:52 +0800</pubDate><description><![CDATA[public class KMP{
    private int[][] dp;
    private String pat;

    public KMP(String pat){
        this.pat = pat;
        int M = pat.length();
        dp = new int[M][256];           // dp[状态][遇到的字符] = 下个状态
        dp[0][pat.charAt(0)] = 1;       //.]]></description><category></category></item><item><title><![CDATA[动态规划：打家劫舍系列问题]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/114385948</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/114385948</guid><author>ETF6996</author><pubDate>Fri, 05 Mar 2021 11:42:48 +0800</pubDate><description><![CDATA[1、数组类型


你面前房子的索引就是状态，抢和不抢就是选择。


public int rob(int[] nums) {
        int n = nums.length;
        int[] dp = new int[n+2]; //dp[i]表示从i到最后一个房子最多能盗取的金额
        for(int i=n-1;i&gt;=0;i--){
            dp[i] = Math.max(dp[i+1], nums[i]+dp[i+2]);
        }
  ]]></description><category></category></item><item><title><![CDATA[动态规划：四键键盘]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/114312247</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/114312247</guid><author>ETF6996</author><pubDate>Wed, 03 Mar 2021 14:33:07 +0800</pubDate><description><![CDATA[对于「按 A 键」这种情况，就是状态 i - 1 的屏幕上新增了一个 A 而已，很容易得到结果：
dp[i] = dp[i - 1] + 1; // 按 A 键，就比上次多一个 A 而已
但是，如果要按 C-V，还要考虑之前是在哪里 C-A C-C 的。
刚才说了，最优的操作序列一定是 C-A C-C 接着若干 C-V，所以我们用一个变量 j 作为若干 C-V
的起点（应该看作C-C的位置）。那么 j - 1 、j 操作就应该是 C-A C-C 了：

public int maxA(int N) {...]]></description><category></category></item><item><title><![CDATA[动态规划：博弈问题之石子游戏]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/114279817</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/114279817</guid><author>ETF6996</author><pubDate>Tue, 02 Mar 2021 11:10:18 +0800</pubDate><description><![CDATA[方法一：数学法
先手可以控制自己拿所有下标为奇数的石堆或者拿所有下标为偶数的石堆，只要先计算一下奇数石堆的石子总数和偶数石堆的石子总数哪种多就选哪种，所以先手总会赢
return true；

方法二：动态规划
假设先手和后手都最聪明的情况下，返回先手和后手拿到的石头个数之差

dp数组定义：dp[i][j][0]从下标i到j堆石头，先手能获得的最大数量；dp[i][j][1]表示后手


public boolean stoneGame(int[] piles) {
        int n = pi.]]></description><category></category></item><item><title><![CDATA[动态规划：戳气球]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/114119326</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/114119326</guid><author>ETF6996</author><pubDate>Fri, 26 Feb 2021 11:08:38 +0800</pubDate><description><![CDATA[1、题目说可以认为nums[-1] = nums[n] = 1，那么我们先直接把这两个边界加进去，形成一个新的数组points
2、dp[i][j] = x表示，戳破气球i和气球j之间（开区间，不包括i和j）的所有气球，可以获得的最高分数为x。
3、我们需要「反向思考」，想一想气球i和气球j之间最后一个被戳破的气球可能是哪一个？
4、其实气球i和气球j之间的所有气球都可能是最后被戳破的那一个，不防假设为k。回顾动态规划的套路，这里其实已经找到了「状态」和「选择」：i和j就是两个「状态」，最后戳破的那个气..]]></description><category></category></item><item><title><![CDATA[动态规划：高楼扔鸡蛋]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/114023330</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/114023330</guid><author>ETF6996</author><pubDate>Wed, 24 Feb 2021 15:32:03 +0800</pubDate><description><![CDATA[方法一：常规动态规划

1、dp[i][j]数组定义：dp[i][j]表示鸡蛋数量为i，可选楼层数为j的状态下确定F的最少步数，问题所求为dp[K][N]
2、base case：当楼层数为0，步数为0；当楼层数为1，步数为1；当鸡蛋数为0，步数为0；当鸡蛋数为1，步数为楼层数
3、求状态(i,j)的情况下最少的步数，可选楼层数为j，则遍历1到j的所有楼层，开始扔鸡蛋
4、当前在h楼扔鸡蛋，步数首先加1，然后分别求鸡蛋破或者没破的最大步数值，作为当前楼扔的值，再求所有楼层扔的最小值
5、时间复杂度O(KN.]]></description><category></category></item><item><title><![CDATA[动态规划：正则表达式匹配]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/113986245</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/113986245</guid><author>ETF6996</author><pubDate>Tue, 23 Feb 2021 14:07:24 +0800</pubDate><description><![CDATA[public boolean isMatch(String s, String p) {
        int m = s.length();
        int n = p.length();
        boolean[][] dp = new boolean[m + 1][n + 1];
        dp[0][0] = true;
        for(int i = 0; i &lt;= m; i++){
            for(int j = 1; j &lt;= n..]]></description><category></category></item><item><title><![CDATA[贪心算法：跳跃游戏]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/113930527</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/113930527</guid><author>ETF6996</author><pubDate>Mon, 22 Feb 2021 10:24:47 +0800</pubDate><description><![CDATA[1、能否跳到最后


2、用最少的跳跃次数



i和end标记了可以选择的跳跃步数，farthest标记了所有可选择跳跃步数[i..end]中能够跳到的最远距离，jumps记录了跳跃次数。



]]></description><category></category></item><item><title><![CDATA[贪心算法：区间调度]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/113929871</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/113929871</guid><author>ETF6996</author><pubDate>Mon, 22 Feb 2021 10:16:19 +0800</pubDate><description><![CDATA[首先对所有区间按照结束end时间先后进行排序



从排序后的第一个区间开始遍历，把第一个区间结束的时间end作为标准，若第二个区间与第一个区间相交，则删除；若不相交，则将第二个区间的结束时间更新为end作为新的标准；



public int OverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals,(a,b)-&gt;a[1]-b[1]);
        int count = 1;
        int end =..]]></description><category></category></item><item><title><![CDATA[动态规划：背包问题]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/113929261</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/113929261</guid><author>ETF6996</author><pubDate>Mon, 22 Feb 2021 09:57:29 +0800</pubDate><description><![CDATA[0-1背包问题 和 完全背包问题 的区别在于：

前者每个物品的个数是有限的；后者每个物品的个数是无限的。
也就是为什么当选择将当前物品放进背包时，完全背包是dp[i][…]而不是dp[i-1][…]

动态规划框架：

0-1背包模板：

完全背包模板：
for(int i=1;i&lt;=n;i++){
            for(int j=1;j&lt;=amount;j++){
                if(j&lt;coins[i-1]){
                    d]]></description><category></category></item><item><title><![CDATA[动态规划——最小编辑距离]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/113664693</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/113664693</guid><author>ETF6996</author><pubDate>Thu, 04 Feb 2021 21:30:50 +0800</pubDate><description><![CDATA[解决两个字符串的动态规划问题，一般都是用两个指针i,j分别指向两个字符串的最后，然后一步步往前走，缩小问题的规模。
base case 是i走完s1或j走完s2，可以直接返回另一个字符串剩下的长度。
对于每对字符s1[i]和s2[j]，可以有四种操作：

这个「三选一」到底该怎么选择呢？很简单，全试一遍，哪个操作最后得到的编辑距离最小，就选谁。这里需要递归技巧，理解需要点技巧，先看下代码：递归版本


def dp(i, j) -&gt; int
返回 s1[0..i] 和 s2[0..j] 的最小编...]]></description><category></category></item><item><title><![CDATA[动态规划：股票买卖系列问题]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/113385499</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/113385499</guid><author>ETF6996</author><pubDate>Fri, 29 Jan 2021 14:50:19 +0800</pubDate><description><![CDATA[leetcode买卖股票的最佳时机系列共6题：
买卖股票的最佳时机：只能交易一次
买卖股票的最佳时机Ⅱ：可交易无限次
买卖股票的最佳时机Ⅲ：最多交易2次
买卖股票的最佳时机Ⅳ：最多交易k次
含冷冻期：卖掉之后隔一天才能买
含手续费：买入时交手续费
状态转移图如下：

dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1] + prices[i])
              max(   选择 rest  ,             选择 sell      )
解释：]]></description><category></category></item><item><title><![CDATA[二分搜索]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/112219642</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/112219642</guid><author>ETF6996</author><pubDate>Tue, 05 Jan 2021 11:21:05 +0800</pubDate><description><![CDATA[假设数组非递减
1.常规二分搜索
因为我们初始化 right = nums.length - 1
所以决定了我们的「搜索区间」是 [left, right]
所以决定了 while (left &lt;= right)
同时也决定了 left = mid+1 和 right = mid-1

因为我们只需找到一个 target 的索引即可
所以当 nums[mid] == target 时可以立即返回


int binary_search(int[] nums, int target) {
    int]]></description><category></category></item><item><title><![CDATA[颅内血管分割随笔]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/107913429</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/107913429</guid><author>ETF6996</author><pubDate>Mon, 10 Aug 2020 15:44:36 +0800</pubDate><description><![CDATA[这次分割的颅内血管数据是nii格式的三维数据，由于只有20套，所以打算切片再用简单的unet分割。途中遇到很多问题，简单记录一下~
数据处理
nii格式的文件读取专用库之一：
import nibabel as nib
img = nib.load(filename).get_fdata()

这样就能获取nii文件的三维数据内容了。但是获取到的三维数组内容是0-3000多的CT值，如果保存为png图片则要转换成0-255的uint8格式的数据则需要进行加窗。当选取窗位900，窗宽1200时比较适合。因此所]]></description><category></category></item><item><title><![CDATA[R2Unet实现眼底图像血管分割]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/106420404</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/106420404</guid><author>ETF6996</author><pubDate>Fri, 29 May 2020 10:42:04 +0800</pubDate><description><![CDATA[论文标题：Recurrent Residual Convolutional Neural Network based on U-Net (R2U-Net) for Medical Image Segmentation
R2Unet结构


Residual +Recurrent  block：


Recurrent


实现
在之前的项目中Unet实现眼底图像血管分割修改相应模型结构代码即可
结果








...]]></description><category></category></item><item><title><![CDATA[论文阅读笔记：A Three-Stage Deep Learning Model for Accurate Retinal Vessel Segmentation]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/103344421</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/103344421</guid><author>ETF6996</author><pubDate>Mon, 02 Dec 2019 10:40:41 +0800</pubDate><description><![CDATA[A Three-Stage Deep Learning Model for Accurate Retinal Vessel Segmentation
摘要
视网膜血管自动分割是眼相关疾病诊断的基础步骤，其中厚血管和薄血管都是症状检测的重要特征。所有现有的深度学习模型都试图使用统一的像素损失来同时分割这两种类型的血管，所有的血管像素都同等重要。由于粗血管与细血管比例高度不平衡(即大部分血管像素属于粗...]]></description><category></category></item><item><title><![CDATA[论文阅读笔记：LADDERNET: MULTI-PATH NETWORKS BASED ON U-NET FOR MEDICAL IMAGE SEGMENTATION]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/102950924</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/102950924</guid><author>ETF6996</author><pubDate>Thu, 07 Nov 2019 11:20:32 +0800</pubDate><description><![CDATA[LadderNet
摘要
U-Net已经在许多医学图像分割问题上提供了最先进的性能。对U-Net提出了许多修改，如attention U-Net、residual convolutional U-Net (R2-UNet)和带有剩余块或密集连接块的U-Net。然而，所有这些修改都具有带有跳过连接的编码器和解码器结构，并且信息流的路径数量有限。在本文中，我们提出一个梯子网，它可以被看作是一个多u形网...]]></description><category></category></item><item><title><![CDATA[对眼底图像血管分割结果求Dice系数]]></title><link>https://blog.youkuaiyun.com/ETF6996/article/details/102917957</link><guid>https://blog.youkuaiyun.com/ETF6996/article/details/102917957</guid><author>ETF6996</author><pubDate>Tue, 05 Nov 2019 16:07:59 +0800</pubDate><description><![CDATA[首先将预测的图片转换为二值图如下：to_binary.py

import cv2
import os
import numpy as np

if __name__ == '__main__':
    path = 'xxx/'
    imgdir = os.listdir(path)

    for v in imgdir:
        img = cv2.imread(path ...]]></description><category></category></item></channel></rss>