View事件面试总结21问21答。

本文深入探讨了Android中View的坐标参数、滑动机制、事件传递及分发,包括坐标参数的注意要点、onTouchEvent与GestureDetector的区别、Scroller与动画在滑动效果上的应用、滑动冲突解决策略,以及View事件处理机制的详细解析。

1.View的坐标参数 主要有哪些?分别有什么注意的要点?

答:Left,Right,top,Bottom 注意这4个值其实就是 view 和 他的父控件的 相对坐标值。 并非是距离屏幕左上角的绝对值,这点要注意。

  此外,X和Y 其实也是相对于父控件的坐标值。 TranslationX,TranslationY 这2个值 默认都为0,是相对于父控件的左上角的偏移量。

  换算关系:

  x=left+tranX,y=top+tranY.

    很多人不理解,为什么事这样,其实就是View 如果有移动的话,比如平移这种,你们就要注意了,top和left 这种值 是不会变化的。

      无论你把view怎么拖动,但是 x,y,tranX,tranY 的值是随着拖动平移 而变化的。想明白这点 就行了。

 

2.onTouchEvent和GestureDetector 在什么时候用哪个比较好?

答:只有滑动需求的时候 就用前者,如果有双击等这种行为的时候 就用后者。

 

3.Scroller 用来解决什么问题?

答:view的scrollTo和scrollBy 滑动效果太差了,是瞬间完成。而scroller可以配合view的computeScroll 来完成 渐变的滑动效果。体验更好。

 

4.ScrollTo和ScrollBy 有什么需要注意的?

答:前者是绝对滑动,后者是相对滑动。滑动的是view的内容 而不是view本身。这很重要。比如textview 调用这2个方法  滑动的就是显示出来的字的内容。

一般而言 我们用scrollBy会比较多一些。传值的话 其实 记住几个法则就可以了。 右-左 x为正 否则x为负  上-下 y为负,否则y为正。

可以稍微看一下 这2个的源码:

复制代码
 1 public void scrollTo(int x, int y) {
 2         if (mScrollX != x || mScrollY != y) {
 3             int oldX = mScrollX;
 4             int oldY = mScrollY;
 5             mScrollX = x;
 6             mScrollY = y;
 7             invalidateParentCaches();
 8             onScrollChanged(mScrollX, mScrollY, oldX, oldY);
 9             if (!awakenScrollBars()) {
10                 postInvalidateOnAnimation();
11             }
12         }
13     }
14 
15  public void scrollBy(int x, int y) {
16         scrollTo(mScrollX + x, mScrollY + y);
17     }
复制代码

看到里面有2个变量 mScrollX 和mScrollY 这2个东西没,这2个单位的 值是像素,前者代表 view的左边缘和view内容左边缘的距离。 后者代表 view上边缘和view内容上边缘的距离。

 

5.使用动画来实现view的滑动 有什么后果?

答:实际上view动画 是对view的表面ui 也就是给用户呈现出的视觉效果 来做的移动,动画本身并不能移动view的真正位置。属性动画除外。动画播放结束以后,view最终还是会

回到自己的位置的,。当然了你可以设置fillafter 属性 来让动画播放结束以后 view表象停留在 变化以后的位置。所以这会带来一个很严重的后果。比如你的button在屏幕的左边,

你现在用个动画 并且设置了fillafter属性让他去了右边。你会发现 点击右边的button 没有click事件触发,但是点击左边的 却可以触发,原因就是右边的button 只是view的表象,

真正的button 还在左边没有动过。你一定要这么做的话 可以提前在右边button移动后的位置放一个新的button,当你动画执行结束以后  把右边的enable 左边的让他gone就可以了。

这么做就可以规避上述问题。

 

6.让view滑动总共有几种方式,分别要注意什么?都适用于那些场景?

答:总共有三种:

a:scrollto,scrollby。这种是最简单的,但是只能滑动view的内容 不可以滑动view本身。

b:动画。动画可以滑动view内容,但是注意非属性动画 就如我们问题5说的内容 会影响到交互,使用的时候要多注意。不过多数复杂的滑动效果都是属性动画来完成的,属于大杀器级别、

c:改变布局参数。这种最好理解了,无非是动态的通过java代码来修改 margin等view的参数罢了。不过用的比较少。我本人不怎么用这种方法。

 

7.Scroller是干嘛的?原理是什么?

答:Scroller就是用于 让view有滑动渐变效果的。用法如下:

复制代码
 1 package com.example.administrator.motioneventtest;
 2 
 3 import android.content.Context;
 4 import android.util.AttributeSet;
 5 import android.widget.Scroller;
 6 import android.widget.TextView;
 7 
 8 /**
 9  * Created by Administrator on 2016/2/2.
10  */
11 public class CustomTextView extends TextView{
12 
13     private Scroller mScroller;
14 
15 
16     public CustomTextView(Context context) {
17         super(context);
18         mScroller=new Scroller(context);
19     }
20 
21     public CustomTextView(Context context, AttributeSet attrs) {
22         super(context, attrs);
23         mScroller=new Scroller(context);
24 
25     }
26 
27     public CustomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
28         super(context, attrs, defStyleAttr);
29         mScroller=new Scroller(context);
30 
31     }
32 
33     //调用此方法滚动到目标位置
34     public void smoothScrollTo(int fx, int fy) {
35         int dx = fx - mScroller.getFinalX();
36         int dy = fy - mScroller.getFinalY();
37         smoothScrollBy(dx, dy);
38     }
39 
40     //调用此方法设置滚动的相对偏移
41     public void smoothScrollBy(int dx, int dy) {
42 
43         //设置mScroller的滚动偏移量
44         mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy,4000);
45         invalidate();//这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果
46     }
47 
48     //使用scroller最重要不要遗漏这个方法
49     @Override
50     public void computeScroll() {
51         if (mScroller.computeScrollOffset())
52         {
53             scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
54             //这个方法不要忘记调用。
55             postInvalidate();
56         }
57         super.computeScroll();
58     }
59 }
复制代码

其实上述代码 很多人应该都能搜到。我们这里主要讲一下 他的原理。

复制代码
  1 //参数很好理解 前面滑动起始点 中间滑动距离 最后一个是 渐变时间
  2 //而且我们看到startScroll 这个方法就是设置了一下参数 并没有什么滑动的代码在
  3 //回到前面的demo能看到我们通常调用完这个方法以后 都会马上调用invalidate()方法
  4  public void startScroll(int startX, int startY, int dx, int dy, int duration) {
  5         mMode = SCROLL_MODE;
  6         mFinished = false;
  7         mDuration = duration;
  8         mStartTime = AnimationUtils.currentAnimationTimeMillis();
  9         mStartX = startX;
 10         mStartY = startY;
 11         mFinalX = startX + dx;
 12         mFinalY = startY + dy;
 13         mDeltaX = dx;
 14         mDeltaY = dy;
 15         mDurationReciprocal = 1.0f / (float) mDuration;
 16     }
 17 
 18 
 19 //我们都知道invalidate 会触发view的 draw方法 
 20 //我们跟进去看 会发现draw方法里 会调用下面的代码:
 21 //也就是说会调用    computeScroll方法 而view本身这个方法
 22 //是空的所以会留给我们自己实现
 23  int sx = 0;
 24         int sy = 0;
 25         if (!drawingWithRenderNode) {
 26             computeScroll();
 27             sx = mScrollX;
 28             sy = mScrollY;
 29         }
 30 
 31 
 32 //然后回到我们的customtextview 可以看到我们实现的    computeScroll方法如下:
 33 //你看在这个方法里 我们调用了scrollTo方法 来实现滑动,滑动结束以后再次触发view的重绘
 34 //然后又会再次触发computeScroll 实现一个循环。
 35 public void computeScroll() {
 36         if (mScroller.computeScrollOffset())
 37         {
 38             scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
 39             //这个方法不要忘记调用。
 40             postInvalidate();
 41         }
 42         super.computeScroll();
 43     } 
 44 
 45 
 46 //返回true就代表滑动还没结束 false就是结束了
 47 //其实这个方法 就跟属性动画里的插值器一样 你在使用startScroll方法的时候 会传一个事件的值,
 48 //这个方法就是根据这个事件的值来计算你每一次scrollx和scrolly的值
 49 public boolean computeScrollOffset() {
 50         if (mFinished) {
 51             return false;
 52         }
 53 
 54         int timePassed = (int)(AnimationUtils.currentAnimationTimeMillis() - mStartTime);
 55     
 56         if (timePassed < mDuration) {
 57             switch (mMode) {
 58             case SCROLL_MODE:
 59                 final float x = mInterpolator.getInterpolation(timePassed * mDurationReciprocal);
 60                 mCurrX = mStartX + Math.round(x * mDeltaX);
 61                 mCurrY = mStartY + Math.round(x * mDeltaY);
 62                 break;
 63             case FLING_MODE:
 64                 final float t = (float) timePassed / mDuration;
 65                 final int index = (int) (NB_SAMPLES * t);
 66                 float distanceCoef = 1.f;
 67                 float velocityCoef = 0.f;
 68                 if (index < NB_SAMPLES) {
 69                     final float t_inf = (float) index / NB_SAMPLES;
 70                     final float t_sup = (float) (index + 1) / NB_SAMPLES;
 71                     final float d_inf = SPLINE_POSITION[index];
 72                     final float d_sup = SPLINE_POSITION[index + 1];
 73                     velocityCoef = (d_sup - d_inf) / (t_sup - t_inf);
 74                     distanceCoef = d_inf + (t - t_inf) * velocityCoef;
 75                 }
 76 
 77                 mCurrVelocity = velocityCoef * mDistance / mDuration * 1000.0f;
 78                 
 79                 mCurrX = mStartX + Math.round(distanceCoef * (mFinalX - mStartX));
 80                 // Pin to mMinX <= mCurrX <= mMaxX
 81                 mCurrX = Math.min(mCurrX, mMaxX);
 82                 mCurrX = Math.max(mCurrX, mMinX);
 83                 
 84                 mCurrY = mStartY + Math.round(distanceCoef * (mFinalY - mStartY));
 85                 // Pin to mMinY <= mCurrY <= mMaxY
 86                 mCurrY = Math.min(mCurrY, mMaxY);
 87                 mCurrY = Math.max(mCurrY, mMinY);
 88 
 89                 if (mCurrX == mFinalX && mCurrY == mFinalY) {
 90                     mFinished = true;
 91                 }
 92 
 93                 break;
 94             }
 95         }
 96         else {
 97             mCurrX = mFinalX;
 98             mCurrY = mFinalY;
 99             mFinished = true;
100         }
101         return true;
102     }
103     
复制代码

 

8.view的滑动渐变效果总共有几种方法?

答:三种,第一种是scroller 也是使用最多的。问题7里有解释。还有一种就是动画,动画我就不多说了,不属于本文范畴。最后一种也是我们经常使用的就是用handler ,每隔一个时间间隔 来更新view的状态。

代码不写了很简单。 自行体会。

 

9.view的事件传递机制 如何用伪代码来表示?

答:

复制代码
 1 /**
 2      * 对于一个root viewgroup来说,如果接受了一个点击事件,那么首先会调用他的dispatchTouchEvent方法。
 3      * 如果这个viewgroup的onInterceptTouchEvent 返回true,那就代表要拦截这个事件。接下来这个事件就
 4      * 给viewgroup自己处理了,从而viewgroup的onTouchEvent方法就会被调用。如果如果这个viewgroup的onInterceptTouchEvent
 5      * 返回false就代表我不拦截这个事件,然后就把这个事件传递给自己的子元素,然后子元素的dispatchTouchEvent
 6      * 就会被调用,就是这样一个循环直到 事件被处理。
 7      *
 8      */
 9 public boolean dispatchTouchEvent(MotionEvent ev)
10 {
11     boolean consume=false;
12     if (onInterceptTouchEvent(ev)) {
13         consume=onTouchEvent(ev);
14     }else
15     {
16         consume=child.dispatchTouchEvent(ev);
17     }
18     return consume;
19 }
复制代码

 

10.view的onTouchEvent,OnClickListerner和OnTouchListener的onTouch方法 三者优先级如何?

答:onTouchListener优先级最高,如果onTouch方法返回 false ,那onTouchEvent就被调用了,返回true 就不会被调用。至于onClick 优先级最低。

 

11.点击事件的传递顺序如何?

答:Activity-Window-View。从上到下依次传递,当然了如果你最低的那个view onTouchEvent返回false 那就说明他不想处理 那就再往上抛,都不处理的话

最终就还是让Activity自己处理了。举个例子,pm下发一个任务给leader,leader自己不做 给架构师a,小a也不做 给程序员b,b如果做了那就结束了这个任务。

b如果发现自己搞不定,那就找a做,a要是也搞不定 就会不断向上发起请求,最终可能还是pm做。

复制代码
 1  
 2 //activity的dispatchTouchEvent 方法 一开始就是交给window去处理的
 3 //win的superDispatchTouchEvent 返回true 那就直接结束了 这个函数了。返回false就意味
 4 //这事件没人处理,最终还是给activity的onTouchEvent 自己处理 这里的getwindow 其实就是phonewindow
 5  public boolean dispatchTouchEvent(MotionEvent ev) {
 6         if (ev.getAction() == MotionEvent.ACTION_DOWN) {
 7             onUserInteraction();
 8         }
 9         if (getWindow().superDispatchTouchEvent(ev)) {
10             return true;
11         }
12         return onTouchEvent(ev);
13     }
14 
15 
16 //来看phonewindow的这个函数 直接把事件传递给了mDecor
17 
18  @Override
19     public boolean superDispatchTouchEvent(MotionEvent event) {
20         return mDecor.superDispatchTouchEvent(event);
21     }
22 
23 //devorview就是 我们的rootview了 就是那个framelayout 我们的setContentView里面传递的那个layout
24 //就是这个decorview的 子view了
25      @Override
26     public final View getDecorView() {
27         if (mDecor == null) {
28             installDecor();
29         }
30         return mDecor;
31     }
复制代码

 

 

12.事件分为几个步骤?

答:down事件开头,up事件结尾,中间可能会有数目不定的move事件。

 

13.ViewGroup如何对点击事件分发?

答:

复制代码
 1 viewgroup就是在actionMasked == MotionEvent.ACTION_DOWN 和 mFirstTouchTarget != null 这两种情况来判断是否会进入拦截事件的流程
 2 
 3 看代码可以知道 如果是ACTION_DOWN事件  那就肯定进入 是否要拦截事件的流程
 4 
 5 如果不是ACTION_DOWN事件 那就要看mFirstTouchTarget != null 这个条件是否成立
 6 
 7 这个地方有点绕但是也好理解,其实就是 对于一个事件序列来说 down是事件的开头 所以肯定进入了这个事件是否拦截的流程 也就是if 括号内。
 8 
 9 
10 mFirstTouchTarget其实是一个单链表结构他指向的是 成功处理事件的子元素。
11 
12 也就是说 如果有子元素成功处理了 事件,那这个值就不为NULL。反过来说
13 
14 只要viewgroup拦截了事件,mFirstTouchTarget就不为NULL,所以括号内就不会执行,也就侧面说明了一个结论:
15 
16 某个view 一旦决定拦截事件,那么这个事件所属的事件序列 都只能由他来执行。并且onInterceptTouchEvent 这个方法不会被调用了
17 
18             final boolean intercepted;
19             if (actionMasked == MotionEvent.ACTION_DOWN
20                     || mFirstTouchTarget != null) {
21                 final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;
22                 if (!disallowIntercept) {
23                     intercepted = onInterceptTouchEvent(ev);
24                     ev.setAction(action); // restore action in case it was changed
25                 } else {
26                     intercepted = false;
27                 }
28             } else {
29                 // There are no touch targets and this action is not an initial down
30                 // so this view group continues to intercept touches.
31                 intercepted = true;
32             }
复制代码

 

14.如果某个view 处理事件的时候 没有消耗down事件 会有什么结果?

答:假如一个view,在down事件来的时候 他的onTouchEvent返回false, 那么这个down事件 所属的事件序列 就是他后续的move 和up 都不会给他处理了,全部都给他的父view处理。

 

15.如果view 不消耗move或者up事件 会有什么结果?

答:那这个事件所属的事件序列就消失了,父view也不会处理的,最终都给activity 去处理了。

 

16.ViewGroup 默认拦截事件吗?

答:默认不拦截任何事件,onInterceptTouchEvent返回的是false。

 

17.一旦有事件传递给view,view的onTouchEvent一定会被调用吗?

答:是的,因为view 本身没有onInterceptTouchEvent方法,所以只要事件来到view这里 就一定会走onTouchEvent方法。

并且默认都是消耗掉,返回true的。除非这个view是不可点击的,所谓不可点击就是clickable和longgclikable同时为fale

Button的clickable就是true 但是textview是false。

 

18.enable是否影响view的onTouchEvent返回值?

答:不影响,只要clickable和longClickable有一个为真,那么onTouchEvent就返回true。

 

19.requestDisallowInterceptTouchEvent 可以在子元素中干扰父元素的事件分发吗?如果可以,是全部都可以干扰吗?

答:肯定可以,但是down事件干扰不了。

 

20.dispatchTouchEvent每次都会被调用吗?

答:是的,onInterceptTouchEvent则不会。

 

21.滑动冲突问题如何解决 思路是什么?

答。要解决滑动冲突 其实最主要的就是有一个核心思想。你到底想在一个事件序列中,让哪个view 来响应你的滑动?比如 从上到下滑,是哪个view来处理这个事件,从左到右呢?

用业务需求 来想明白以后 剩下的 其实就很好做了。核心的方法 就是2个 外部拦截也就是父亲拦截,另外就是内部拦截,也就是子view拦截法。 学会这2种 基本上所有的滑动冲突

都是这2种的变种,而且核心代码思想都一样。

外部拦截法:思路就是重写父容器的onInterceptTouchEvent即可。子元素一般不需要管。可以很容易理解,因为这和android自身的事件处理机制 逻辑是一模一样的

复制代码
 1  @Override
 2     public boolean onInterceptTouchEvent(MotionEvent ev) {
 3 
 4         boolean intercepted = false;
 5         int x = (int) ev.getX();
 6         int y = (int) ev.getY();
 7 
 8         switch (ev.getAction()) {
 9             //down事件肯定不能拦截 拦截了后面的就收不到了
10             case MotionEvent.ACTION_DOWN:
11                 intercepted = false;
12                 break;
13             case MotionEvent.ACTION_MOVE:
14                 if (你的业务需求) {
15                     //如果确定拦截了 就去自己的onTouchEvent里 处理拦截之后的操作和效果 即可了
16                     intercepted = true;
17                 } else {
18                     intercepted = false;
19                 }
20                 break;
21             case MotionEvent.ACTION_UP:
22                 //up事件 我们一般都是返回false的 一般父容器都不会拦截他。 因为up是事件的最后一步。这里返回true也没啥意义
23                 //唯一的意义就是因为 父元素 up被拦截。导致子元素 收不到up事件,那子元素 就肯定没有onClick事件触发了,这里的
24                 //小细节 要想明白
25                 intercepted = false;
26                 break;
27             default:
28                 break;
29         }
30         return intercepted;
31     }
复制代码

内部拦截法:内部拦截法稍微复杂一点,就是事件到来的时候,父容器不管,让子元素自己来决定是否处理。如果消耗了 就最好,没消耗 自然就转给父容器处理了。

子元素代码:

复制代码
 1  @Override
 2     public boolean dispatchTouchEvent(MotionEvent event) {
 3         int x = (int) event.getX();
 4         int y = (int) event.getY();
 5         switch (event.getAction()) {
 6             case MotionEvent.ACTION_DOWN:
 7                 getParent().requestDisallowInterceptTouchEvent(true);
 8                 break;
 9             case MotionEvent.ACTION_MOVE:
10                 if (如果父容器需要这个点击事件) {
11                     getParent().requestDisallowInterceptTouchEvent(false);
12                 }//否则的话 就交给自己本身view的onTouchEvent自动处理了
13                 break;
14             case MotionEvent.ACTION_UP:
15                 break;
16             default:
17                 break;
18         }
19         return super.dispatchTouchEvent(event);
20     }
复制代码

父亲容器代码也要修改一下,其实就是保证父亲别拦截down:

复制代码
1  @Override
2     public boolean onInterceptTouchEvent(MotionEvent ev) {
3 
4         if (ev.getAction() == MotionEvent.ACTION_DOWN) {
5             return false;
6 
7         }
8         return true;
9     }
复制代码
标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之一,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 一、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是一种常用于分类任务的线性模型,特别适用于二类题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是一种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单一模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值